loj #2508. 「AHOI / HNOI2018」遊戲

#2508. 「AHOI / HNOI2018」遊戲

題目描述

一次小 G 和小 H 在玩尋寶遊戲,有 nnn 個房間排成一列,編號爲 1,2,,n,相鄰房間之間都有 111 道門。其中一部分門上有鎖(所以須要對應的鑰匙才能開門),其他的門都能直接打開。html

如今小 G 告訴了小 H 每把鎖的鑰匙在哪一個房間裏(每把鎖有且只有一把鑰匙),並做出 ppp 次指示:第 iii 次讓小 H 從第 SiS_iSi​​ 個房間出發,去第 TiT_iTi​​ 個房間尋寶。可是小 G 有時會故意在指令裏放入死路,而小 H 也不想浪費多餘的體力去嘗試,因而想事先調查清楚每次的指令是否存在一條通路。ios

你是否能爲小 H 做出解答呢?dom

輸入格式

第一行三個整數nnn,mmm,ppp,表明共有 nnn 個房間,mmm 道門上了鎖,以及 ppp 個詢問。測試

接下來 mmm 行每行有兩個整數xxx,yyy,表明第 xxx 到第 x+1x + 1x+1 個房間的門上有把鎖,而且這把鎖的鑰匙被放在了第 yyy 個房間裏。輸入保證 xxx 不重複。優化

接下來 ppp 行,其中第 iii 行是兩個整數 SiS_iSi​​,TiT_iTi​​,表明一次詢問。ui

輸出格式

輸出 mmm 行,每行一個大寫的 YES 或 NO 分別表明能或不能到達。spa

樣例

樣例輸入 1

5 4 5
1 3
2 2
3 1
4 4
2 5
3 5
4 5
2 1
3 1

樣例輸出 1

YES
NO
YES
YES
NO

樣例解釋 1

第一個詢問 S=2S = 2S=二、T=5T = 5T=5 的一條可行路線是:2→3→2→1→2→3→4→52 \rightarrow 3 \rightarrow 2 \rightarrow 1 \rightarrow 2 \rightarrow 3 \rightarrow 4 \rightarrow 523212345。code

樣例輸入 2

此組樣例知足特性:y≤xy \le xyx 恆成立htm

7 5 4
2 2
3 3
4 2
5 3
6 6
2 1
3 4
3 7
4 5

樣例輸出 2

YES
YES
NO
NO

樣例解釋 2

第一個詢問 222 和 111 房間之間沒有鎖因此爲一條通路。blog

數據範圍與提示

測試點編號 n m 其餘特性
1 ≤1000 \le 10001000 ≤1000 \le 10001000
2 ≤1000 \le 10001000 ≤1000 \le 10001000
3 ≤105 \le 10^5105​​ ≤105 \le 10^5105​​ y≤xy \le xyx 恆成立
4 ≤105 \le 10^5105​​ ≤105 \le 10^5105​​ y≤xy \le xyx 恆成立
5 ≤105 \le 10^5105​​ ≤105 \le 10^5105​​
6 ≤105 \le 10^5105​​ ≤105 \le 10^5105​​
7 ≤106 \le 10^6106​​ ≤106 \le 10^6106​​ y≤xy \le xyx 恆成立
8 ≤106 \le 10^6106​​ ≤106 \le 10^6106​​ y≤xy \le xyx 恆成立
9 ≤106 \le 10^6106​​ ≤106 \le 10^6106​​
10 ≤106 \le 10^6106​​ ≤106 \le 10^6106​​

對於全部數據,保證 1≤n,p≤1061 \le n,p \le 10^61n,p106​​,0≤m<n0 \le m < n0m<n,1≤x,y,Si,Ti<n1 \le x, y, S_i,T_i < n1x,y,Si​​,Ti​​<n,保證 xxx 不重複。

因爲本題輸入文件較大,建議在程序中使用讀入優化。

 

 

 

/*
    一個點可以擴張的區間是由它周圍的點轉移過來的
    隨機化更新的順序,每次更新進行左右擴張便可
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#define maxn 1000010
using namespace std;
int n,L[maxn],R[maxn],p[maxn],rd[maxn];
int qread(){
    int i=0,j=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')j=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){i=i*10+ch-'0';ch=getchar();}
    return i*j;
}
void extend(int i){
    bool flag=1;
    while(flag){
        flag=0;
        while(L[i]>1 && (p[L[i]-1]==0||(L[i]<=p[L[i]-1]&&p[L[i]-1]<=R[i])))
            flag=1,L[i]=min(L[i],L[L[i]-1]),R[i]=max(R[i],R[R[i]-1]);
        while(R[i]<n && (p[R[i]]==0||(L[i]<=p[R[i]]&&p[R[i]]<=R[i])))
            flag=1,L[i]=min(L[i],L[L[i]+1]),R[i]=max(R[i],R[R[i]+1]);
    }
}
int main(){
    srand(time(0));
    int m,q,x,y;
    n=qread();m=qread();q=qread();
    for(int i=1;i<=m;i++){
        x=qread();
        p[x]=qread();
    }
    for(int i=1;i<=n;i++)L[i]=R[i]=i;
    for(int i=1;i<=n;i++)rd[i]=i;
    random_shuffle(rd+1,rd+n+1);
    for(int i=1;i<=n;i++)extend(rd[i]);
    while(q--){
        x=qread();y=qread();
        if(L[x]<=y&&y<=R[x])puts("YES");
        else puts("NO");
    }
    return 0;
}
相關文章
相關標籤/搜索