原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ349.html

题解

被cqz D没了。我D cly 关你啥事(逃

首先链的情况直接rand就好了。

期望次数 $O(n+\log n)$ 。

然而我一开始写挂了。


开始扯淡

我用这个模数,就可以过原题数据:

('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I')

但是用以下两种都不行:

('G'+'L'+'Y'+'A'+'K'+'I'+'O'+'I')

('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I'+'N'+'O'+'I')

第一个说明叫cly外号会掉rp,因为他是大佬。

第二个说明cly是大佬不屑于AKNOI。


对于树的情况,容易想到的是一个和紫荆花之恋一样的替罪羊树维护点分树的做法。

但是显然GG了。

考虑我们将一个节点连到主体部分这个操作,类似于 LCT 中的 access 。于是我们发现直接写个 LCT 就没了。

写法有多种,但是考虑到常数因子,建议连接完之后一遍access上去。不要自顶向下一边access一边splay一边连边,这样常数大。

代码

#pragma GCC optimize("Ofast","inline")
#include <bits/stdc++.h>
#include "rts.h"
#define clr(x) memset(x,0,sizeof (x))
#define For(i,a,b) for (int i=a;i<=b;i++)
#define Fod(i,b,a) for (int i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define _SEED_ ('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I')
#define outval(x) printf(#x" = %d\n",x)
#define outvec(x) printf("vec "#x" = ");for (auto _v : x)printf("%d ",_v);puts("")
#define outtag(x) puts("----------"#x"----------")
#define outarr(a,L,R) printf(#a"[%d...%d] = ",L,R);\
For(_v2,L,R)printf("%d ",a[_v2]);puts("");
using namespace std;
typedef long long LL;
const int N=300005;
#define Ask explore
namespace so0{
int L=1,R=1,rv=0;
int vis[N];
vector <int> v;
void main(int n){
v.clear();
For(i,2,n)
v.pb(i);
random_shuffle(v.begin(),v.end());
while (!v.empty()){
int x=v.back();
v.pop_back();
if (vis[x])
continue;
int y=Ask(L,x);
if (y==rv){
while (R!=x)
R=Ask(R,x),vis[R]=1;
}
else {
rv=L,L=y,vis[L]=1;
while (L!=x)
rv=L,L=Ask(L,x),vis[L]=1;
}
}
}
}
namespace so1{
int n;
int vis[N];
int father[N],hson[N];
int son[N][2],fa[N];
vector <int> v;
#define ls son[x][0]
#define rs son[x][1]
bool isroot(int x){
return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;
}
int wson(int x){
return son[fa[x]][1]==x;
}
void rotate(int x){
int y=fa[x],z=fa[y],L=wson(x),R=L^1;
if (!isroot(y))
son[z][wson(y)]=x;
fa[x]=z,fa[y]=x,fa[son[x][R]]=y;
son[y][L]=son[x][R],son[x][R]=y;
}
void splay(int x){
for (int y=fa[x];!isroot(x);rotate(x),y=fa[x])
if (!isroot(y))
rotate(wson(x)==wson(y)?y:x);
}
void access(int x){
int t=0;
while (x){
splay(x);
hson[x]=t;
while (son[hson[x]][0])
hson[x]=son[hson[x]][0];
rs=t,t=x,x=fa[x];
}
}
void Ins(int a){
int x=1,y;
while (fa[x])
x=fa[x];
while (x!=a){
y=Ask(x,a);
if (!vis[y])
break;
if (y==father[x])
x=ls;
else if (y==hson[x])
x=rs;
else {
while (!isroot(y))
y=fa[y];
x=y;
}
}
while (1){
fa[y]=father[y]=x;
vis[y]=1;
x=y;
if (x==a)
break;
y=Ask(x,a);
}
access(x);
}
#undef ls
#undef rs
void main(int n){
so1::n=n;
v.clear();
vis[1]=1;
For(i,2,n)
v.pb(i);
random_shuffle(v.begin(),v.end());
clr(father),clr(hson);
while (!v.empty()){
int x=v.back();
v.pop_back();
if (!vis[x])
Ins(x);
}
}
}
void play(int n,int T,int type){
srand(_SEED_);
if (type==3)
so0::main(n);
else
so1::main(n);
}

  

UOJ#349. 【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 即时战略

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

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

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

  7. 【WC2018】即时战略

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

  8. 「WC2018」即时战略

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

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

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

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

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

随机推荐

  1. Java基础学习--数组

    1.数组的定义: 数组(Array)是相同数据类型的数据的有序集合. 2.数组的3个特点: 2.1数组长度是确定.数组一旦申请完空间,长度不能发生变化,用length属性访问. 2.2数组的元素都是同 ...

  2. C#调用DLL文件提示试图加载格式不正确的程序

    最近在调用第三方的DLL遇到了一个问题:试图加载格式不正确的程序,找了好久发现都没有解决问题,一直报错,后来发现是程序编译时的配置错了,要将项目->属性->平台选中release-X86 ...

  3. CSS3总结一:border(边框)

    Border-CSS1的属性 Border-CSS1:border Border-CSS1:border-style Border-CSS1:border-width Border-CSS1:bord ...

  4. BST(二叉搜索树)相关

    1.BST的合法性:validate-binary-search-tree class TreeNode { int val; TreeNode left; TreeNode right; TreeN ...

  5. VS Less Compiler插件使用

    1.打开扩展管理器,下载安装 2.新建一个test.less文件 3.敲入代码 @grayback: #808080; body { background:@grayback; } 4.保存即可自动生 ...

  6. unionFS学习笔记

    AUFS基础http://coolshell.cn/articles/17061.html DOCKER对于AUFS文件系统的应用http://www.cnblogs.com/ilinuxer/p/6 ...

  7. (三)Python运算符

    一.python运算符相关 Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 1.python算数运算符 ...

  8. Python编程四大神兽:迭代器、生成器、闭包和装饰器

    生成器 生成器是生成一个值的特殊函数,它具有这样一个特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程序 ...

  9. JDK开发环境配置

    1. 新建 -> 变量名“JAVA_HOME”, 变量值“C:\Program Files\Java\jdk1.8.0_112”(即JDK的安装路径) 2. 编辑 -> 变量名“Path” ...

  10. web前端效率提升-nginx+nodejs搭建本地生态

    1.起因 编写的项目是一个偏向于后台管理的web系统,使用了angular框架,在绑定数据的时候就依赖于后台的接口格式. 以前是后台写好接口后,我在绑定,在这之前一些逻辑是没法做的,有时候后台接口给的 ...