https://www.lydsy.com/JudgeOnline/problem.php?id=5288

https://www.luogu.org/problemnew/show/P4436

https://loj.ac/problem/2508

UPD:重温了一下发现代码只能用C++(NOI)才能过了,不知道原因,但也懒得重写了,反正是对的。

看洛谷题解里面清一色的暴力,连唯一正解也是用了奇技淫巧才过(当然本题解参考了那个题解)。

于是难受的我来简单说一下“正解”(如有错误请指出orz)。

先从暴力开始,对于每个点我们暴力找到其能够到达的最大的区间[l,r]。

一个优化:我们在加入新的点进入这个区间的时候,可以把该点的答案区间合并进区间内。

接下来是正解,首先是对于每个门i,如果钥匙在其左边则add(i+1,i),否则add(i,i+1),其中边的含义是从入点无法到达出点。

于是对这个图拓扑排序后可发现,点u的答案区间一定不包含比其排名大的点,则在暴力优化的帮助下,我们可以证明出需要我们暴力更新的次数只有O(n)次。

但是为什么又要按照那篇题解所说,“初始化序列倒着加会快”呢?

我把数据下载下来才发现一个坑。

对于不在拓扑图上的点,其更新后的答案区间可能会覆盖与它同级甚至比它排名小的点的答案区间,这样暴力优化就无用武之地,复杂度退化到O(n^2)。

所以我们必须缩点,才能保证算法的复杂度。

(话句话讲就是出题人都如此煞费苦心卡掉了复杂度不对的正解却让暴力AC了)

