首先将之间没有锁的房间合并。显然可达性具有传递性和反交换律(即若a能到达b,则b不能到达a)。

  考虑对每个房间找到其左右第一个(即与其最接近的)能作为起点到达它的房间。如果能求出这个,对此建两棵树,问题就变为终点是否在起点的子树内。

  容易想到单调栈。不妨考虑求左边第一个。栈内维护当前房间左边能作为起点到达它的房间。一旦栈顶的房间不能再到达当前点,显然其也不能再到达之后的点。而如果栈顶的房间能到达当前点,栈里的其他点也一定可以,因为它们都能到达栈顶房间。于是一直弹栈至栈顶房间能到达当前房间即可。至于如何判断是否可达,如果栈中不止一个元素,只要看打开当前房间的锁的钥匙是否在栈顶房间到当前房间之间,因为由反交换律栈顶的房间不能再向左走;否则需要找一下其能走到的最左房间,这个东西暴力查找并且查完之后记录就可以线性了(直接暴力说不定也是,因为loj上一直T一个点以为复杂度假掉了,后来发现把这段注释掉照样T……事实上是建树出了一些问题,应该设一个虚根而不是遍历森林,因为边是有向的)。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 1000010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,q,key[N],tmp[N],L[N],R[N],pos[N],stk[N],pre[N],nxt[N],top,cnt;
struct tree
{
int dfn[N],size[N],p[N],cnt,t;
struct data{int to,nxt;}edge[N<<];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void dfs(int k)
{
size[k]=;dfn[k]=++cnt;
for (int i=p[k];i;i=edge[i].nxt)
if (!size[edge[i].to])
{
dfs(edge[i].to);
size[k]+=size[edge[i].to];
}
}
bool isin(int x,int y){return dfn[x]<=dfn[y]&&dfn[x]+size[x]->=dfn[y];}
}a,b;
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5288.in","r",stdin);
freopen("bzoj5288.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read(),q=read();
for (int i=;i<=m;i++)
{
int x=read(),y=read();
key[x]=y;
}
for (int i=;i<=n;i++)
{
int t=i;
while (t<n&&!key[t]) t++;
cnt++;L[cnt]=i,R[cnt]=t;
for (int j=L[cnt];j<=R[cnt];j++) pos[j]=cnt;
i=t;
}
memcpy(tmp,key,sizeof(key));
for (int i=;i<=n;i++) if (tmp[i]) key[pos[i]]=pos[tmp[i]];
n=cnt;
top=;stk[++top]=;a.addedge(,);
for (int i=;i<=n;i++)
{
if (key[i-]>=i) top=;
else
{
while (top>&&key[i-]<stk[top]) top--;
if (top==)
{
int left=stk[top];
while (pre[left]||(left>&&key[left-]<i&&key[left-]>=left)) left=pre[left]?pre[left]:left-;
if (stk[top]!=left) pre[stk[top]]=left;
if (key[i-]<left) top--;
}
}
if (top) a.addedge(stk[top],i);
else a.addedge(,i);
stk[++top]=i;
}
a.dfs();
top=;stk[++top]=n;b.addedge(,n);
for (int i=n-;i;i--)
{
if (key[i]<=i) top=;
else
{
while (top>&&key[i]>stk[top]) top--;
if (top==)
{
int right=stk[top];
while (nxt[right]||(right<n&&key[right]>i&&key[right]<=right)) right=nxt[right]?nxt[right]:right+;
if (stk[top]!=right) nxt[stk[top]]=right;
if (key[i]>right) top--;
}
}
if (top) b.addedge(stk[top],i);
else b.addedge(,i);
stk[++top]=i;
}
b.dfs();
while (q--)
{
int x=pos[read()],y=pos[read()];
if (a.isin(x,y)||b.isin(x,y)) puts("YES");
else puts("NO");
}
return ;
}

