题意

题目链接

分析

  • 先将没有锁的房间缩点,首先有一个 \(O(n^2)\) 的想法:从每个点出发,每次检查能否向两边扩张。
  • 容易发现门和门之间如果有锁,必然只有一方能够开锁(只有一把钥匙),并且能够开一扇门的位置一定是一个区间 \([l,r]\)。假设门 \(p<l\) ,则区间内的所有门都为 \(\leftarrow\) 。如果扩展顺序为 \(l\) 到 \(r\) 就可以保证对于开 \(p​\) 门这个操作只被进行一次,而后面的位置可以继承这个可行区间。
  • 所以如果对于门 \(a\),如果钥匙在 \(a\) 左边,就连边 \(a+1 \rightarrow a\) ,反之同理。按照拓扑序扩展就可以保证扩展次数至多为 \(m\) 次。
  • 时间复杂度 \(O(n+m)\) 。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define go(u) for(int i = head[u], v = e[i].to; i; i=e[i].lst, v=e[i].to)
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define pb push_back
#define re(x) memset(x, 0, sizeof x)
inline int gi() {int x = 0,f = 1;char ch = getchar();while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar();}while(isdigit(ch)) { x = (x << 3) + (x << 1) + ch - 48; ch = getchar();}return x * f;
}
template <typename T> inline bool Max(T &a, T b){return a < b ? a = b, 1 : 0;}
template <typename T> inline bool Min(T &a, T b){return a > b ? a = b, 1 : 0;}
const int N = 1e6 + 7;
int n, m, p, ndc;
int x[N], y[N], pos[N], du[N], id[N], L[N], R[N];
bool lck[N];
vector<int>G[N];
queue<int>Q;
void solve() {rep(i, 1, ndc) L[i] = R[i] = i;rep(i, 1, ndc) if(!du[i]) Q.push(i);while(!Q.empty()) {int u = Q.front();Q.pop();while(1) {bool fg = 0;if(u > 1 && L[u] <= pos[L[u] - 1] && pos[L[u] - 1] <= R[u]) fg = 1, L[u] = L[L[u] - 1];if(u < ndc && L[u] <= pos[R[u]] && pos[R[u]] <= R[u]) fg = 1, R[u] = R[R[u] + 1];if(!fg) break;}for(auto v:G[u]) {if(--du[v] == 0) Q.push(v);}}
}
int main() {n = gi(), m = gi(), p = gi();rep(i, 1, m) {x[i] = gi(), y[i] = gi();lck[x[i]] = 1;}id[1] = ++ndc;rep(i, 2, n) {if(lck[i - 1]) id[i] = ++ndc;else id[i] = id[i - 1];}rep(i, 1, m) pos[id[x[i]]] = id[y[i]];rep(i, 1, m) {x[i] = id[x[i]], y[i] = id[y[i]];if(y[i] <= x[i]) G[x[i] + 1].pb(x[i]), ++du[x[i]];if(y[i] > x[i]) G[x[i]].pb(x[i] + 1), ++du[x[i] + 1];}solve();while(p--) {int s = id[gi()], t = id[gi()];if(L[s] <= t && t <= R[s]) puts("YES");else puts("NO");}return 0;
}

转载于:https://www.cnblogs.com/yqgAKIOI/p/10485252.html

[HNOI2018]游戏[拓扑排序]相关推荐

  1. 洛谷 P3041 视频游戏的连击Video Game Combos(AC自动机+拓扑排序+数位DP)

    洛谷 P3041 视频游戏的连击Video Game Combos 难度一般,不过这个数位DP其实应该叫做记忆化搜索 题意:玩游戏时可以通过按键组合打出combo技能:然后是已知N个combo的按键方 ...

  2. 揭开「拓扑排序」的神秘面纱

    作者 | 小齐本齐 责编 | Carol 来源 | 码农田小齐 Topological sort 又称 Topological order,这个名字有点迷惑性,因为拓扑排序并不是一个纯粹的排序算法,它 ...

  3. [拓扑排序/强联通分量] [NOIP201402] 信息传递

    信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日 ...

  4. 排个课表学会了拓扑排序!有点意思

    原创不易,帅哥美女呢请三连支持一波 前言 大家好,我是bigsai. 拓扑排序,很多人都可能听说但是不了解的一种算法.不知者大多会提出这样的疑问: 这是某种排序算法?这好像是一种图论算法?图也能排序? ...

  5. HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. BZOJ1565[NOI2009]植物大战僵尸——最大权闭合子图+拓扑排序

    题目描述 Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻.该款游戏包含多 ...

  7. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  8. HDU1811 Rank of Tetris【拓扑排序+并查集】

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. P6560 [SBCOI2020] 时光的流逝 (博弈,反向建图,拓扑排序

    洛谷P6560 [SBCOI2020] 时光的流逝 题意: 给定一个有向图(可能有环),给定起点和终点,两个人玩游戏,一人走一步,先到达终点的人赢或者先无法移动的人输 思路: 题解 因为是终点和叶子节 ...

最新文章

  1. Rust编写的新终端多路复用器
  2. [Oracle] 中的Temporary tablespace的作用
  3. 如何用python画函数曲线_Python笔记:用matplotlib绘制函数曲线图
  4. Mahout推荐算法API详解
  5. 0123互联网新闻 | 在线教育机构掌门1对1获3.5亿美元融资;淘宝直播独立App将在春节前上线...
  6. redis应用之——注册、登录
  7. 解决SublimeCodeIntel回车换行误打代码
  8. 常数时间插入、删除和获取随机元素
  9. 知乎上的44条神回复,针针见血,看完整个人通透多了
  10. IIS启用GZip压缩
  11. Crystal Reports - New Report
  12. java 10的 6次方_【Java】 剑指offer(15) 数值的整数次方
  13. win10连接校园网(wifi)开热点手机连接显示“已连接但无法访问互联网”解决办法
  14. Postman 中文包使用
  15. 线性代数基础知识点回顾与总结(一):行列式与矩阵
  16. Hexo修改鼠标样式
  17. 深度模型训练之learning rate
  18. 《炬丰科技-半导体工艺》集成微加工平台各向异性腐蚀
  19. Tableau可视化技巧-让你的图表跟随时间动起来
  20. Linux常用浏览器

热门文章

  1. html图标点击转换颜色,PNG格式小图标的CSS任意颜色赋色技术_html/css_WEB-ITnose
  2. thinkphp5调用shell脚本_thinkphp5.x全版本任意代码执行getshell
  3. file_get_contents(php://input)的使用方法
  4. 【408预推免复习】计算机组成原理之系统总线
  5. 【Deep Learning笔记】感知机模型和学习策略
  6. Android移动开发之【Android实战项目】剑走偏锋-得会导入别人的Android Studio项目!
  7. python【力扣LeetCode算法题库】14-最长公共前缀(列表解压)
  8. 风变编程python第一关脸黑怪我喽_风变编程:Python适合编程初学者学习吗?
  9. 在合并单元格中数组公式无效_Excel中合并单元格困扰多年的难题,终于被我搞定了...
  10. pmp学习资料_PMP怎样叫通过考试,拿到证书?