uoj349 即时战略
题意:这是一道交互题。交互库中有一棵树。一开始只有1节点已知。需要在T次询问内使得n个节点都已知。一次询问explore(x,y),返回从x到y路径上第一个点,并将返回点标记为已知。
数据有区分。
标程:
#include<cstdio>
#include<time.h>
#include<algorithm>
#include "rts.h"
using namespace std;
const int N=;
int son[N][],fa[N],L[N],R[N],vis[N],E[],id[N],now,nxt,it;
int is_rt(int x) {return son[fa[x]][]!=x&&son[fa[x]][]!=x;}
int ran() {return (int)(rand()/RAND_MAX+0.5);}
void up(int x)
{
L[x]=R[x]=x;
if (son[x][]) L[x]=L[son[x][]];//leftest
if (son[x][]) R[x]=R[son[x][]];//rightest
}
void rot(int x)
{
int y=fa[x],z=fa[y],l=(son[y][]==x),r=l^;
if (!is_rt(y)) son[z][(son[z][]==y)]=x;
fa[x]=z;fa[y]=x;fa[son[x][r]]=y;
son[y][l]=son[x][r];son[x][r]=y;
up(y);up(x);
}
void spl(int x)
{
for (int y;!is_rt(x);rot(x))
if (!is_rt(y=fa[x]))
if (son[y][]==x^son[fa[y]][]==y) rot(x);else rot(y);
}
int find_rt(int x)
{
for (;!is_rt(x);x=fa[x]);
return x;
}
void accs(int x) {for (int t=;x;t=x,x=fa[x]) spl(x),son[x][]=t,up(x);}
void ins(int x)
{
now=find_rt();
while (!vis[x])
{
nxt=explore(now,x);
if (nxt==R[son[now][]]) now=son[now][];//father
else if (nxt==L[son[now][]]) now=son[now][];//son
else {//another splay
if (vis[nxt]) now=find_rt(nxt);//already have existed
else vis[nxt]=,fa[nxt]=now,now=nxt;//add a new point
}
}
accs(x);
}
void play(int n,int T,int dataType)
{
srand(time(NULL));
vis[]=;
for (int i=;i<=n;i++) id[i]=i;
random_shuffle(id+,id+n+);
if (dataType==)//chain
{
now=explore(,id[]);vis[now]=;
E[]=;E[]=now;
for (int i=;i<=n;i++)
if (!vis[id[i]])
{
it=ran();now=explore(E[it],id[i]);//注意explore的顺序(u->v)
if (!vis[now])//这一边
{
vis[E[it]=now]=;
while (E[it]!=id[i]) E[it]=explore(E[it],id[i]),vis[E[it]]=;//记得更改范围指针
}else {//另一边
it^=;
while (E[it]!=id[i]) E[it]=explore(E[it],id[i]),vis[E[it]]=;
}
}
return;
}
for (int i=;i<=n;i++) L[i]=R[i]=i;//初始化
for (int i=;i<=n;i++)
if (!vis[id[i]]) ins(id[i]);
}
易错点:1.注意lct之前的初始化L[i]=R[i]=i。并且不用每找到一个点就splay,新加入一个点access更新保证复杂度即可。
2.access不要写错,判定继续的条件应该是x而不是!is_rt(x)。
3.链的情况要更新边界。
技巧:可以用random_shuffle来避免一些数据的卡。
题解:lct/动态点分树
数据告诉我们:树T=nlogn,链T=n+logn.
树:
1.仿照CF772E的做法,可以通过点分来插入一个点。但不同的是,这不是一棵二叉树,在前向星上插入删除的复杂度太高,因此考虑动态点分树来支持动态加点。(然而我并不会写)
2.点分的思想也就是对树二分。因此我们树链剖分后在重链上二分也可以得到一样的效果。由于有加点,用lct即可。用splay维护每一条重链,因为splay的高度的log级别的,从根开始跳splay上的节点完成二分。讨论一下返回的已知点在询问点的儿子/父亲/另一个splay上->是否已知。最后access(x)更新树的形态。O(nlogn)。
链:
维护一段连续的已知点[L,R],对于一个未知点x,如果explore(L,x)是未知点,那么往R方向扩展,反之在L方向扩展。
每个点必定被explore一次O(n)。random第一次的询问是L还是R后,更改方向的次数期望是O(log n)或是说O(ln n)的。(证明:设E(n)表示扩展为长度为n的序列需要更改几次方向:E(n)=1+1/n*sigma(E[i])(i=[1,n-1])->E(n)-E(n-1)=1/n->E(n)=sigma(1/i)≈ln n)
所以总的是O(n+log n)。
uoj349 即时战略的更多相关文章
- 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转
今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...
- D3D游戏编程系列(三):自己动手编写即时战略游戏之寻路
说起即时战略游戏,不得不提的一个问题是如何把一个物体从一个位置移动到另一个位置,当然,我说的不是瞬移,而是一个移动的过程,那么在这个移动的过程中我们如何来规划路线呢,这就不得不提到寻路了. 我所了解到 ...
- 【WC2018】即时战略
题目描述 小M在玩一个即时战略(Real Time Strategy)游戏.不同于大多数同类游戏,这个游戏的地图是树形的. 也就是说,地图可以用一个由 n个结点,n?1条边构成的连通图来表示.这些结点 ...
- [WC2018]即时战略——动态点分治(替罪羊式点分树)
题目链接: [WC2018]即时战略 题目大意:给一棵结构未知的树,初始时除1号点其他点都是黑色,1号点是白色,每次你可以询问一条起点为白色终点任意的路径,交互库会自动返回给你这条路径上与起点相邻的节 ...
- 【WC2018】即时战略(动态点分治,替罪羊树)
[WC2018]即时战略(动态点分治,替罪羊树) 题面 UOJ 题解 其实这题我也不知道应该怎么确定他到底用了啥.只是想法很类似就写上了QwQ. 首先链的部分都告诉你要特殊处理那就没有办法只能特殊处理 ...
- D3D游戏编程系列(四):自己动手编写即时战略游戏之网络同步
说到网络同步,这真是一个网络游戏的重中之重,一个好的网络同步机制,可以让玩家的用户体验感飙升,至少,我玩过的魔兽争霸在网络同步方面做得非常好,即便是网络状况很不稳定,依然可以保证用户数据不会出现意想不 ...
- 「WC2018即时战略」
「WC2018即时战略」 题目描述 小 M 在玩一个即时战略 (Real Time Strategy) 游戏.不同于大多数同类游戏,这个游戏的地图是树形的.也就是说,地图可以用一个由 \(n\) 个结 ...
- 【CSP-S膜你考】即时战略(模拟)
Problem B. 即时战略 (rts.c/cpp/pas) 注意 Input file: rts.in Output file: rts.out Time Limit : 2 seconds Me ...
- 「WC2018」即时战略
「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可. 对于一个二叉树,树高logn,直接随便找点,然后不断问即可. 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出 ...
随机推荐
- NSDateFormatter 今年日期格式化成字符串是明年日期问题?
在项目里我要是把NSDate格式化成字符串 我的format是@"YYYY年MM月dd日 HH:mm" 传入日期2013-12-30 15:00:00后,返回给我的字符串是 201 ...
- python 测试框架nose
python测试框架nose nose不是python自带模块,这里我才用pip的方式安装 pip install nose 这样就完成了安装,然后再确认下是否安装成功了,直接打开cmd输入noset ...
- java执行顺序之深入理解clinit和init
原文地址:https://blog.csdn.net/qq_36522306/article/details/80582758 前言: 最近研究了深入理解JVM这本书中的知识,对java中各部分执行的 ...
- jQuery 引入多个库文件冲突
index.html <head><meta http-equiv="Content-Type" content="text/html; charset ...
- 简单的spring--mvc整合
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 解决vs code 内置终端,字体间隔过大问题。(linux centos7 ubuntu成功)
去文件-首选项-设置里修改. "terminal.integrated.fontFamily": ""注意此处默认为空白,所以显示的就比较奇怪. 此处我改为&q ...
- JAVA数据结构之哈希表
Hash表简介: Hash表是基于数组的,优点是提供快速的插入和查找的操作,编程实现相对容易,缺点是一旦创建就不好扩展,当hash表被基本填满的时候,性能下降非常严重(发生聚集引起的性能的下降),而且 ...
- leetcood学习笔记-45-跳跃游戏二
题目描述: 第一次提交;超时 class Solution: def jump(self, nums: List[int]) -> int: l = [] for i in range(len( ...
- js 截取url中的参数
getQueryString(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); var ...
- dart中extends、 implements、with的用法与区别
一.概述 继承(关键字 extends) 混入 mixins (关键字 with) 接口实现(关键字 implements) 这三种关系可以同时存在,但是有前后顺序: extends -> m ...