洛谷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 ...
随机推荐
- API权限控制与安全管理
摘自网上 一.API权限控制范围 1.首先验证web端请求参数: (1)web请求参数:渠道.ServiceName.版本.Airline.时间戳(yyyyMMddhhmmssSSS).reqXML ...
- 32位win7+vs2008编译mysql 5.6.22源码并安装
以下这部分安装说明是来自http://www.2cto.com/database/201407/316681.html的win7+vs2010源码编译mysql,文章最后会说明用vs2008编译遇见的 ...
- 设置ADB网络连接目标板
adb connect 网络连接目标板报错,原因参考[http://ytydyd.blog.sohu.com/146260552.html].而且指定 adb connect <IP>:5 ...
- Oralce分析函数
1 列传行 listagg(city,',') within GROUP (order by city) over (partition by nation) rank with temp ...
- Linux(Ubuntu)下如何解压 .zip 文件
安装解压缩软件 使用如下命令安装: sudo apt-get install p7zip-full 7zip,估计会比较熟悉. p7zip,是什么? 听说是 7zip 的 shell 封装. 解压 使 ...
- 题目1441:人见人爱 A ^ B(二分求幂)
题目链接:http://ac.jobdu.com/problem.php?pid=1441 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- sencha touch Button Select(点击按钮进行选择)扩展
此扩展基于官方selectfield控件修改而来,变动并不大,使用方法类似. 代码如下: Ext.define('ux.SelectBtn', { extend: 'Ext.Button', xtyp ...
- Elasticsearch修改template的mapping并迁移
找到原始模板并修改 找到要修改的原始索引对应的模板(最好当初创建时就设计好便于修改) #例如原来索引是my_es_index_v1,那么我们创建 一个别名,使用POST 方法 curl -XPOST ...
- Metrics.Net构建指标监控中心
Metrics.NET(https://github.com/etishor/Metrics.NET)是一个给CLR 提供度量工具的包,它是移植自Java的metrics,支持的平台 .NET 4.5 ...
- Windows Phone 8.1 Update Preview backup失败的解决方法
当前使用的是开发者预览版(8.10.14219.341),最近一直无法备份text + apps + settings,进度条达到97%或99%以后提示: There was a problem ba ...