【WC2018】即时战略
题目描述
小M在玩一个即时战略(Real Time Strategy)游戏。不同于大多数同类游戏,这个游戏的地图是树形的。
也就是说,地图可以用一个由 n个结点,n?1条边构成的连通图来表示。这些结点被编号为 1 ~ n。
每个结点有两种可能的状态:“已知的”或“未知的”。游戏开始时,只有 1号结点是已知的。在游戏的过程中,小M可以尝试探索更多的结点。具体来说,小M每次操作时需要选择一个已知的结点 x,和一个不同于 x 的任意结点 y(结点 y 可以是未知的)。
然后游戏的自动寻路系统会给出 x 到 y 的最短路径上的第二个结点 z,也就是从 x 走到 y 的最短路径上与 x 相邻的结点。此时,如果结点 z 是未知的,小M会将它标记为已知的。
这个游戏的目标是:利用至多 T 次探索操作,让所有结点的状态都成为已知的。然而小M还是这个游戏的新手,她希望得到你的帮助。
题解
论手残选手如何写交互写挂到死UOJ上交了两页多。。。
为了骗分不被hack,可以把所有点打乱顺序。
对于地图是一条链的情况,我们可以可以维护当前拓展出的区间,然后每次暴力更新。
然后树的情况,比较好的做法是搞一个动态点分树,可以保证每次拓展的复杂度都是log的。
或者写LCT,它的拓展复杂度是基于splay的,均摊log,会被hack。
为了用LCT过掉这道题,需要把某些函数写的奇怪一点。
inline int findroot(int x){
while(!isroot(x))x=fa[x];
// splay(x);
return x;
}
代码
#include<iostream>
#include "rts.h"
#include<cstdio>
#include<algorithm>
#include<ctime>
#define ls ch[x][0]
#define rs ch[x][1]
#define N 300009
using namespace std;
int ch[N][],lc[N],rc[N],fa[N],id[N];
bool vis[N];
inline bool ge(int x){return ch[fa[x]][]==x;}
inline bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
inline void pushup(int x){
lc[x]=rc[x]=x;
if(ls)lc[x]=lc[ls];
if(rs)rc[x]=rc[rs];
}
inline void rotate(int x){
int y=fa[x],o=ge(x);
ch[y][o]=ch[x][o^];fa[ch[y][o]]=y;
if(!isroot(y))ch[fa[y]][ge(y)]=x;fa[x]=fa[y];
fa[y]=x;ch[x][o^]=y;pushup(y);pushup(x);
}
inline void splay(int x){
while(!isroot(x)){
int y=fa[x];
if(isroot(y))rotate(x);
else rotate(ge(x)==ge(y)?y:x),rotate(x);
}
}
inline void access(int x){
for(int y=;x;y=x,x=fa[x]){
splay(x);ch[x][]=y;pushup(x);
}
}
inline int findroot(int x){
while(!isroot(x))x=fa[x];
// splay(x);
return x;
}
inline void work(int x){
int now=findroot();
while(!vis[x]){
int y=explore(now,x);
if(y==lc[ch[now][]])now=ch[now][];
else if(y==rc[ch[now][]])now=ch[now][];
else if(vis[y])now=findroot(y);
else vis[y]=,fa[y]=now,now=y;
}
access(x);
}
void play(int n, int T, int dataType){
srand();
for(int i=;i<=n;++i)id[i]=i;vis[]=;
for(int i=;i<=n;++i)lc[i]=rc[i]=i;
for(int i=;i<=;++i)random_shuffle(id+,id+n+);
if(dataType==){
int L=,R=;
for(int i=;i<=n;++i)if(!vis[id[i]]){
int x=id[i];
int now=explore(L,x);
if(vis[now]){
while(!vis[x]){
int y=explore(R,x);
vis[y]=;R=y;
}
}
else{
while(!vis[x]){
int y=explore(L,x);
vis[y]=;L=y;
}
}
}
return;
}
else for(int i=;i<=n;++i)if(!vis[id[i]])work(id[i]);
}
【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\) 的顺序,直接随机就好. ...
- 【WC2018】即时战略(动态点分治,替罪羊树)
[WC2018]即时战略(动态点分治,替罪羊树) 题面 UOJ 题解 其实这题我也不知道应该怎么确定他到底用了啥.只是想法很类似就写上了QwQ. 首先链的部分都告诉你要特殊处理那就没有办法只能特殊处理 ...
- 「WC2018」即时战略
「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...
- loj2341「WC2018」即时战略(随机化,LCT/动态点分治)
loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...
- 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转
今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...
随机推荐
- Android获取定位权限,获取设备所在的经纬度
转载请标明出处:http://www.cnblogs.com/tangZH/p/8969898.html 前言: 有时候我们仅仅是想要获取设备所在的经纬度,那么直接调用Android相关的api就可 ...
- c# 多线程委托传参方式
1.定义一个线程调用的方法函数 private void RTPServer(object _Serverip) { IPEndPoint Serverip = _Serverip as IPEndP ...
- [20190402]Library Cache mutex.txt
[20190402]Library Cache mutex.txt 1.环境:SCOTT@book> @ ver1PORT_STRING VERSION ...
- c/c++ 多线程 std::call_once
多线程 std::call_once 转自:https://blog.csdn.net/hengyunabc/article/details/33031465 std::call_once的特点:即使 ...
- linux ssh免密登陆远程服务器
10.170.1.18服务器免密登录到10.170.1.16服务器 首先登入一台linux服务器(10.170.1.18),此台做为母机(即登入其他linux系统用这台做为入口):执行一行命令生成ke ...
- Spring的单例模式底层实现
http://blog.csdn.net/cs408/article/details/48982085
- Linux实战教学笔记51:Zabbix监控平台3.2.4(三)生产环境案例
https://www.cnblogs.com/chensiqiqi/p/9162986.html 一,Zabbix生产环境监测案例概述 1.1 项目规划 [x] :主机分组 交换机 Nginx To ...
- loadrunner脚本函数讲解
一. get请求和post请求区别:web_link(get).web_submit_form(post)依赖上下文,web_url.web_submit_data不依赖上下文,建议使用web_url ...
- 学号 20175329 2018-2019-3《Java程序设计》第八周学习总结
学号 20175329 2018-2019-3<Java程序设计>第八周学习总结 教材学习内容总结 第十五章 泛型 可以使用"class 名称"声明一个类,为了和普通的 ...
- C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载(极速,简洁)
本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...