记录编号 |
445331 |
评测结果 |
AAAAAAA |
题目名称 |
基本的图问题 |
最终得分 |
100 |
用户昵称 |
liuyu |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.428 s |
提交时间 |
2017-09-05 19:38:14 |
内存使用 |
118.57 MiB |
显示代码纯文本
- #include<iostream>
- #include<cstdio>
- #include<vector>
- using namespace std;
- const int maxn=500010;
- const int maxx=30;
- int n,m,k,f[maxn],dmin[maxn][maxx],qmax[maxn][maxx];
- int l,r,Amax,Amin,a[maxn];
- int read(){
- int x=0;
- char c=getchar();
- while(c<'0'||c>'9')c=getchar();
- while(c>='0'&&c<='9'){
- x=x*10+c-'0';
- c=getchar();
- }
- return x;
- }
- void RMQ_INIT()
- {
- for(int i=1;i<=n;i++){
- dmin[i][0]=a[i];
- qmax[i][0]=a[i];
- }
- for(int j=1;j<20;j++)
- for(int i=1;i<=n;i++){
- if(i+(1<<j)-1<=n){
- dmin[i][j]=min(dmin[i][j-1],dmin[i+(1<<(j-1))][j-1]);
- qmax[i][j]=max(qmax[i][j-1],qmax[i+(1<<(j-1))][j-1]);
- }
- }
- }
- int minn(int l,int r){
- int k=0;
- while(1<<(k+1)<=r-l+1)k++;
- return min(dmin[l][k],dmin[r-(1<<k)+1][k]);
- }
- int maxc(int l,int r){
- int k=0;
- while(1<<(k+1)<=r-l+1)k++;
- return max(qmax[l][k],qmax[r-(1<<k)+1][k]);
- }
- int find(int x){
- if(x==f[x])return x;
- return f[x]=find(f[x]);
- }
- void merge(int x,int y){
- int f1=find(x);
- int f2=find(y);
- f[f1]=f2;
- }
- int main(){
- freopen("basicgraph.in","r",stdin);
- freopen("basicgraph.out","w",stdout);
- n=read();
- for(int i=1;i<=n;i++){
- cin>>a[i];
- f[i]=i;
- }
- RMQ_INIT();
- m=read();
- for(int i=1;i<=m;i++){
- l=read(),r=read();
- Amin=minn(l,r);
- Amax=maxc(l,r);
- merge(Amin,Amax);
- }
- k=read();
- for(int i=1;i<=k;i++){
- l=read(),r=read();
- int f1=find(l);
- int f2=find(r);
- if(f1==f2)puts("YES");
- else puts("NO");
- }
- return 0;
- }