题目链接

WC出了点意外滚粗了,来补补题。

\(O(n^2)\)的时间复杂度,\(O(nlogn)\)的询问次数应该还是比较好想的,每次要打通到x的路径,对当前已知的树不断的找重心并询问在重心的哪颗子树中走过去。注意到有加点的操作,用紫荆花之恋的那种做法可以做到\(O(nlog^2n)\),但我不会写...听wys讲课说可以用LCT,想了一下发现挺简单的就去用LCT写了这题。反正就是把1作为根,每次要打通到x的路径时,就可以从1开始,类似二分的过程在每棵splay中不断询问当前点再往其中一棵子树走过去,若得到了一个不在当前splay中的点就需要跳到下一棵splay,找到了目标点就access一下,时间复杂度和询问次数都是\(O(nlogn)\)的,所以链部分的数据要特判一下。

#include "rts.h"
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define P puts("lala")
#define cp cerr<<"lala"<<endl
#define fi first
#define se second
#define ln putchar('\n')
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; const int N=300050;
int p[N],fa[N],ch[N][2],L[N],R[N];
bool know[N]; inline bool ge(int x) {return ch[fa[x]][1]==x;}
inline bool isroot(int x) {return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
inline void up(int x)
{
L[x]=x; R[x]=x;
if(ch[x][0]) L[x]=L[ch[x][0]];
if(ch[x][1]) R[x]=R[ch[x][1]];
}
inline void rotate(int x)
{
int f=fa[x],g=fa[f],wh=ge(x);
if(!isroot(f)) ch[g][ch[g][1]==f]=x;
ch[f][wh]=ch[x][wh^1]; fa[ch[f][wh]]=f;
ch[x][wh^1]=f; fa[f]=x;
fa[x]=g;
up(f); up(x);
}
int stk[N],top=0;
void splay(int x)
{
top=0; stk[++top]=x;
for(int i=x;!isroot(i);i=fa[i]) stk[++top]=fa[i];
while(top) pushdown(stk[top--]);
for(int f;(f=fa[x])&&!isroot(x);rotate(x))
if(!isroot(f)) rotate(ge(x)==ge(f)?f:x);
}
void access(int x)
{
for(int t=0;x;t=x,x=fa[x])
splay(x),ch[x][1]=t,up(x);
} void play(int n, int T, int opt)
{
for(int i=1;i<=n;++i) p[i]=i;
random_shuffle(p+1,p+1+n);
know[1]=1;
if(opt==3)
{
int l=1,r=1;
for(int i=1;i<=n;++i) if(!know[p[i]])
{
int x=l,y=explore(x,p[i]);
bool rig=0;
if(know[y]) x=r,rig=1;
else know[y]=1,x=y,rig=0,l=x;
while(x!=p[i])
{
x=explore(x,p[i]),know[x]=1;
if(rig) r=x;
else l=x;
}
}
}
else
{
for(int i=1;i<=n;++i) L[i]=R[i]=i;
for(int i=1;i<=n;++i) if(!know[p[i]])
{
int x=1;
while(1)
{
splay(x);
while(1)
{
int o=explore(x,p[i]);
if(o==R[ch[x][0]]) x=ch[x][0];
else if(o==L[ch[x][1]]) x=ch[x][1];
else
{
if(!know[o]) know[o]=1,fa[o]=x;
x=o; break;
}
}
if(x==p[i]) break;
}
access(x);
}
}
}

uoj349【WC2018】即时战略的更多相关文章

  1. [WC2018]即时战略——动态点分治(替罪羊式点分树)

    题目链接: [WC2018]即时战略 题目大意:给一棵结构未知的树,初始时除1号点其他点都是黑色,1号点是白色,每次你可以询问一条起点为白色终点任意的路径,交互库会自动返回给你这条路径上与起点相邻的节 ...

  2. 「WC2018即时战略」

    「WC2018即时战略」 题目描述 小 M 在玩一个即时战略 (Real Time Strategy) 游戏.不同于大多数同类游戏,这个游戏的地图是树形的.也就是说,地图可以用一个由 \(n\) 个结 ...

  3. WC2018 即时战略

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

  4. 【UOJ#349】[WC2018] 即时战略

    题目链接 题意 一开始已知一号点. 每次可以选定一个已知点和一个未知点,然后交互库会返回从已知点出发到达未知点路径上的第二个点. 要求在有限步之内知道每一个点. 次数要求: 链的情况要求 \(O(n) ...

  5. [WC2018]即时战略(LCT,splay上二分)

    [UOJ题面]http://uoj.ac/problem/349 一道非常好的与数据结构有关的交互题. 首先先看部分分做法, 一上来我们肯定得钦定一个 \(explore\) 的顺序,直接随机就好. ...

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

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

  7. 「WC2018」即时战略

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

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

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

  9. 【WC2018】即时战略

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

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

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

随机推荐

  1. 霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_206 举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种"指南"和" ...

  2. 【安全通报】DolphinScheduler 漏洞情况说明

    Apache DolphinScheduler 社区邮件列表最近通告了 2 个漏洞,考虑到有很多用户并未订阅此邮件列表,我们特地在此进行情况说明: CVE-2020-11974[1] 漏洞 (CVE- ...

  3. mybatisplus-sql注入器

    sql注入器 使用mybatisplus只需要继承BaseMapper接口即可使用:但是有新的需求需要扩展BaseMapper里面的功能时可使用sql注入器. 扩展BaseMapper里面的功能 点击 ...

  4. 【MySQL】从入门到精通6-MySQL数据类型与官方文档

    上期:[MySQL]从入门到精通5-一对多-外键 这个是官方文档链接,是世界上最全面的MySQL教学了,所有问题都可以在这里找到解决方法. https://dev.mysql.com/doc/ htt ...

  5. [网鼎杯 2020 朱雀组]phpweb-1|反序列化

    1.打开界面之后界面一直在刷新,检查源代码也未发现提示信息,但是在检查中发现了两个隐藏的属性:func和p,抓包进行查看一下,结果如下: 2.对两个参数与返回值进行分析,我们使用dat时一般是这种格式 ...

  6. JDBC连接池&JDBCTemplate

    今日内容 1. 数据库连接池 2. Spring JDBC : JDBC Template 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容 ...

  7. Homework6

    1.问:阅读和了解什么是形式化方法? 答:形式化方法在逻辑科学中是指分析.研究思维形式结构的方法.是把各种具有不同内容的思维形式(主要是命题和推理)加以比较,找出各个部分相互联结的方式,抽取出共同的形 ...

  8. kettle通过SSH连接Mysql数据库(SSH隧道)

    kettle通过SSH连接Mysql数据库(SSH隧道) Kettle无法直接连接使用SSH通道的MySQL,通过SSH隧道(推荐)或者需要借助工具PuTTY(不用时需要注销不推荐),具体操作如下所示 ...

  9. 使用Pipeline抽象业务生命周期流程

    上篇关于流程引擎的文章还是快两年以前的<微服务业务生命周期流程管控引擎>,这中间各种低代码平台层出不穷,虽然有些仅仅是OA+表单的再度包装,但有些的确是在逻辑和操作单元层面进行了真正的高度 ...

  10. Java SE 多态

    1.多态 方法的多态 //方法重载体现多态 A a = new A(); //这里我们传入不同的参数,就会调用不同sum方法 System.out.println(a.sum(10,20)); Sys ...