交互题

一棵树,一开始只有 1 号点是已知的,其他的都是未知的,你可以调用函数 explore(x,y) ,其中 x 必须是已知的,函数会找到 x 到 y 路径上第二个点,并把它标成已知,求最小步数使整棵树都已知

对于 30% 的数据,是一条链,操作次数 $O(n+logn)$

剩下的数据,操作次数 $O(nlogn)$

$n \leq 300000$

sol:

先吐槽 loj 的交互题评测机制

把 ac 时应该输出的东西输出,然后就 a 了

不 shing 话

链的情况想了半天,题解是 xjb 暴力,服

因为这个 explore 的性质,当前已知的一定是一条线段

维护一下当前已知的左端点和右端点,每次随机一个未知的点蹦过去,如果走错方向了就换个方向走

这样出错次数期望 log ? 不知道

树的情况很好想

首先想到一个很朴素的暴力,对于每个点,从根 explore 下去

然后会发现自己多 explore 了很多已知的点,当需要 explore 一个点的时候你只需要跳到他那个子树上,从那个点开始 explore 就可以了

现在就是要维护一棵树滋磁

1.加入一个点

2.快速跳到一个点

动态点分治/LCT 都可以

但谁都知道 LCT 好写吧...于是果断 LCT

每次操作后 access 保证复杂度即可

至于为什么 access?道理相当于 splay 每次把查询点旋到根保证复杂度?

什么?uoj 有 hack 数据?random_shuffle 一下就可以了

跑到了 rk#3 应该是比较欧的原因

因为之后再也跑不了那么快了

#include <bits/stdc++.h>
#include "rts.h"
#define LL long long
#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
using namespace std;
inline int read() {
int x = , f = ; char ch;
for (ch = getchar(); !isdigit(ch); ch = getchar()) if (ch == '-') f = -f;
for (; isdigit(ch); ch = getchar()) x = * x + ch - '';
return x * f;
}
const int maxn = ;
#define ls ch[x][0]
#define rs ch[x][1]
int vis[maxn], pid[maxn];
int fa[maxn], ch[maxn][], mn[maxn], mx[maxn];
inline int isroot(int x) { return ((ch[fa[x]][] != x) && (ch[fa[x]][] != x)); }
inline void pushup(int x) {
mn[x] = mx[x] = x;
if (ls) mn[x] = mn[ls];
if (rs) mx[x] = mx[rs];
}
inline void rotate(int x) {
int y = fa[x], z = fa[y];
int l = (ch[y][] == x), r = l ^ ;
if (!isroot(y)) ch[z][ch[z][] == y] = x;
fa[x] = z; fa[ch[x][r]] = y; fa[y] = x;
ch[y][l] = ch[x][r]; ch[x][r] = y;
pushup(y); pushup(x);
}
inline void splay(int x) {
while (!isroot(x)) {
int y = fa[x], z = fa[y];
if (!isroot(y)) {
if (ch[z][] == y ^ ch[y][] == x) rotate(x);
else rotate(y);
}
rotate(x);
}
pushup(x);
}
void access(int x) {
for (int y = ; x; y = x, x = fa[x]) {
splay(x);
rs = y;
pushup(x);
}
}
inline int findroot(int x) {
while (!isroot(x)) x = fa[x];
return x;
}
void play(int n, int T, int dataType) {
// srand((unsigned long long)new char);
for (int i = ; i <= n; i++) pid[i] = i;
random_shuffle(pid + , pid + n + );
if (dataType == ) // chain
{
vis[] = ;
int l = , r = ;
for (int i = ; i <= n; i++) {
int x = pid[i], now;
if (vis[x]) continue;
if (!vis[now = explore(l, x)]) {
while (now != x) vis[now] = , now = explore(now, x);
vis[x] = ;
l = x;
} else {
now = explore(r, x);
while (now != x) vis[now] = , now = explore(now, x);
vis[x] = ;
r = x;
}
}
} else {
vis[] = ;
mn[] = mx[] = ;
for (int i = ; i <= n; i++) {
if (vis[pid[i]]) continue;
int now = pid[i], x = findroot(), ret;
while (!vis[now]) {
ret = explore(x, now);
if (mn[rs] == ret) x = rs;
else if (mx[ls] == ret) x = ls;
else if (vis[ret]) x = findroot(ret);
else vis[ret] = , mn[ret] = mx[ret] = ret, fa[ret] = x, x = ret;
}
access(now);
}
}
}