BZOJ5288 HNOI/AHOI2018游戏的更多相关文章

  1. 【题解】Luogu P4436 [HNOI/AHOI2018]游戏

    原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...

  2. BZOJ5288 & 洛谷4436 & LOJ2508:[HNOI/AHOI2018]游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5288 https://www.luogu.org/problemnew/show/P4436 ht ...

  3. [洛谷P4436] HNOI/AHOI2018 游戏

    问题描述 一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门.其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开.现在小G告诉了小H ...

  4. [HNOI/AHOI2018]游戏

    题目描述 https://lydsy.com/JudgeOnline/upload/201804/%E6%B9%96%E5%8D%97%E4%BA%8C%E8%AF%95%E8%AF%95%E9%A2 ...

  5. Luogu P4436 [HNOI/AHOI2018]游戏

    题目 我们要求出\(l_i,r_i\)表示\(i\)最远能够到达的最左边和最右边的格子. 首先有一个比较简单的暴力,就是每次我们选择一个格子,然后从当前格子开始往左右暴力扩展,找到能够到达的最远的格子 ...

  6. [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)

    P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...

  7. 【BZOJ5288】[HNOI2018]游戏(拓扑排序)

    [BZOJ5288][HNOI2018]游戏(拓扑排序) 题面 BZOJ 洛谷 题解 去年省选的时候这题给我乱搞整过去整过去了,也是虐心了.... 所以当然是来讲正儿八经的正确做法啦. 很明显,我们需 ...

  8. [HNOI/AHOI2018]转盘(线段树优化单调)

    gugu  bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必 ...

  9. 【LG4437】[HNOI/AHOI2018]排列

    [LG4437][HNOI/AHOI2018]排列 题面 洛谷 题解 题面里这个毒瘤的东西我们转化一下: 对于\(\forall k,j\),若\(p_k=a_{p_j}\),则\(k<j\). ...

随机推荐

  1. castle.dynamicProxy学习笔记

    目的: 可以将castle.dynamicProxy当成代码生成器,快速的生成自己想的代码.这个库经历了这么多年的测试,应该可以用了:D 概念: IInterceptor:拦截器 当方法(属性的本质是 ...

  2. Qt-网易云音乐界面实现-8 主导航的实现-QtabWidget

    哎呀,堕落了,快有小两周没哟更新了,是在是没有动力了,浏览量连三位数都没有,是在是没有写下去的信心. 还有就是这个网易云音乐的代码量绝对是不可小视的,完全低估了这个软件的能量.昨天仔细想了一下,写不下 ...

  3. 弄啥嘞?热爱你的Bug

    有人喜欢创造世界,他们做了开发者:有的人喜欢开发者,他们做了测试员.什么是软件测试?软件测试就是一场本该在用户面前发生的灾难提前在自己面前发生了,这会让他们生出一种救世主的感觉,拯救了用户,也就拯救者 ...

  4. redmine on centos

    一 前言 前前后后搭建redmine,花费了很多时间.期间会遇到各种坑,因此总结下自己的方法,分享给各位童鞋. 二 操作系统  centos release 6.9 详细信息如下图:   三 安装步骤 ...

  5. Nginx内置的嵌入变量

    Nginx核心模块ngx_http_core_module自带有许多内置嵌入的变量,这些变量方便我们配置和使用nginx,在nginx的配置文件中我们可以以$开头直接使用这些变量,这些变量表示客户端请 ...

  6. 小球下落(Dropping Balls, Uva 679)

    题目描述 有一棵二叉树,最大深度为D,且所有的叶子深度都相同.所有结点从上到下从左到右编号为1,2,3,-,2eD-1.在结点1处放一个小球,它会往下落.每个结点上都有一个开关,初始全部关闭,当每次有 ...

  7. eclipse xml文件中按alt+/没有提示信息

    转载地址:http://blog.sina.com.cn/s/blog_972ddc1b01012mmh.html 今天要写这篇博文是因为遇到这样的不是技术的问题,但找到问题根源再解决这个问题又花费很 ...

  8. passwd命令详解

    基础命令学习目录首页 passwd命令用于设置用户的认证信息,包括用户密码.密码过期时间等.系统管理者则能用它管理系统用户的密码.只有管理者可以指定用户名称,一般用户只能变更自己的密码. 语法 pas ...

  9. python将response中的cookies加入到header

    url = “http://abad.com”header = { "user-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64 ...

  10. 成功安装Python-myqldb

    试过很多其他的都不行 http://www.centoscn.com/CentosBug/softbug/2017/0424/8737.html