交互题

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

对于 30% 的数据,是一条链,操作次数 $O(n+logn)$

剩下的数据,操作次数 $O(nlogn)$

$n \leq 300000$

sol:

先吐槽 loj 的交互题评测机制

把 ac 时应该输出的东西输出,然后就 a 了

不 shing 话

链的情况想了半天,题解是 xjb 暴力,服

因为这个 explore 的性质,当前已知的一定是一条线段

维护一下当前已知的左端点和右端点,每次随机一个未知的点蹦过去,如果走错方向了就换个方向走

这样出错次数期望 log ? 不知道

树的情况很好想

首先想到一个很朴素的暴力,对于每个点,从根 explore 下去

然后会发现自己多 explore 了很多已知的点,当需要 explore 一个点的时候你只需要跳到他那个子树上,从那个点开始 explore 就可以了

现在就是要维护一棵树滋磁

1.加入一个点

2.快速跳到一个点

动态点分治/LCT 都可以

但谁都知道 LCT 好写吧...于是果断 LCT

每次操作后 access 保证复杂度即可

至于为什么 access?道理相当于 splay 每次把查询点旋到根保证复杂度?

什么?uoj 有 hack 数据?random_shuffle 一下就可以了

跑到了 rk#3 应该是比较欧的原因

因为之后再也跑不了那么快了

#include <bits/stdc++.h>
#include "rts.h"
#define LL long long
#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
using namespace std;
inline int read() {
int x = , f = ; char ch;
for (ch = getchar(); !isdigit(ch); ch = getchar()) if (ch == '-') f = -f;
for (; isdigit(ch); ch = getchar()) x = * x + ch - '';
return x * f;
}
const int maxn = ;
#define ls ch[x][0]
#define rs ch[x][1]
int vis[maxn], pid[maxn];
int fa[maxn], ch[maxn][], mn[maxn], mx[maxn];
inline int isroot(int x) { return ((ch[fa[x]][] != x) && (ch[fa[x]][] != x)); }
inline void pushup(int x) {
mn[x] = mx[x] = x;
if (ls) mn[x] = mn[ls];
if (rs) mx[x] = mx[rs];
}
inline void rotate(int x) {
int y = fa[x], z = fa[y];
int l = (ch[y][] == x), r = l ^ ;
if (!isroot(y)) ch[z][ch[z][] == y] = x;
fa[x] = z; fa[ch[x][r]] = y; fa[y] = x;
ch[y][l] = ch[x][r]; ch[x][r] = y;
pushup(y); pushup(x);
}
inline void splay(int x) {
while (!isroot(x)) {
int y = fa[x], z = fa[y];
if (!isroot(y)) {
if (ch[z][] == y ^ ch[y][] == x) rotate(x);
else rotate(y);
}
rotate(x);
}
pushup(x);
}
void access(int x) {
for (int y = ; x; y = x, x = fa[x]) {
splay(x);
rs = y;
pushup(x);
}
}
inline int findroot(int x) {
while (!isroot(x)) x = fa[x];
return x;
}
void play(int n, int T, int dataType) {
// srand((unsigned long long)new char);
for (int i = ; i <= n; i++) pid[i] = i;
random_shuffle(pid + , pid + n + );
if (dataType == ) // chain
{
vis[] = ;
int l = , r = ;
for (int i = ; i <= n; i++) {
int x = pid[i], now;
if (vis[x]) continue;
if (!vis[now = explore(l, x)]) {
while (now != x) vis[now] = , now = explore(now, x);
vis[x] = ;
l = x;
} else {
now = explore(r, x);
while (now != x) vis[now] = , now = explore(now, x);
vis[x] = ;
r = x;
}
}
} else {
vis[] = ;
mn[] = mx[] = ;
for (int i = ; i <= n; i++) {
if (vis[pid[i]]) continue;
int now = pid[i], x = findroot(), ret;
while (!vis[now]) {
ret = explore(x, now);
if (mn[rs] == ret) x = rs;
else if (mx[ls] == ret) x = ls;
else if (vis[ret]) x = findroot(ret);
else vis[ret] = , mn[ret] = mx[ret] = ret, fa[ret] = x, x = ret;
}
access(now);
}
}
}

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】即时战略(动态点分治,替罪羊树)

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

  6. 「WC2018」即时战略

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

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

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

  8. 【WC2018】即时战略

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

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

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

随机推荐

  1. JavaScript实现自适应窗口大小的网页

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  2. 面向对象编程——super进阶(十)

    一.入门使用 在python中,使用super最常见的让子类继承父类.在这种情况下,当前类和对象可以作为super函数的参数使用,调用函数返回的任何方法都是调用超类的方法,而不是当前类的方法. cla ...

  3. scp 和 pscp

    今天在做项目遇到了两个问题,做一些总结. 1.在项目中,防火墙的的相关配置是关于cisco企业级防火墙的配置,并不是window防火墙. 2. 在Linux上,   scp     linux文件   ...

  4. Centos6.5使用yum安装软件的时候 Another app is currently holding the yum lock; waiting for it to exit...

    Loaded plugins: fastestmirror, refresh-packagekit, security Existing . Another app is currently hold ...

  5. java深入探究14-lucene

    项目代码:链接:http://pan.baidu.com/s/1qXVcfCw 密码:apw1 01 回顾索引 定义:索引是对数据库表中一列或多列的值进行排序的一种结构 目的:加快对数据库表中记录的查 ...

  6. java基础(3)-多线程(1)

    java多线程 进程与线程 进程:指一个正在执行的应用程序.每个进程执行都有一个执行顺序,该顺序称为一个执行路径或一个控制单元(进程是资源分配的最小单位).一个进程包含1~n个线程 线程:指进程中某个 ...

  7. linux基础(10)-导航菜单

    导航菜单实战 例:编写一个shell脚本,包含多个菜单,其中需要一个退出选项:可单选也可多选:根据序号选择后,显示所选菜单名称. #!/bin/bash ####################### ...

  8. java——base64 加密和解密

    base64 一.加密 *.若有要求输入字符必须为UTF-8: 则需str.getByte("utf-8");  //在getByte()中指定utf-8编码,否则中文字符将被加密 ...

  9. Spring初学之FactoryBean配置Bean

    实体bean: Car.java: package spring.beans.factorybean; public class Car { private String name; private ...

  10. Python 正则表达式匹配小数

    不废话,直接上表达式 (\d+(\.\d+)?) 如: import re find_float = lambda x: re.search("\d+(\.\d+)?",x) .g ...