洛谷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 ...
随机推荐
- Explaining Delegates in C# - Part 1 (Callback and Multicast delegates)
I hear a lot of confusion around Delegates in C#, and today I am going to give it shot of explaining ...
- Splash args 属性
args属性可以获取加载时配置的参数,一般我们只传入URL,如下,args.url 就相当于加载时配置的URL参数,我们把它赋值给 url 变量然后返回:
- Splash 对象属性
args js_enabled resource_timeout images_enabled plugins_enabled scroll_position
- 用Eclipse平台进行C/C++开发
我们将概述如何在 C/C++ 开发项目中使用 Eclipse 平台.尽管 Eclipse 主要是一个 Java 开发环境,但其体系结构确保了对其它编程语言的支持.在本文中,您将学习如何使用 C/C++ ...
- UML类图的几种关系总结【转】
在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...
- Jdk1.8在CentOS7中的安装与配置
自从2014年3月19日甲骨文公司发布Java 8.0的正式版以来,面向对象的Java语言不仅朝着一个更好的方向发展,而且吸取了当前比较流行的函数式编程的特性——Java 8.0加入了函数式编程的特点 ...
- SQL - 根据天来分组比较
SELECT COUNT(*) FROM (SELECT WeixinUserID,CONVERT(varchar(100),CreateTime, 23) AS DT FROM SiteVisite ...
- Material Design系列第四篇——Defining Shadows and Clipping Views
Defining Shadows and Clipping Views This lesson teaches you to Assign Elevation to Your Views Custom ...
- 让人一看就懂的excel相对引用和绝对引用案例解析
http://www.ittribalwo.com/article/2831.html 内容提要:本文的excel相对引用和绝对引用.混合引用的使用方法案例截选自<Excel效率手册 早做完,不 ...
- LeetCode 34 Search for a Range (有序数组中查找给定数字的起止下标)
题目链接: https://leetcode.com/problems/search-for-a-range/?tab=Description Problem: 在已知递减排序的数组中,查找到给定 ...