【loj2341】【WC2018】即时战略
题目
交互题;
一开始所有点都是黑的,你需要把所有点变白;
explore(u,v)会将u到v路径上的第二个点变白;
一开始只有1号点是白色的,你需要让所有点变白;
对于一条链次数限制\(O(n+log \ n)\),普通的树次数限制\(O(n \ log \ n)\) ;
题解
orz yww
Part 1
白色区间一定是一条链,记录左右端点;
先假设新点在左边用左端点扩展,如果explore出重复的点,则说明在右边换右端点;
这样一直扩展,最坏\(O(2n)\),期望\(O(n+log \ n)\);
浪费次数其实可以看成从头开始的上升子序列的长度,考虑\(n\)放在哪里:
期望$E_n= 1 + \sum_{i=0}^{n-1} \frac{1}{n} E_{i} -> E_n = E_{n-1}+\frac{1}{n} $
那么有两边就乘二,再随机一下每次默认的方向就乘二分之一还是log的;
Part 2
只需要找到已知树上的离新点最近的点;
可以用在LCT上跳,均摊\(n \ log \ n\),也可以在动态点分树上跳,严格\(n \log n\);
我只会写LCT,LCT需要维护链顶和链底标号;
(不知道该如何描述.....建议看看rk1的代码)
#include<bits/stdc++.h>
#include "rts.h"
#define il inline
using namespace std;
const int N=300010;
int vis[N],p[N],fa[N],ch[N][2],rev[N],L[N],R[N];
il bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}//
il bool isch(int x,int y){return ch[x][0]==y||ch[x][1]==y;}//
il int findrt(int x){while(!isrt(x))x=fa[x];return x;}//
il void mfy(int x){
swap(ch[x][0],ch[x][1]);
swap(L[x],R[x]);
rev[x]^=1;
}//
il void pushdown(int x){
if(rev[x]){
if(ch[x][0])mfy(ch[x][0]);
if(ch[x][1])mfy(ch[x][1]);
rev[x]^=1;
}
}
il void pushup(int x){
L[x]=R[x]=x;
if(ch[x][0])L[x]=L[ch[x][0]];
if(ch[x][1])R[x]=R[ch[x][1]];
}//
il void rotate(int x){
int y=fa[x],z=fa[y];
if(!isrt(y))ch[z][ch[z][1]==y]=x;
int l=ch[y][1]==x,r=l^1;
fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
ch[y][l]=ch[x][r];ch[x][r]=y;
pushup(y);pushup(x);
}//
void push(int x){
static int sta[N],top;
while(!isrt(x))sta[++top]=x,x=fa[x];
sta[++top]=x;
while(top)pushdown(sta[top--]);
}//
il void splay(int x){
push(x);
for(int y,z;!isrt(x);rotate(x)){
y=fa[x],z=fa[y];
if(!isrt(y))rotate( (ch[y][0]==x)^(ch[z][0]==y) ? x : y );
}
}//
il void access(int x){
for(int y=0;x;y=x,x=fa[x]){
splay(x);
ch[x][1]=y;
pushup(x);
}
}//
il void mkrt(int x){access(x);splay(x);mfy(x);}//
il void link(int x,int y){fa[y]=x;}//
il void solve(int n){
int a[2]={1,1};
for(int i=2;i<=n;++i){
int u=p[i];if(vis[u])continue;
int x=rand()%2,v=explore(a[x],u);
if(vis[v])x^=1,v=explore(a[x],u);
vis[v]=1;while(v!=u)vis[v=explore(v,u)]=1;
a[x]=u;
}
}//
void play(int n,int T,int typ){
srand(23333323);
for(int i=1;i<=n;++i)p[i]=i;
random_shuffle(p+2,p+n+1);
if(typ==3){solve(n);return;}
vis[1]=1;
for(int i=1;i<=n;++i)L[i]=R[i]=i;
for(int i=2,lst=1;i<=n;++i){
int u=p[i],v;
lst=findrt(1);
if(vis[u])continue;
while(lst!=u){
v=explore(lst,u);
pushdown(lst);
if(!vis[v])vis[v]=1,link(lst,v),lst=v;
else if(v==R[ch[lst][0]])lst=ch[lst][0];
else if(v==L[ch[lst][1]])lst=ch[lst][1];
else lst=findrt(v);
}
//mkrt(lst); mkrt会被卡操作常数
access(lst);
}
return ;
}//
【loj2341】【WC2018】即时战略的更多相关文章
- [WC2018]即时战略——动态点分治(替罪羊式点分树)
题目链接: [WC2018]即时战略 题目大意:给一棵结构未知的树,初始时除1号点其他点都是黑色,1号点是白色,每次你可以询问一条起点为白色终点任意的路径,交互库会自动返回给你这条路径上与起点相邻的节 ...
- 「WC2018即时战略」
「WC2018即时战略」 题目描述 小 M 在玩一个即时战略 (Real Time Strategy) 游戏.不同于大多数同类游戏,这个游戏的地图是树形的.也就是说,地图可以用一个由 \(n\) 个结 ...
- WC2018 即时战略
交互题 一棵树,一开始只有 1 号点是已知的,其他的都是未知的,你可以调用函数 explore(x,y) ,其中 x 必须是已知的,函数会找到 x 到 y 路径上第二个点,并把它标成已知,求最小步数使 ...
- 【UOJ#349】[WC2018] 即时战略
题目链接 题意 一开始已知一号点. 每次可以选定一个已知点和一个未知点,然后交互库会返回从已知点出发到达未知点路径上的第二个点. 要求在有限步之内知道每一个点. 次数要求: 链的情况要求 \(O(n) ...
- [WC2018]即时战略(LCT,splay上二分)
[UOJ题面]http://uoj.ac/problem/349 一道非常好的与数据结构有关的交互题. 首先先看部分分做法, 一上来我们肯定得钦定一个 \(explore\) 的顺序,直接随机就好. ...
- loj2341「WC2018」即时战略(随机化,LCT/动态点分治)
loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...
- 【WC2018】即时战略(动态点分治,替罪羊树)
[WC2018]即时战略(动态点分治,替罪羊树) 题面 UOJ 题解 其实这题我也不知道应该怎么确定他到底用了啥.只是想法很类似就写上了QwQ. 首先链的部分都告诉你要特殊处理那就没有办法只能特殊处理 ...
- 「WC2018」即时战略
「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...
- 【WC2018】即时战略
题目描述 小M在玩一个即时战略(Real Time Strategy)游戏.不同于大多数同类游戏,这个游戏的地图是树形的. 也就是说,地图可以用一个由 n个结点,n?1条边构成的连通图来表示.这些结点 ...
- 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转
今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...
随机推荐
- Python 基础-import 与 from...import....
简单说说python import与from-import- 在python用import或者from-import来导入相应的模块.模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需 ...
- ASP.NET SignalR 系列(四)之指定对象推送
在上一章讲到了广播推送,即所有订阅的用户都能收到,这种适合于信息广播. 接下来介绍如何给指定的对象推送 在讲这个之前先说明一下连接创建的基础知识 1.每个页面与服务端创建连接并启动时,这时服务端会产生 ...
- Java自学-操作符 三元操作符
Java的三元操作符 三元操作符 ?: 示例 1 : 三元操作符 语法:表达式?值1:值2 如果表达式为真 返回值1 如果表达式为假 返回值2 public class HelloWorld { pu ...
- SpringBoot配置中@ConfigurationProperties和@Value的区别
基本特征 @ConfigurationProperties 与@Bean结合为属性赋值 与@PropertySource(只能用于properties文件)结合读取指定文件 与@Validation结 ...
- linux入门—安装linux系统(1)
一,linux介绍 linux是一套免费使用和自由传播的类Unix操作系统,简单的说就是不要钱,你可以随便使用,也可以分享给其他人. (剩下的详细内容,个人认为百度百科的内容比我瞎讲强的多,网址:ht ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约
本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6. ...
- GO执行shell命令
Golang执行shell命令主要依靠exec模块 代码为核心逻辑,并非全部 运行命令 cmd1 = exec.Command("ls") if err = cmd1.Run(); ...
- leetcode 学习心得 (3)
源代码地址:https://github.com/hopebo/hopelee 语言:C++ 517. Super Washing Machines You have n super washing ...
- Flink Runtime核心机制剖析(转)
本文主要介绍 Flink Runtime 的作业执行的核心机制.本文将首先介绍 Flink Runtime 的整体架构以及 Job 的基本执行流程,然后介绍在这个过程,Flink 是怎么进行资源管理. ...
- day 20 作业
作业 1.下面这段代码的输出结果将是什么?请解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent ...