1. 程式人生 > >bzoj5288 [Hnoi2018]遊戲(模擬+拓撲排序)

bzoj5288 [Hnoi2018]遊戲(模擬+拓撲排序)

我們首先考慮把沒有門隔開的點縮成一個點。

如果i->i+1的鑰匙<=i,那麼從i+1一定走不到i及其左,因此先做i+1,也就是連邊i+1->i,然後按拓撲序來做,

如果i->i+1的鑰匙>=i+1,那麼從i一定走不到i+1及其右,因此先做i,也就是連邊i->i+1.
每次類似區間合併去擴充套件,每個區間只會被最多合併兩次,因此複雜度是O(n)的。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1000010
inline char gc(){ static char buf[1<<16],*S,*T; if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;} return *S++; } inline int read(){ int x=0,f=1;char ch=gc(); while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc();} while(ch>='0'&&ch<='9') x=x*10
+ch-'0',ch=gc(); return x*f; } int n,m,Q,bel[N],key[N],l[N],r[N],L[N],R[N],tot=0,h[N],num=0,du[N]; bool mk[N]; struct edge{ int to,next; }data[N]; inline void add(int x,int y){ data[++num].to=y;data[num].next=h[x];h[x]=num;du[y]++; } queue<int>q; int main(){ // freopen("game3.in","r",stdin);
// freopen("a.out","w",stdout); n=read();m=read();Q=read(); while(m--){ int x=read(),y=read();mk[x]=1;key[x]=y; }++tot; for(int i=1;i<=n;++i){ bel[i]=tot;if(!mk[i]) continue; r[tot]=i;++tot; }r[tot]=n; for(int i=1;i<tot;++i){ key[i]=bel[key[r[i]]]; if(key[i]<=i) add(i+1,i); else add(i,i+1); }key[tot]=tot+1;for(int i=1;i<=tot;++i) if(!du[i]) q.push(i); while(!q.empty()){ int x=q.front();q.pop(); for(int i=h[x];i;i=data[i].next){ int y=data[i].to;if(--du[y]==0) q.push(y); }L[x]=R[x]=x; while(1){ if(key[R[x]]>=L[x]&&key[R[x]]<=R[x]){R[x]=R[R[x]+1];continue;} if(key[L[x]-1]>=L[x]&&key[L[x]-1]<=R[x]){L[x]=L[L[x]-1];continue;} break; } }while(Q--){ int x=bel[read()],y=bel[read()]; puts(y>=L[x]&&y<=R[x]?"YES":"NO"); }return 0; }

相關推薦

bzoj5288 [Hnoi2018]遊戲模擬+排序

我們首先考慮把沒有門隔開的點縮成一個點。 如果i->i+1的鑰匙<=i,那麼從i+1一定走不到i及其左,因此先做i+1,也就是連邊i+1->i,然後按拓撲序來做, 如果i->i+1的鑰匙>=i+1,那麼從i一定走不到i+1及其右

[POI2004] SZP 貪心+排序

【問題描述】 Byteotian 中央情報局(BIA) 僱傭了許多特工. 他們每個人的工作就是監視 另一名特工. Byteasar 國王需要進行一次祕密行動,所以他要挑選儘量多的信得過的特工. 但 是這項任務是如此的機密以至於所有參加行動的特工都必須至少被另一名沒有 參加任務的特工所監視(就是說如果某個特工參

POJ 2367:Genealogical tree排序

ostream oge lis limit return ember rand output together Genealogical tree Time Limit: 1000MS Memory Limit: 65536K Total Sub

hihocoder 1457後綴自動機+排序

十進制 重復 space cout add pac 不重復 min != 題意 給定若幹組由數字構成的字符串,求所有不重復子串的和(把他們看成十進制),答案mod(1e9+7) 題解: 類似後綴數組的做法,把字符串之間用‘:‘連接,這裏用‘:‘是因為‘:‘的ascii碼

POJ 3687:Labeling Balls優先隊列+排序

avi sat 一個 排序 com script memory std from id=3687">Labeling Balls Time Limit: 1000MS Memory Limit: 65536K T

HDU 6073 Matching In Multiplication排序

str graph pop using bsp sum rod 沒有 script Matching In Multiplication Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/5242

[CF825E] Minimal Labels反向建圖,排序

amp cto scanf i++ 題意 clear spa sin 字典序 題目鏈接:http://codeforces.com/problemset/problem/825/E 題意:給一個有向圖,求一個排列,這個排列是每一個點的序號,使得序號對應的點的排序符合拓撲序並

[HDOJ6165] FFF at Valentine強聯通分量,縮點,排序

har 之間 i++ name head cnblogs span fire -- 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6165 題意:問一個有向圖中是否有任意兩點可以到達。 讀錯題就徹底輸了,讀成判斷是否有任意條路

Sorting It All Out排序

stream ecif nco define 根據 判斷 values ges cond 題目: An ascending sorted sequence of distinct values is one in which some form of a less-tha

HDU 2647 Reward排序

empty case acm size col .cn ble ger dem 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 題目: Problem Description Dandelion‘s uncle

杭電 1285 確定比賽名次排序

hdu -h 整數 click tro hit pro set 接下來 http://acm.hdu.edu.cn/showproblem.php?pid=1285

逃生HDU4857 + 反向排序

emp 反向 .cn back HP 隊列 ring IT () 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 題面是中文題面,就不解釋題意了,自己點擊鏈接去看下啦~這題排序有兩個條件,一個是按給定的那個序列(即輸

題解報告:hdu 2647 Reward排序

一個 may lan 應該 遇到 net acm http nes 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion‘s uncle is a boss of

HDU - 4324 Triangle LOVE排序

斷圖 如何判斷 targe con ack algorithm scanf 否則 rst https://vjudge.net/problem/HDU-4324 題意 每組數據一個n表示n個人,接下n*n的矩陣表示這些人之間的關系,輸入一定滿足若A不喜歡B則B一定喜歡A

圖論學習二之Topological Sort排序

src info directed com 遞歸 ica -- 遞歸版 拓撲       拓撲排序 Topological-Sort• 對一個有向無環圖G進行 拓撲排序, 是將G中所有 頂點排成一個線性序列, 使 對 於 圖 中 任 意 弧 <u,

【CodeForces 129 B】Students and Shoelaces排序

end owin clu namespace 每次 font order 單獨 when Anna and Maria are in charge of the math club for junior students. When the club gathers tog

【洛谷 P1073】 最優貿易 Tarjan縮點+排序

多行 stdout sin pre lin get tar getchar || 題目鏈接 先\(Tarjan\)縮點,記錄每個環內的最大值和最小值。 然後跑拓撲排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和

HDOJ 2647排序

nbsp sort pan front push hdoj 2647 std cst class #include <iomanip> #include <cstdio> #include <cmath> #include <cs

HDOJ 2094排序

hdoj %d esp ems mat () include ack sin 1 #include <iomanip> 2 #include <iostream> 3 #include <cstdio> 4 #include &

HDOJ 3342排序

pan pac ack pop pso [] sizeof inb emp #include <iomanip> #include <iostream> #include <cstdio> #include <cmath>