「HNOI2018」游戏

解题思路

首先没有锁上的门可以缩点缩掉,然后对于一扇锁上的门,如果钥匙在左边,那么右边就永远不可能到达左边,同理如果钥匙在右边,左边就永远不可能到达右边。

然后考虑一个暴力的做法,对于一个点不断尝试向左向右扩展,直到不能扩展位置得到其最终的区间,这个过程可以记忆化一下每个已经算过的点的区间,直接做最坏还是 \(\mathcal O(n^2)\) ,然而随机化可过 。

对于一扇门,如果钥匙在左侧,就让门右侧的点向门左侧的点连一条边,这样可以得到一个 \(\text{DAG}\) ,因为右边到达不了左边,就先让右侧先扩展左侧利用右侧的答案,这样每一个区间只会向右被扩展一次向左被扩展一次,之后这个区间就被合并掉了,区间合并次数是 \(\mathcal O(m)\) 的,所以总复杂度 \(\mathcal O(n+m)\) ,然而乱搞碾标算。

code

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 2000005;
queue<int> Q;
vector<int> g[N];
int bel[N], lock[N], l[N], r[N], deg[N], L[N], R[N], n, m, q, cnt;
int main(){
read(n), read(m), read(q);
for(int i = 1, x, y; i <= m; i++)
read(x), read(y), lock[x] = y;
for(int i = 1; i <= n; i++) if(!bel[i]){
bel[i] = ++cnt; int j = i;
for(; j < n && !lock[j]; j++) bel[j+1] = bel[i];
L[cnt] = i, R[cnt] = j, l[cnt] = r[cnt] = cnt;
}
for(int i = 1; i <= n; i++)
if(lock[i] && lock[i] <= i)
g[bel[i+1]].push_back(bel[i]), deg[bel[i]]++;
for(int i = 1; i <= cnt; i++) if(!deg[i]) Q.push(i);
for(; !Q.empty(); Q.pop()){
int u = Q.front(), lstL, lstR;
do{
lstL = l[u], lstR = r[u];
if(l[u] > 1 && lock[L[l[u]]-1] >= L[l[u]] && lock[L[l[u]]-1] <= R[r[u]]) l[u] = l[l[u]-1];
if(r[u] < cnt && lock[R[r[u]]] >= L[l[u]] && lock[R[r[u]]] <= R[r[u]]) r[u] = r[r[u]+1];
}while(l[u] != lstL || r[u] != lstR);
for(int i = 0; i < (int) g[u].size(); i++)
if(!--deg[g[u][i]]) Q.push(g[u][i]);
}
while(q--){
int x, y; read(x), read(y);
if(bel[y] >= l[bel[x]] && bel[y] <= r[bel[x]]) puts("YES"); else puts("NO");
}
return 0;
}

「HNOI2018」游戏的更多相关文章

  1. loj #2508. 「AHOI / HNOI2018」游戏

    #2508. 「AHOI / HNOI2018」游戏 题目描述 一次小 G 和小 H 在玩寻宝游戏,有 nnn 个房间排成一列,编号为 1,2,…,n,相邻房间之间都有 111 道门.其中一部分门上有 ...

  2. LOJ_2305_「NOI2017」游戏 _2-sat

    LOJ_2305_「NOI2017」游戏 _2-sat 题意: 给你一个长度为n的字符串S,其中第i个字符为a表示第i个地图只能用B,C两种赛车,为b表示第i个地图只能用A,C两种赛车,为c表示第i个 ...

  3. 「HNOI2018」毒瘤

    「HNOI2018」毒瘤 解题思路 先考虑只有一棵树的情况,经典独立集计数. \[ dp[u][0]=\prod (dp[v][0]+dp[v][1]) \\ dp[u][1]=\prod dp[v] ...

  4. 「HNOI2018」转盘

    「HNOI2018」转盘 现场推出了大部分结论但是只写了 \(40\) 分暴力,被贺指导踩爆,现在还有点怀念 HNOI2018 贺指导对着镜子荒野行动的日子,那几天他云球迷瞎**指点篮球,被送上指导称 ...

  5. 「NOI2017」游戏

    「NOI2017」游戏 题目描述 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 \(A\).\(B\).\ ...

  6. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

  7. LOJ2305 「NOI2017」游戏

    「NOI2017」游戏 题目背景 狂野飙车是小 L 最喜欢的游戏.与其他业余玩家不同的是,小 L 在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略. 题目描述 小 L 计划进行$n$场 ...

  8. 「NOI2017」游戏 解题报告

    「NOI2017」游戏 \(d\)这么小,你考虑直接对\(d\)个东西暴力 枚举\(x\)为\(a\)或\(b\)(\(c\)就不用了,因为\(a,b\)已经包含\(c\))了,剩下的就是个\(2-s ...

  9. 「JSOI2013」游戏中的学问

    「JSOI2013」游戏中的学问 传送门 考虑 \(\text{DP}\) 设 \(dp_{i, j}\) 表示将前 \(i\) 个人分成 \(j\) 个集合,并且第 \(i\) 个人在第 \(j\) ...

随机推荐

  1. Centos7安装 mysql5.6.29 shell脚本

    有很多可以借鉴的地方,故转载: 创建脚本mysql.sh,直接运行sh mysql.sh !/bin/bash if [ -d /software ] ;then cd /software else ...

  2. Tslib步骤以及出现问题的解决方案【转】

    转自:http://forum.eepw.com.cn/thread/267828/1 嵌入式设备中触摸屏使用非常广泛,但触摸屏的坐标和屏的坐标是不对称的,需要校准.校准广泛使用的是开源的tslib. ...

  3. 畸形的 dockerfile中的COPY命令-

    dockerfile中的COPY是指COPY 指定目录的“子级目录”下所有的目录和文件,到指定目录中,这个shell中的cp命令大相径庭,使得很多人纳闷,怎么cpy过去的文件不是自己想要的

  4. git summary

    Git 使用经验 缘起 一直想写一篇博文,记录我在使用git时遇到的问题以及解决办法.由于项目忙,偶尔的记录不连续,不成系统.今天有时间记录下来,方便自己以后查看. git 简介及其优势 简单来说,g ...

  5. Flask小demo---代码统计系统

    功能要求: 管理员登录 # 第一天 班级管理 # 第一天 学生管理 # 第一天 学生登录 上传代码(zip文件和.py文件) 查看个人提交记录列表 highchar统计 学生列表上方使用柱状图展示现班 ...

  6. 3->集群架构主机克隆教程

    centos7系统集群主机克隆: 有道笔记链接地址

  7. Android调试大法 自定义IDE默认签名文件==>微信支付、微信登录、微信分享,debug时调试通过,release时调不起微信

    转载地址:http://blog.yanzhenjie.com Android调试大法之自定义IDE默认签名文件,你是否为调试第三方SDK时debug签名和release签名发生冲突而烦恼?你是否在d ...

  8. IP地址、域名、域名解析系统相关

    IP地址(Internet Protocol Address) 它来自TCP/IP协议,存在于其中的IP层,用于实现不同计算机之间的通信,类似于门牌号. 设计之处,IP地址是准备给地球上每一台计算机一 ...

  9. Flask:使用Eclipse+PyDev插件编辑基于package的项目

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2,Eclipse Oxygen.1a Release (4.7.1a),PyDev 6.3.2 本文记录了 使用Ecli ...

  10. 【前端vue开发】vue项目使用sass less扩展语言所要安装的依赖

    1.创建一个基于 webpack 模板的新项目 $ vue init webpack myvue 2.在当前目录下,安装依赖 $ cd myvue $ npm install 3.安装sass的依赖包 ...