[BZOJ5288][HNOI2018]游戏(拓扑排序)
传送门:https://www.luogu.org/problemnew/show/P4436
20分的暴力加一个Random_shuffle就A了。我还能说什么。。
不过这个也不是毫无道理,复杂度应该是期望$O(n\log n)$的。
这件事教导我们在写暴力之前先Random_shuffle一下总没错。。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int n,x,y,a[N],L[N],R[N],m,Q,p[N]; void solve(int x){
int l=x,r=x;
while (){
bool flag=;
if (l> && ((l<=a[l-] && a[l-]<=r) || !a[l-]))
flag=,l--,l=min(l,L[l]),r=max(r,R[l]);
if (r<n && ((l<=a[r] && a[r]<=r) || !a[r]))
flag=,r++,l=min(l,L[r]),r=max(r,R[r]);
if (!flag) break;
}
L[x]=l; R[x]=r;
} int main(){
freopen("bzoj5288.in","r",stdin);
freopen("bzoj5288.out","w",stdout);
srand(); scanf("%d%d%d",&n,&m,&Q);
rep(i,,m) scanf("%d%d",&x,&y),a[x]=y;
rep(i,,n) L[i]=n+;
rep(i,,n) p[i]=i;
random_shuffle(p+,p+n+);
rep(i,,n) solve(p[i]);
while (Q--){
scanf("%d%d",&x,&y);
if (L[x]<=y && y<=R[x]) puts("YES"); else puts("NO");
}
return ;
}
下面是靠谱一点的做法。将点离散化,考虑一个区间,如果它的钥匙在区间左边,则显然必须先处理后一个区间的信息再去处理当前区间的信息(方便合并),所以连边i+1->i,反之同理。
按照拓扑序处理信息即可,每个区间最多只会和左边合并一次,右边和合并一次,所以总复杂度$O(n)$。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int n,m,p,x,y,s,t,lock[N],len,top,cnt,to[N],nxt[N],h[N];
int key[N],deg[N],bel[N],beg[N],end[N],pos[N],L[N],R[N],q[N<<]; void ins(int x,int y){ to[++len]=y; nxt[len]=h[x]; h[x]=len; }
void inc(int &x){ x++; if (x>N) x-=N; } void pre(){
int st=,ed=;
rep(i,,cnt) if (!deg[i]) q[++ed]=i;
while (st!=ed){
inc(st); int x=q[st];
while (){
int flag=;
if (L[x]> && pos[L[x]-]>=L[x] && pos[L[x]-]<=R[x]) L[x]=L[L[x]-],flag=;
if (R[x]<cnt && pos[R[x]]>=L[x] && pos[R[x]]<=R[x]) R[x]=R[R[x]+],flag=;
if (!flag) break;
}
for (int i=h[x]; i; i=nxt[i]){
int y=to[i]; deg[y]--;
if (!deg[y]) inc(ed),q[ed]=y;
}
}
} int main(){
freopen("bzoj5288.in","r",stdin);
freopen("bzoj5288.out","w",stdout);
scanf("%d%d%d",&n,&m,&p); lock[]=;
rep(i,,m) scanf("%d%d",&x,&y),lock[x]=,key[x]=y;
rep(i,,n){
if (lock[i-]) cnt++;
bel[i]=cnt; end[cnt]=i;
if (!beg[cnt]) beg[cnt]=i;
}
rep(i,,cnt-){
pos[i]=bel[key[end[i]]];
if (pos[i]<=i) ins(i+,i),deg[i]++; else ins(i,i+),deg[i+]++;
}
rep(i,,n) L[i]=R[i]=i; pre();
while (p--){
scanf("%d%d",&s,&t);
if (L[bel[s]]<=bel[t] && bel[t]<=R[bel[s]]) puts("YES"); else puts("NO");
}
return ;
}
[BZOJ5288][HNOI2018]游戏(拓扑排序)的更多相关文章
- [HNOI2018]游戏[拓扑排序]
题意 题目链接 分析 先将没有锁的房间缩点,首先有一个 \(O(n^2)\) 的想法:从每个点出发,每次检查能否向两边扩张. 容易发现门和门之间如果有锁,必然只有一方能够开锁(只有一把钥匙),并且能够 ...
- [BZOJ5289][HNOI2018]排列(拓扑排序+pb_ds)
首先确定将所有a[i]向i连边之后会形成一张图,图上每条有向边i->j表示i要在j之前选. 图上的每个拓扑序都对应一种方案(如果有环显然无解),经过一系列推导可以发现贪心策略与合并的块的大小和w ...
- bzoj5288: [Hnoi2018]游戏
我还是太年轻了... 考场上就是直接枚举预处理当前位置左右延伸到的最远距离,好像是水了20.. 然后噶爷爷居然随机一下就AC了????mengbier #include<cstdio> # ...
- 【BZOJ5288】[HNOI2018]游戏(拓扑排序)
[BZOJ5288][HNOI2018]游戏(拓扑排序) 题面 BZOJ 洛谷 题解 去年省选的时候这题给我乱搞整过去整过去了,也是虐心了.... 所以当然是来讲正儿八经的正确做法啦. 很明显,我们需 ...
- FZU xxx游戏(拓扑排序+暴力)
xxx游戏 Time Limit: 1000MS Memory Limit: 32768 KB Description 小M最近很喜欢玩XXX游戏.这个游戏很简单,仅由3个场景(分别为1.2. ...
- Problem 1014 xxx游戏 暴力+拓扑排序
题目链接: 题目 Problem 1014 xxx游戏 Time Limit: 1000 mSec Memory Limit : 32768 KB 问题描述 小M最近很喜欢玩XXX游戏.这个游戏很简单 ...
- 拓扑排序 - 并查集 - Rank of Tetris
Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球 ...
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
题目链接: 传送门 Rank of Tetris Time Limit: 1000MS Memory Limit: 32768 K Description 自从Lele开发了Rating系统, ...
- ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线
hdu 1811 Rank of Tetris Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
随机推荐
- [转]LVS+Keepalived负载均衡配置
简介 来源:https://www.cnblogs.com/MacoLee/p/5858995.html lvs一般是和keepalived一起组合使用的,虽然也可以单独使用lvs,但配置比较繁琐,且 ...
- awk学习笔记
1. 数据格式 id1,n1 id2,n2 ... 要对每个id进行一个n的加和 cat file1 | awk -F"," '{if(n[$1]>0){n[$1]=n[$1 ...
- 【bzoj3144】[Hnoi2013]切糕 网络流最小割
题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...
- Problem b
Problem b 题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入 第一行一个整数 ...
- WebRTC 视频对话
今天聊一下WebRTC.很多开发者,可能会觉得有些陌生,或者直接感觉繁杂.因为WebRTC在iOS上的应用,只是编译都让人很是头痛.这些话,到此为止,以防让了解者失去信心.我们只传播正能量,再多的困难 ...
- 使用Asp.Net Identity 2.0 认证邮箱激活账号(附DEMO)
注:本文系作者原创,但可随意转载.若有任何疑问或错误,欢迎与原作者交流,原文地址:http://www.cnblogs.com/lyosaki88/p/aspnet-itentity-ii-email ...
- Django model 字段类型清单
Django model字段类型清单 Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField 一个自动递增的整型字 ...
- JSP、JSTL、EF学习笔记
JSP 1)Java Server Page,在html中嵌入java代码 2)九个内置(隐式)对象 request response out page pageContext config sess ...
- 求强连通块_Tarjan算法_C++
好久没有写算法了,就放一个 Tarjan 上来凑凑数哈 强连通块由若干个点组成,任意点与点之间可以之间或间接到达,显然可以看作一个环 下面是伪代码 强记:dfn为时间不变,low取最小,下一个dfn有 ...
- Winform 在DataGrid中签入Combo
背景 最近看了Winform在DataGrid中怎么嵌入Combo,想到平时项目中写到的一些临时小工具,经常用配置参数,有些配置是简单的地址或文本,有些则是类似1代表SQL,2代表Oracle等.于是 ...