WC2018 即时战略的更多相关文章

  1. [WC2018]即时战略——动态点分治(替罪羊式点分树)

    题目链接: [WC2018]即时战略 题目大意:给一棵结构未知的树,初始时除1号点其他点都是黑色,1号点是白色,每次你可以询问一条起点为白色终点任意的路径,交互库会自动返回给你这条路径上与起点相邻的节 ...

  2. 「WC2018即时战略」

    「WC2018即时战略」 题目描述 小 M 在玩一个即时战略 (Real Time Strategy) 游戏.不同于大多数同类游戏,这个游戏的地图是树形的.也就是说,地图可以用一个由 \(n\) 个结 ...

  3. 【UOJ#349】[WC2018] 即时战略

    题目链接 题意 一开始已知一号点. 每次可以选定一个已知点和一个未知点,然后交互库会返回从已知点出发到达未知点路径上的第二个点. 要求在有限步之内知道每一个点. 次数要求: 链的情况要求 \(O(n) ...

  4. [WC2018]即时战略(LCT,splay上二分)

    [UOJ题面]http://uoj.ac/problem/349 一道非常好的与数据结构有关的交互题. 首先先看部分分做法, 一上来我们肯定得钦定一个 \(explore\) 的顺序,直接随机就好. ...

  5. 【WC2018】即时战略(动态点分治,替罪羊树)

    [WC2018]即时战略(动态点分治,替罪羊树) 题面 UOJ 题解 其实这题我也不知道应该怎么确定他到底用了啥.只是想法很类似就写上了QwQ. 首先链的部分都告诉你要特殊处理那就没有办法只能特殊处理 ...

  6. 「WC2018」即时战略

    「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...

  7. loj2341「WC2018」即时战略(随机化,LCT/动态点分治)

    loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...

  8. 【WC2018】即时战略

    题目描述 小M在玩一个即时战略(Real Time Strategy)游戏.不同于大多数同类游戏,这个游戏的地图是树形的. 也就是说,地图可以用一个由 n个结点,n?1条边构成的连通图来表示.这些结点 ...

  9. 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转

    今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...

随机推荐

  1. python常用模块——hashlib模块

    Python的hashlib提供了常见的摘要算法,如md5.sha1等 什么是摘要算法了?摘要算法又称哈希算法.散列算法. 它通过一个函数,把任意长度的数据转化魏一个长度固定的数据串(通常用十六进制的 ...

  2. C#中字符串的内存分配与驻留池

    完全引用http://www.cnblogs.com/instance/archive/2011/05/24/2056091.html 驻留池:是一张记录了所有在代码中使用字面量声明的字符串实例的引用 ...

  3. win10 chrome 调试

      下载NPAPI版本的flash player: http://www.adobe.com/support/flashplayer/debug_downloads.html#fp13       禁 ...

  4. XSS插入绕过一些方式总结

    详见:http://blog.csdn.net/keepxp/article/details/52054388 1 常规插入及其绕过 1.1 Script 标签 绕过进行一次移除操作: <scr ...

  5. 跨平台移动开发_Android 平台使用 PhoneGap 方法

    PhoneGap  下载地址http://phonegap.com/install/    1.打开 Eclipse,在文件菜单下面点击 创建> Android Application Proj ...

  6. INSPIRED启示录 读书笔记 - 第36章 可用性与美感

    两者缺一不可 交互设计和视觉设计完全是两回事 视觉设计可以满足用户的情感需求 良好的用户体验是交互设计师和视觉设计师合作的结果.他们共同配合产品经理定义产品

  7. Vue.js学习笔记 第二篇 样式绑定

    Class绑定的对象语法 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  8. LCN协调者服务集群

    官方文档: https://github.com/codingapi/tx-lcn/wiki/TxManager%E9%9B%86%E7%BE%A4%E8%AF%B4%E6%98%8E 核心原理 通过 ...

  9. GDKOI2017游记

    去年的GDKOI在寒假(虽然我没参加),但由于一些机♂缘♂巧♂合♂,比赛时间变成了开学之后的第一周,于是直接导致了当我的同学们在认真学习的同时,我在广州无所事事地和同学谈♂笑♂风♂生♂.(太好了,可以 ...

  10. java基础(8)-集合类

    增强for循环 /* *增强for循环 * for(元素类型 变量:数据或Collection集合){ * 使用变量即可,该变量就是元素 * } * 优点:简化了数组和集合的遍历 * 缺点:增强for ...