[洛谷P4436] HNOI/AHOI2018 游戏
问题描述
一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门。其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开。现在小G告诉了小H每把锁的钥匙在哪个房间里(每把锁有且只有一把钥匙与之对应),并作出p次指示:第i次让小H从第\(S_i\)个房间出发到\(T_i\)个房间里。但是小G有时会故意在指令中放入死路,而小H也不想浪费多余的体力去尝试,于是想事先调查清楚每次的指令是否会存在一条通路。
你是否能为小H作出解答呢?
输入格式
第一行三个数字:n,m,p,代表有n个房间,m道门上了锁,以及p个询问。接下来m行,每行两个数字x,y代表x到x+1的钥匙在房间y。接下来p行,其中第i行是两个整数\(S_i,T_i\),代表一次询问。
输出格式
输出p行,每行一个“YES”或"NO",分别代表能或不能到达。
样例输入
5 4 5
1 3
2 2
3 1
4 4
2 5
3 5
4 5
2 1
3 1
样例输出
YES
NO
YES
YES
NO
说明
解析
可以发现对于每个点i,最后能到达的区域一定是一段区间[Li,Ri]。那么问题就是如何求这些区间。
如果一扇门的钥匙在这扇门的左边,那么就不能从右边穿过这扇门;如果在这扇门的右边,就不能从左边穿过去。那么,如果我们对每扇门的两边,由不能到达的向能到达的连边,可以发现一个点的区间范围一定可以由拓扑序在这个点前面的点得到(只有前面的点有边连向这个点)。所以,可以利用拓扑排序,对队首的点,向左向右扩展,扩展的点注意门的编号等于门右边的编号减一,具体见代码。
但是,对于一个可以互达的区间,有可能会连成一个环,这样拓扑排序就没有意义了。所以,最开始需要预处理能够互达的区间,并将这个区间缩成一个点。同时将所有信息更新成缩点之后的。
回答询问时,只需判断T是否在S的可达区间中即可。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 1000002
#define M 1000002
using namespace std;
int head[N],ver[M],nxt[M],d[N],t;
int n,m,q,i,x[N],y[N],pos[N],cnt=1,gap[N],l[N],r[N];
bool lock[N];
int read()
{
char c=getchar();
int w=0;
while(c<'0'||c>'9') c=getchar();
while(c<='9'&&c>='0'){
w=w*10+c-'0';
c=getchar();
}
return w;
}
void insert(int x,int y)
{
t++;
ver[t]=y;
nxt[t]=head[x];
head[x]=t;
d[y]++;
}
bool check(int x,int y)
{
if(y==0||y==cnt+1) return 0;
if(x<y) y--;
return l[x]<=pos[y]&&pos[y]<=r[x];//钥匙是否在当前可达区间中
}
void toposort()
{
queue<int> q;
for(int i=1;i<=cnt;i++){
if(d[i]==0) q.push(i);
}
while(!q.empty()){
int x=q.front();
q.pop();
bool flag=1;
while(flag){
flag=0;
while(check(x,l[x]-1)) l[x]=l[l[x]-1],flag=1;//可以就更新为左边的左端点
while(check(x,r[x]+1)) r[x]=r[r[x]+1],flag=1;//更新为右边的右端点
}
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
d[y]--;
if(d[y]==0) q.push(y);
}
}
}
int main()
{
n=read();m=read();q=read();
for(i=1;i<=m;i++){
x[i]=read();y[i]=read();
lock[x[i]]=1;
}
lock[n]=1;
for(i=1;i<=n;i++){
gap[i]=cnt;
if(lock[i]){
l[cnt]=r[cnt]=cnt;
cnt++;
}
}
cnt--;
for(i=1;i<=m;i++){
int tx=gap[x[i]],ty=gap[y[i]];
pos[tx]=ty;
if(ty<=tx) insert(tx+1,tx);
else insert(tx,tx+1);
}
toposort();
for(i=1;i<=q;i++){
int x=read(),y=read();
x=gap[x],y=gap[y];
if(l[x]<=y&&y<=r[x]) puts("YES");
else puts("NO");
}
return 0;
}
[洛谷P4436] HNOI/AHOI2018 游戏的更多相关文章
- [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)
P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...
- 【题解】Luogu P4436 [HNOI/AHOI2018]游戏
原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...
- 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)
题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...
- 洛谷P4438 [HNOI/AHOI2018]道路(dp)
题意 题目链接 Sol 每当出题人想起他出的HNOI 2018 Day2T3,他都会激动的拍打着轮椅 读题比做题用时长系列... \(f[i][a][b]\)表示从根到\(i\)的路径上,有\(a\) ...
- 洛谷P4425 [HNOI/AHOI2018]转盘(线段树)
题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起 ...
- Luogu P4436 [HNOI/AHOI2018]游戏
题目 我们要求出\(l_i,r_i\)表示\(i\)最远能够到达的最左边和最右边的格子. 首先有一个比较简单的暴力,就是每次我们选择一个格子,然后从当前格子开始往左右暴力扩展,找到能够到达的最远的格子 ...
- 洛谷 P4437 [HNOI/AHOI2018]排列(贪心+堆,思维题)
题面传送门 开始 WA ycx 的遗产(bushi 首先可以将题目转化为图论模型:\(\forall i\) 连边 \(a_i\to i\),然后求图的一个拓扑序 \(b_1,b_2,\dots b_ ...
- 洛谷 P4426 - [HNOI/AHOI2018]毒瘤(虚树+dp)
题面传送门 神仙虚树题. 首先考虑最 trival 的情况:\(m=n-1\),也就是一棵树的情况.这个我相信刚学树形 \(dp\) 的都能够秒掉罢(确信).直接设 \(dp_{i,0/1}\) 在表 ...
- 洛谷P1118 数字三角形游戏
洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...
随机推荐
- OpenStack Nova 高性能虚拟机之 CPU 绑定
目录 文章目录 目录 前文列表 KVM KVM 的功能列表 KVM 工具集 KVM 虚拟机的本质是什么 vCPU 的调度与性能问题 Nova 支持的 vCPU 绑定 vcpu\_pin\_set 配置 ...
- 网易云课堂_C++程序设计入门(下)_第7单元:出入虽同趣,所向各有宜 – 文件输入和输出_第7单元 - 作业2:编程互评
第7单元 - 作业2:编程互评 查看帮助 返回 提交作业(剩余10天) 完成并提交作业 作业批改 互评训练 互评作业 自评作业 成绩公布 查看成绩 由于在线编程不支持 ...
- 关于在DBGridEh的一个字段使用checkbox的方法 .
在DBGridEh的columns中新增加一个字段 1.如果你选择的数据库字段,则选择checkbox为true,并在keylist中输入0和1,就可以了 2.如果你选择的是一个临时字段,在数据集中新 ...
- 【MM系列】SAP MM模块-配置PO的创建时间
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-配置PO的创建时间 ...
- VBA文件操作
做这些东西主要是为了,实现,我们的最终目标. 查到 两个大表里面的变化数据. 所以 这次 ①实现了 文件操作的一部分内容. 包括,excel的打开.分四个步骤. 1.路径 2.打开工作博 3.操作 4 ...
- cocos2dx基础篇(20) 扩展动作CCGridAction
[3.x] (1)去掉"CC" [CCGridAction] CCGridAction有两个子类:CCGrid3DAction.CCTiledGrid3DAction.而我 ...
- TCP网络编程(Socket通讯)
TCP 网路编程: 1.TCP 三次握手: 第一次握手,客户端向服务器端发出连接请求,等待服务器确认. 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求. 第三次握手,客户端再次向服 ...
- IIS7下配置web.config隐藏index.php
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.we ...
- Spark集成的包与引入包冲突
今天在编写Spark应用的时候,想把处理结果输出为JSON字符串,查到Java比较常用的JSON处理包gson,按照其API编写代码后运行程序,总是出现"NoSuchMethodExcept ...
- MySQL-快速入门(7)索引
1.什么是索引 索引是对数据库表中一列或者多列的值进行排序的一种结构.索引是在存储引擎中实现的,每种存储引擎中的索引不一定完全相同. MySQL中索引的存储类型有两种:btree和hash.MyISA ...