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 ...
随机推荐
- JavaScript实现自适应窗口大小的网页
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...
- 面向对象编程——super进阶(十)
一.入门使用 在python中,使用super最常见的让子类继承父类.在这种情况下,当前类和对象可以作为super函数的参数使用,调用函数返回的任何方法都是调用超类的方法,而不是当前类的方法. cla ...
- scp 和 pscp
今天在做项目遇到了两个问题,做一些总结. 1.在项目中,防火墙的的相关配置是关于cisco企业级防火墙的配置,并不是window防火墙. 2. 在Linux上, scp linux文件 ...
- Centos6.5使用yum安装软件的时候 Another app is currently holding the yum lock; waiting for it to exit...
Loaded plugins: fastestmirror, refresh-packagekit, security Existing . Another app is currently hold ...
- java深入探究14-lucene
项目代码:链接:http://pan.baidu.com/s/1qXVcfCw 密码:apw1 01 回顾索引 定义:索引是对数据库表中一列或多列的值进行排序的一种结构 目的:加快对数据库表中记录的查 ...
- java基础(3)-多线程(1)
java多线程 进程与线程 进程:指一个正在执行的应用程序.每个进程执行都有一个执行顺序,该顺序称为一个执行路径或一个控制单元(进程是资源分配的最小单位).一个进程包含1~n个线程 线程:指进程中某个 ...
- linux基础(10)-导航菜单
导航菜单实战 例:编写一个shell脚本,包含多个菜单,其中需要一个退出选项:可单选也可多选:根据序号选择后,显示所选菜单名称. #!/bin/bash ####################### ...
- java——base64 加密和解密
base64 一.加密 *.若有要求输入字符必须为UTF-8: 则需str.getByte("utf-8"); //在getByte()中指定utf-8编码,否则中文字符将被加密 ...
- Spring初学之FactoryBean配置Bean
实体bean: Car.java: package spring.beans.factorybean; public class Car { private String name; private ...
- Python 正则表达式匹配小数
不废话,直接上表达式 (\d+(\.\d+)?) 如: import re find_float = lambda x: re.search("\d+(\.\d+)?",x) .g ...