题目

交互题;

一开始所有点都是黑的,你需要把所有点变白;

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】即时战略的更多相关文章

  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. loj2341「WC2018」即时战略(随机化,LCT/动态点分治)

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

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

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

  8. 「WC2018」即时战略

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

  9. 【WC2018】即时战略

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

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

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

随机推荐

  1. Scala 系列(三)—— 流程控制语句

    一.条件表达式if Scala 中的 if/else 语法结构与 Java 中的一样,唯一不同的是,Scala 中的 if 表达式是有返回值的. object ScalaApp extends App ...

  2. 对于Node中Express框架的中间件概念的感知

    中间件是什么呢? 中间件就是客户端http请求发起传送到服务器和服务器返回响应之间的一些处理函数. 为什么要使用中间件? 通过中间件,可以对数据进行操作使得我们能方便地操作请求数据编写服务器响应.如b ...

  3. 2019 新浪 java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.新浪等公司offer,岗位是Java后端开发,因为发展原因最终选择去了新浪,入职一年时间了,也成为了面试官,之 ...

  4. maven引入外部包的方法1

    最近一个项目需要用到两个外部包文件 ctgclient-8.1.0.3.jar ctgserver-8.1.0.3.jar 方便maven打包,修改pom.xml配置(basedir为pom.xml所 ...

  5. 记录screen屏幕日志

    1.建立日志存放目录#mkdir /var/log/screen/ 2.修改配置文件,在末尾添加配置内容#vi /etc/screenrclogfile /var/log/screen/%t.log ...

  6. MySQL-By孙胜利-sifangku.com

    一.数据库基本概念 数据库:信息存储的仓库,包括一系列的关系措施! 表:一个数据库中可以有若干张表(形式上你可以看出我们日常生活中建立的表) 字段:表里面的信息会分若干个栏目来存,这些栏目呢,我们在数 ...

  7. 英语eschaunge交易所

    eschaunge  Eschaunge是一个外文单词,名词译为交易所,交易,交换,兑换(率),动词译为兑换, 交换,互换,交换,调换.是Exchange的替代形式 中文名:交易所,交易,交换 外文 ...

  8. 捡回reset的未提交修改

    使用 Reflog 如果一開始沒有記下來 Commit 的 SHA-1 值也沒關係,Git 裡有個 reflog 指令有保留一些紀錄.再次借用上個章節的例子,但這次我改用 --hard 模式來進行 r ...

  9. 基于Text-CNN模型的中文文本分类实战 流川枫 发表于AI星球订阅

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  10. python系列:一、Urllib库的基本使用

    开篇介绍: 因为我本人也是初学者,爬虫的例子大部分都是学习资料上面来的,只是自己手敲了一遍,同时加上自己的理解. 写得不好请多谅解,如果有错误之处请多赐教. 我本人的开发环境是vscode,pytho ...