WC2018 即时战略
交互题
一棵树,一开始只有 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 即时战略的更多相关文章
- [WC2018]即时战略——动态点分治(替罪羊式点分树)
题目链接: [WC2018]即时战略 题目大意:给一棵结构未知的树,初始时除1号点其他点都是黑色,1号点是白色,每次你可以询问一条起点为白色终点任意的路径,交互库会自动返回给你这条路径上与起点相邻的节 ...
- 「WC2018即时战略」
「WC2018即时战略」 题目描述 小 M 在玩一个即时战略 (Real Time Strategy) 游戏.不同于大多数同类游戏,这个游戏的地图是树形的.也就是说,地图可以用一个由 \(n\) 个结 ...
- 【UOJ#349】[WC2018] 即时战略
题目链接 题意 一开始已知一号点. 每次可以选定一个已知点和一个未知点,然后交互库会返回从已知点出发到达未知点路径上的第二个点. 要求在有限步之内知道每一个点. 次数要求: 链的情况要求 \(O(n) ...
- [WC2018]即时战略(LCT,splay上二分)
[UOJ题面]http://uoj.ac/problem/349 一道非常好的与数据结构有关的交互题. 首先先看部分分做法, 一上来我们肯定得钦定一个 \(explore\) 的顺序,直接随机就好. ...
- 【WC2018】即时战略(动态点分治,替罪羊树)
[WC2018]即时战略(动态点分治,替罪羊树) 题面 UOJ 题解 其实这题我也不知道应该怎么确定他到底用了啥.只是想法很类似就写上了QwQ. 首先链的部分都告诉你要特殊处理那就没有办法只能特殊处理 ...
- 「WC2018」即时战略
「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...
- loj2341「WC2018」即时战略(随机化,LCT/动态点分治)
loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...
- 【WC2018】即时战略
题目描述 小M在玩一个即时战略(Real Time Strategy)游戏.不同于大多数同类游戏,这个游戏的地图是树形的. 也就是说,地图可以用一个由 n个结点,n?1条边构成的连通图来表示.这些结点 ...
- 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转
今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...
随机推荐
- vue(组件、路由)懒加载
const Login = resolve => require(['@/components/Login'], resolve) //就不用import了 Vue.use(Router) le ...
- npm安装出错Unexpected end of input at 1:2307
执行命令: npm cache clean --force 然后再安装 搞定
- Android签名机制之---签名过程详解
http://www.2cto.com/kf/201512/455388.html 一.前言 又是过了好长时间,没写文章的双手都有点难受了.今天是圣诞节,还是得上班.因为前几天有一个之前的同事,在申请 ...
- LVS 命令使用
LVS 命令使用 查询命令 ipvsadm -L # 查看lvs负载均衡信息ipvsadm -L -n # -n 查看IP端口ipvsadm -L -c # 显示当前连接ipvsadm -L -- ...
- Nginx 常见报错
Nginx 常见报错 启动报错:[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 原因:这个是nginx重启时经常遇到 ...
- 跨平台移动开发 手机上使用Iscroll.Js的Banner
二话不说,直接上图,看效果 需要使用Iscroll <script src="content/scripts/iscroll.js"></script> 示 ...
- php数组函数-array_push()
array_push()函数将一个或多个元素插入数组的末尾(入栈). 提示:可以添加一个或者多个值. 注:即使您的数组有字符串键名,您所添加的元素将是数字键名. array_push(array,va ...
- 2018-2019-2 20165114《网络对抗技术》Exp6 信息收集与漏洞扫描
Exp6 信息收集与漏洞扫描 目录 一.实验目标与内容 二.实验后问题回答 三.实验过程记录 3.1 各种搜索技巧的应用 3.2 DNS IP注册信息的查询 3.3 基本的扫描技术 [主机发现] [端 ...
- Swift中的? ! as as? as!
?: 代表这是个可选类型(optional)的.如下,如果num有就为Int类型的,如果没有值那么就是nil. let num:Int? 当我对number进行显示赋值时那么number就是Int类型 ...
- python脚本发送电子邮件
#!/usr/bin/pythonimport smtplibimport stringHOST='smtp.qq.com'#HOST='mail.qq.com'SUBJECT='Test email ...