UOJ#349. 【WC2018】即时战略
原文链接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】即时战略的更多相关文章
- [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 即时战略
交互题 一棵树,一开始只有 1 号点是已知的,其他的都是未知的,你可以调用函数 explore(x,y) ,其中 x 必须是已知的,函数会找到 x 到 y 路径上第二个点,并把它标成已知,求最小步数使 ...
- 【WC2018】即时战略(动态点分治,替罪羊树)
[WC2018]即时战略(动态点分治,替罪羊树) 题面 UOJ 题解 其实这题我也不知道应该怎么确定他到底用了啥.只是想法很类似就写上了QwQ. 首先链的部分都告诉你要特殊处理那就没有办法只能特殊处理 ...
- 【WC2018】即时战略
题目描述 小M在玩一个即时战略(Real Time Strategy)游戏.不同于大多数同类游戏,这个游戏的地图是树形的. 也就是说,地图可以用一个由 n个结点,n?1条边构成的连通图来表示.这些结点 ...
- 「WC2018」即时战略
「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...
- loj2341「WC2018」即时战略(随机化,LCT/动态点分治)
loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...
- 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转
今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...
随机推荐
- Java实验报告
package sadsada; import java.util.Scanner; import java.util.Arrays; public class student { public st ...
- Java第一次实训作业
1.编写程序: 声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果. import java.util.Scanner; public class Hellowore { ...
- (二叉树 递归) leetcode 889. Construct Binary Tree from Preorder and Postorder Traversal
Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...
- 安装redis服务
wget http://download.redis.io/releases/redis-3.2.6.tar.gz tar -zxvf redis-3.2.6.tar.gzcd redis-3.2.6 ...
- Neo4j安装
一.Windows版本 1)下载java8,并配置环境变量 java下载请点击,提取码:f6ci 2)Neo4j下载 选windows版本 新建系统环境变量: 并配置Path环境变量,添加bin所在目 ...
- 【转】Redis学习笔记(四)如何用Redis实现分布式锁(1)—— 单机版
原文地址:http://bridgeforyou.cn/2018/09/01/Redis-Dsitributed-Lock-1/ 为什么要使用分布式锁 这个问题,可以分为两个问题来回答: 为什么要使用 ...
- matplotlib库的简单应用
matplotlib库 import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.family']='Si ...
- C# 01 Primitive Types and Expressions
Class Data or Attributes state of the application Methods or Functions have behavior Namespace is a ...
- Linux系统GNOME主题安装与Tweaks工具使用
需要软件: GNOME Tweaks--使主题修改更加容易一个工具 安装主题: 下载主题:mac themes下载链接:https://www.gnome-look.org/p/1241688/ 这里 ...
- PC端判断浏览器类型及移动端判断移动设备类型
浏览器代理检测,可以检测出来用户使用的浏览器类型,也可以检测浏览器所在的操作系统 navigator.userAgent (1).判断浏览器类型 var t = navigator.userAgent ...