Luogu P4436 [HNOI/AHOI2018]游戏
题目
我们要求出\(l_i,r_i\)表示\(i\)最远能够到达的最左边和最右边的格子。
首先有一个比较简单的暴力,就是每次我们选择一个格子,然后从当前格子开始往左右暴力扩展,找到能够到达的最远的格子。
然后对于这个暴力,我们有一个小小的优化:就是假如我们从左往右处理,当前的点是\(i\),新扩展到了一个左边的节点\(j\),那么我们可以直接拿\(l_j\)赋给\(l_i\),如此重复。右边同理。
这样的暴力是可以被卡成\(O(n^2)\)的。但是题目数据水所以可以通过。
现在我们通过一些优化来使得这个暴力的复杂度变得正确。
对于一段连续的没有门的格子,我们可以把它缩成一个格子。
然后对于一个门和钥匙\((x,y)\),如果\(y>x\),我们就从\(x\)到\(x+1\)建一条边,意思是无法从\(x\)走到\(x+1\),\(y<x\)同理。
这样我们再拓扑排序,因为点\(u\)的答案区间一定不会包含拓扑序在它后面的点的答案区间,所以按照拓扑序转移就能够保证复杂的正确性了,最后复杂度为\(O(n+m)\)。
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
namespace IO
{
char ibuf[(1<<21)+1],*iS,*iT;
char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
int read(){int x=0,c=Get();while(!isdigit(c))c=Get();while(isdigit(c))x=x*10+c-48,c=Get();return x;}
}
using namespace IO;
const int N=1000007;
vector<int>E[N];queue<int>q;
int n,m,Q,x[N],y[N],pos[N],cnt=1,l[N],r[N],f[N],deg[N],bel[N];
void add(int u,int v){E[u].pb(v),++deg[v];}
int check(int x,int y)
{
if(!y||y==cnt+1) return 0;
if(x<y) --y;
return l[x]<=pos[y]&&pos[y]<=r[x];
}
void toposort()
{
for(int i=1;i<=cnt;++i) if(!deg[i]) q.push(i);
for(int u,f;!q.empty();)
{
u=q.front(),q.pop(),f=1;
while(f)
{
f=0;
while(check(u,l[u]-1)) l[u]=l[l[u]-1],f=1;
while(check(u,r[u]+1)) r[u]=r[r[u]+1],f=1;
}
for(int v:E[u]) if(!(--deg[v])) q.push(v);
}
}
int main()
{
n=read(),m=read(),Q=read();
for(int i=1;i<=m;++i) x[i]=read(),y[i]=read(),f[x[i]]=1;
f[n]=1;
for(int i=1;i<=n;++i) if(bel[i]=cnt,f[i]) l[cnt]=r[cnt]=cnt,++cnt;
--cnt;
for(int i=1,u,v;i<=m;++i)
{
u=bel[x[i]],v=bel[y[i]],pos[u]=v;
if(v<=u) add(u+1,u); else add(u,u+1);
}
toposort();
for(int u,v;Q;--Q) u=bel[read()],v=bel[read()],puts(l[u]<=v&&v<=r[u]? "YES":"NO");
}
Luogu P4436 [HNOI/AHOI2018]游戏的更多相关文章
- 【题解】Luogu P4436 [HNOI/AHOI2018]游戏
原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...
- [洛谷P4436] HNOI/AHOI2018 游戏
问题描述 一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门.其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开.现在小G告诉了小H ...
- BZOJ5288 & 洛谷4436 & LOJ2508:[HNOI/AHOI2018]游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5288 https://www.luogu.org/problemnew/show/P4436 ht ...
- luogu P4437 [HNOI/AHOI2018]排列
luogu 问题本质是把\(a_i\)作为\(i\)的父亲,然后如果有环就不合法,否则每次要取数,要满足取之前他的父亲都被取过(父亲为0可以直接取),求最大价值 贪心想法显然是要把权值大的尽量放在后面 ...
- [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 ...
- 【题解】Luogu P4438 [HNOI/AHOI2018]道路
原题传送门 实际就是一道简单的树形dp 设f[u][i][j]表示从根结点到结点u经过i条未翻修公路,j条未翻修铁路的贡献最小值 边界条件:f[leaf][i][j]=(A+i)(B+j)C (题目上 ...
- BZOJ5288 HNOI/AHOI2018游戏
首先将之间没有锁的房间合并.显然可达性具有传递性和反交换律(即若a能到达b,则b不能到达a). 考虑对每个房间找到其左右第一个(即与其最接近的)能作为起点到达它的房间.如果能求出这个,对此建两棵树,问 ...
- Luogu 4438 [HNOI/AHOI2018]道路
$dp$. 这道题最关键的是这句话: 跳出思维局限大胆设状态,设$f_{x, i, j}$表示从$x$到根要经过$i$条公路,$j$条铁路的代价,那么对于一个叶子结点,有$f_{x, i, j} = ...
- Luogu P4426 [HNOI/AHOI2018]毒瘤
题目 神仙题. 首先我们可以把题意转化为图的独立集计数.显然这个东西是个NP-Hard的. 然后我们可以注意到\(m\le n+10\),也就是说最多有\(11\)条非树边. 我们现在先考虑一下,树上 ...
随机推荐
- 解决xshell无法连接virtualbox中的虚拟机(Ubuntu18.04)的问题
遇到这个问题第一反应是是否安装相应的组件: sudo apt-get install openssh-server 开启防火墙端口 firewall-cmd --zone=/tcp --permane ...
- curl: (35) Server aborted the SSL handshake 解决办法
# 先删除curl brew uninstall curl # 重新安装curl,带上--with-openssl brew install curl --with-openssl # 然后重启下ph ...
- webuploader的一些体验
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.支持大文件分片并发上传. 具体api文档参考:http://fex.b ...
- Node.js安装及环境配置
1.Node.js简介 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js ...
- JavaWeb_(Struts2框架)Ognl小案例查询帖子
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- JSP——常用配置-获取项目跟路径
将该内容放入一个空白的JSP文件中,保存为basepath.jsp,然后在需要引用的JSP文件中使用include标签引用. <% String path = request.getContex ...
- LC 711. Number of Distinct Islands II
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...
- dom4j工具对XML写入修改删除操作实现
import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; import ...
- 学习Oracle数据库入门到精通教程资料合集
任何大型信息系统,都需要有数据库管理系统作为支撑.其中,Oracle以其卓越的性能获得了广泛的应用.本合集汇总了学习Oracle数据库从入门到精通的30份教程资料. 资料名称 下载地址 超详细Orac ...
- layui弹出层处理(获取、操作弹出层数据等)
要点: 字符串被渲染为弹窗层之后,回自动转换为DOM,可以使用jq进行各种操作 <!DOCTYPE html> <html> <head> <meta cha ...