#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int to,nxt;
}e[N];
struct data{
int x,y;
}d[N];
int n,m,p,head[N],cnt,id,to[N];
int key[N],l[N],r[N],deg[N];
inline void add(int u,int v){
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;++deg[v];
}
inline bool pan(int x,int y){
if(y<||y>id)return ;
if(x<y)--y;
return l[x]<=key[y]&&key[y]<=r[x];
}
queue<int>q;
void dfs(){
for(int i=;i<=id;++i)if(!deg[i])q.push(i);
while(!q.empty()){
int u=q.front();q.pop();
bool flag=;
while(flag){
flag=;
while(pan(u,l[u]-))l[u]=l[l[u]-],flag=;
while(pan(u,r[u]+))r[u]=r[r[u]+],flag=;
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!(--deg[v]))q.push(v);
}
}
}
inline void init(){
key[n]=-;id=;
for(int i=;i<=n;++i){
to[i]=id;
if(key[i])l[id]=r[id]=id++;
}--id;
for(int i=;i<=m;++i){
int x=to[d[i].x],y=to[d[i].y];
key[x]=y;
if(x<y)add(x,x+);
else add(x+,x);
}
}
int main(){
n=read(),m=read(),p=read();
for(int i=;i<=m;++i){
d[i].x=read(),d[i].y=read();
key[d[i].x]=d[i].y;
}
init();dfs();
for(int i=;i<=p;++i){
int x=to[read()],y=to[read()];
if(l[x]<=y&&y<=r[x])putchar('Y'),putchar('E'),putchar('S'),putchar('\n');
else putchar('N'),putchar('O'),putchar('\n');
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ5288 & 洛谷4436 & LOJ2508:[HNOI/AHOI2018]游戏——题解的更多相关文章

  1. BZOJ5290 & 洛谷4438:[HNOI/AHOI2018]道路——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5290 https://www.luogu.org/problemnew/show/P4438 的确 ...

  2. BZOJ5289 & 洛谷4437:[HNOI/AHOI2018]排列——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5289 https://www.luogu.org/problemnew/show/P4437 考虑 ...

  3. 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)

    点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...

  4. 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈

    正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...

  5. 洛谷P4426 毒瘤 [HNOI/AHOI2018] 虚树+树上dp

    正解:虚树+树上dp 解题报告: 传送门! 首先解释一下题意趴,,,语文70pts选手已经开始看不懂题辣QAQ 大概就是个给一个图,求独立集方案,且保证图是联通的,边的数量最多只比点多10 首先思考如 ...

  6. 洛谷P4437 排列 [HNOI/AHOI2018] 贪心

    正解:贪心 解题报告: 传送门! 发现做题龟速,,,所以懒得写题目大意辣自己get一下QAQ 首先看到ai<=n,又当ai=j时j在i的前面,所以就变成对于每个点i有一个约束,即要求第ai个节点 ...

  7. 洛谷P4438 道路 [HNOI/AHOI2018] 树形dp

    正解:树形dp 解题报告: 传送门! 昂首先看懂题目趴QwQ大概就是说有棵满二叉树,有n个叶子节点(乡村)和n-1个非叶子节点,然后这棵树的每个节点有三个属性abc,对每个非叶子节点可以从与子节点的两 ...

  8. 【洛谷 P4437】 [HNOI/AHOI2018]排列(贪心,堆)

    题目链接 如果\(j<=k,a_{p[j]}!=p[k]\)可以理解为如果\(a_{p[j]}=p[k]\),那么\(k\)一定要放在\(j\)前面,也就是\(a_j\)在\(j\)前面. 于是 ...

  9. 洛谷P1512伊甸园的日历游戏题解

    题目 因为可能要参加qbxt的数论考试,所以最近要开始猛刷数论题了. 这是第一道,不过看样子并不想数论题啊,只是一个博弈论. 思路 一位著名老师说过,数学就是转化和化简,所以先考虑化简,先考虑化简年份 ...

随机推荐

  1. 海思NB-IOT的SDK看门狗的使用

    1. 看门狗需要喂狗,如果自己写的任务一直运行,那么空闲任务无法运行会导致看门狗复位,来看下看门狗的机制,首先系统启动的时候创建了空闲任务 在这个函数里面void vTaskStartSchedule ...

  2. 分享开源的GB/T-2260国家行政区划代码

    项目中需要用到省市数据,在网上搜了一下,很多旧数据,稍微新一点的下载就要积分.X币什么的,很不爽,最后在GitHub上找到一个开源的,还有各种语言版本的,非常方便! https://github.co ...

  3. memory引擎和innodb引擎速度对比

    ysql> insert into innodb_test (name) select name from innodb_test; Query OK, rows affected ( min ...

  4. git的一些操作指令

    1. mkdir learn 创建learn文件夹(也可不用命令创建,直接右击新建即可)   cd learn进入learn文件夹   git init  把learn文件夹 变成 可以用git管理的 ...

  5. 「功能笔记」性能分析工具gprof使用笔记

    根据网上信息整理所成. 功能与优劣 gprof实际上只是一个用于读取profile结果文件的工具.gprof采用混合方法来收集程序的统计信息,它使用检测方法,在编译过程中在函数入口处插入计数器用于收集 ...

  6. 「日常训练」 Counting Cliques(HDU-5952)

    题意与分析 题源:2016ACM/ICPC沈阳现场赛. 这题让我知道了什么是团,不过最恶心的还是这题的数据了,卡了无数次- - 解决方法是维护一个G数组,不能去遍历邻接矩阵.至少我改了这么一个地方就过 ...

  7. HTML随笔3

    1. *svg(可伸缩矢量图)标签画圆,其中r表示半径,cx和cy表示其圆心的坐标 <svg><circle r="100" cx="200" ...

  8. 怎样通过Qt编写C/C++代码查询当前Linux的版本号?

    遇到一个问题:如题. 我的开发环境是:嵌入式ARM + Linux系统 + Qt 4.5 + C/C++ 现在需要查询 当前Linux系统的版本号. 问题: 1)Qt 4.5 提供怎样的API来获取? ...

  9. 用IDEA编写spark的WordCount

    我习惯用Maven项目 所以用IDEA新建一个Maven项目 下面是pom文件 我粘上来吧 <?xml version="1.0" encoding="UTF-8& ...

  10. Unity Android设备的输入

    Unity Android设备的输入 1依据屏幕位置输入 有的时候也许是为了整个有些风格的干净,减少屏幕上的UI图标,以至于摒弃了虚拟按键这种常用的输入方式.为了替代虚拟按键的输入方式而选择了依据点击 ...