洛谷P4436 游戏 [HNOI/AHOI2018]
正解:拓扑排序
解题报告:
首先不难想到可以把麻油锁的一段先直接缩成一个点,然后预处理每个点能到达的最左和最右节点,然后就能O(1)地查询辣
所以难点在于预处理
可以想到,对于它给定的关于锁的信息,如果y<x,那要从x到x+1必然是只能从左往右走的,所以如果x到x+1有锁且y<x,那么x能延展到的最右端一定就是x+1能延展到的最右端(反过来显然是布星的昂,,,因为x+1要往左要有钥匙,但是钥匙又在左边,显然是布星的
所以对于y<x,就可以先拓展x+1的右边,然后再拓展x的左边,如果能到达y就直接把x的最右端=x+1的最右端
反之亦然
然后就可以连边,比如说现在发现应该先拓展x+1再拓展x,就连一条从x+1到x的边
然后现在就变成了一个图,要求顺序直接拓扑排序就好
这里拓展以下学个新知识,大概港下拓扑排序的定义
拓扑排序指的是一个对点的排列顺序,保证对序列中的任意一个点x,所有x的前驱都在其前面
然后拓扑排序的求法是在连边的时候再记录一个in[x]:x点有几个前驱
然后首先找到所有in=0的点,加入队列,然后就开始做
每次把队列的队首弹出,加入拓扑排序尾端,然后对这个点进行处理:对所有它的后继点的in---
很好理解趴,就相当于in[x]变成了记录x的前驱中还有几个麻油进序列
如果然后没进去一个in就--嘛,然后当in==0的时候说明它所有前驱已经进队了就都在它前面辣,所以它就也可以加入队列辣
然后可能说得麻油很清楚,,,因为它这个里面用到辣两个队列,,,就不好区分,,,凑合着理解趴×
然后考虑这个图拓扑排序之后得到的就是拓展顺序嘛,所以就拓扑排序然后按照那个顺序统计就好
然后就做完辣!
然后最后说一下就是,缩成一个点这个事儿,说起来挺简单,实现起来还是有点儿麻烦,,,可以理解成离散化,和离散化差不多(就是麻烦点儿QAQ
所以我还是想先解释一下cal(统计每个节点能到达的左右端点的函数)函数中的语句QwQ
while(dr[l[x]] || dr[r[x]]<n)//左右端点有一个麻油枚举到尽头就可以继续做QwQ
{
if(dr[l[x]] && rht[dr[l[x]-1]+1] && rht[dr[l[x]-1]+1]<=dr[r[x]]){l[x]=l[l[x]-1];continue;}//这里,重点港下,,,好麻烦我天TT首先dr[l[x]]保证x还麻油拓展到边界,然后判断rht[dr[l[x]-1]+1]!=0,这里我说下,首先要知道x的单位是块(我把缩点形成的叫块!好表述些w)然后l,r,lft,rht的下标都是块,单位也是块(第几个块这样儿的w然后拿后面一个式子港,看后面w
if(dr[r[x]]<n && lft[dr[r[x]]]>=dr[l[x]-1]+1){r[x]=r[r[x]+1];continue;}//判断限制它右边界继续拓展的锁的钥匙在不在能拓展的左边界的范围内,那就找x能拓展的左边界和钥匙位置比大小就好,然后理一下这几个变量,这里为了区分,将缩点后的称作块,缩点前的称作节点. r[x]:x能延展到的最右块,dr[r[x]]:x能延展到的最右节点,lft[dr[r[x]]]:最右节点的锁的位置,over
return;//左右都不能拓展辣显然返回
}
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define gc getchar()
#define ll int
#define ls(x) (x<<1)
#define rs(x) (x<<1)|1
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define mb(i,x) for(rg ll i=head[x];i;i=edge[i].nxt) const ll N=1e6+;
ll n,m,q,in[N],l[N],r[N],lft[N],rht[N];
vector<ll>to[N];
vector<ll>dr;
queue<ll>Q,wk; il ll read()
{
rg char ch=gc;rg ll x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ll x,ll y){++in[y];to[x].push_back(y);}
il ll fd(ll x){return lower_bound(dr.begin(),dr.end(),x)-dr.begin();}
il void pre()
{ n=read();m=read();q=read();
rp(i,,m){ll x=read(),y=read();y<=x?lft[x]=y:rht[x+]=y;dr.push_back(x);}
++m;dr.push_back();dr.push_back(n);sort(dr.begin(),dr.end());
rp(i,,m){l[i]=r[i]=i;if(rht[dr[i-]+])ad(i-,i);if(lft[dr[i]])ad(i+,i);}
}
il void topsort()
{
rp(i,,m)if(!in[i])Q.push(i);
while(!Q.empty())
{
ll nw=Q.front(),sz=to[nw].size();Q.pop();wk.push(nw);
rp(i,,sz-){if(!--in[to[nw][i]])Q.push(to[nw][i]);}
}
}
il void cal(ll x)
{
while(dr[l[x]] || dr[r[x]]<n)
{
if(dr[l[x]] && rht[dr[l[x]-]+] && rht[dr[l[x]-]+]<=dr[r[x]]){l[x]=l[l[x]-];continue;}
if(dr[r[x]]<n && lft[dr[r[x]]]>=dr[l[x]-]+){r[x]=r[r[x]+];continue;}
return;
}
}
il void work(){while(!wk.empty()){cal(wk.front());wk.pop();}}
il void as(){while(q--){ll x=fd(read()),y=fd(read());if(l[x]<=y && y<=r[x])printf("YES\n");else printf("NO\n");}} int main(){pre();topsort();work();as();return ;}
不开O2过不去,,,QAQ
洛谷P4436 游戏 [HNOI/AHOI2018]的更多相关文章
- 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)
点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...
- 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈
正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...
- 洛谷P4426 毒瘤 [HNOI/AHOI2018] 虚树+树上dp
正解:虚树+树上dp 解题报告: 传送门! 首先解释一下题意趴,,,语文70pts选手已经开始看不懂题辣QAQ 大概就是个给一个图,求独立集方案,且保证图是联通的,边的数量最多只比点多10 首先思考如 ...
- 洛谷P4437 排列 [HNOI/AHOI2018] 贪心
正解:贪心 解题报告: 传送门! 发现做题龟速,,,所以懒得写题目大意辣自己get一下QAQ 首先看到ai<=n,又当ai=j时j在i的前面,所以就变成对于每个点i有一个约束,即要求第ai个节点 ...
- 洛谷P4438 道路 [HNOI/AHOI2018] 树形dp
正解:树形dp 解题报告: 传送门! 昂首先看懂题目趴QwQ大概就是说有棵满二叉树,有n个叶子节点(乡村)和n-1个非叶子节点,然后这棵树的每个节点有三个属性abc,对每个非叶子节点可以从与子节点的两 ...
- 【洛谷 P4437】 [HNOI/AHOI2018]排列(贪心,堆)
题目链接 如果\(j<=k,a_{p[j]}!=p[k]\)可以理解为如果\(a_{p[j]}=p[k]\),那么\(k\)一定要放在\(j\)前面,也就是\(a_j\)在\(j\)前面. 于是 ...
- BZOJ5290 & 洛谷4438:[HNOI/AHOI2018]道路——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5290 https://www.luogu.org/problemnew/show/P4438 的确 ...
- BZOJ5289 & 洛谷4437:[HNOI/AHOI2018]排列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5289 https://www.luogu.org/problemnew/show/P4437 考虑 ...
- [洛谷P4436] HNOI/AHOI2018 游戏
问题描述 一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门.其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开.现在小G告诉了小H ...
随机推荐
- bat批处理文件按顺序执行exe
start /d "deepstream.io-windows-3.1.0" deepstream.exe rem 等待1秒钟 choice /t 1 /d y /n cd &qu ...
- MVC的简单初步学习(2)
今天似乎一切是正常的,我们的课依旧在进行着,但是恍惚脑海中并没有那样的平静,不知道在想些什么?而且今天是学习MVC的初步开始,我应该认真地学习才是正确的啊.但是我并不糊涂,今天是周一,也就是刚开始上课 ...
- C++ template —— tuple(十三)
本系列博文中我们使用同类容器(如数组类型)来阐述模板的强大威力,同时,C/C++还具有包含异类对象的能力.这里的异类指的是类型不同,或者结构不同.tuple就是这样的一个类模板,它能够用于聚集不同类型 ...
- java web当中表单提交到后台出现乱码的解决方法
1.如果提交方式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么 ...
- Android——简单对话框实现
点击一个Button,弹出一个简单的对话框: bn3.setOnClickListener(new View.OnClickListener() { public void onClick(View ...
- html2canvas - 微信中长按存图 - 将h5活动结果保存到本地
现在有很多在微信里流行的h5活动页.这些小h5大部分都是简单的交互然后得出一个abcd早就拟定好的结果,根据你的选项分几种情况,最终得到其中一个作为你测试的答案.比如这个就是最后那张结果图: 当时自己 ...
- iframe内点击a标签禁止滚动到顶部
在iframe内加载的表中,操作下的按钮用a标签布局,但是会出现一个非常不好的体验,就是当页面有滚动条的时候,点击a标签,列表会自动滚动到顶部. 首先看我的a标签: <a href=" ...
- Artech的MVC4框架学习——第八章View的呈现
总结:定义在controller中的action方法一般会返回actionResult的对象对请求给予 响应.viewResult是最常见也是最重要的ActionView的一种(p411).view模 ...
- JS的压缩、混淆、加密
参考: 博客园:js压缩.混淆和加密 知乎:前端如何给 JavaScript 加密(不是混淆)? (阿里聚安全有回答问题) 站长工具 (在线JS压缩加密工具) Obfuscator (在家JS压缩 ...
- 【咸鱼教程】DragonBones帧动画、骨骼json、极速、二进制
公司的人想用龙骨,但是同事在官网找不着二进制的资料...于是写了个简单demo. demo中包含了帧动画.骨骼动画json.极速和二进制的资源和代码 测试环境:DragonBonesPro 5.5 ...