记录编号 445331 评测结果 AAAAAAA
题目名称 基本的图问题 最终得分 100
用户昵称 Gravatarliuyu 是否通过 通过
代码语言 C++ 运行时间 0.428 s
提交时间 2017-09-05 19:38:14 内存使用 118.57 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. using namespace std;
  5. const int maxn=500010;
  6. const int maxx=30;
  7. int n,m,k,f[maxn],dmin[maxn][maxx],qmax[maxn][maxx];
  8. int l,r,Amax,Amin,a[maxn];
  9. int read(){
  10. int x=0;
  11. char c=getchar();
  12. while(c<'0'||c>'9')c=getchar();
  13. while(c>='0'&&c<='9'){
  14. x=x*10+c-'0';
  15. c=getchar();
  16. }
  17. return x;
  18. }
  19. void RMQ_INIT()
  20. {
  21. for(int i=1;i<=n;i++){
  22. dmin[i][0]=a[i];
  23. qmax[i][0]=a[i];
  24. }
  25. for(int j=1;j<20;j++)
  26. for(int i=1;i<=n;i++){
  27. if(i+(1<<j)-1<=n){
  28. dmin[i][j]=min(dmin[i][j-1],dmin[i+(1<<(j-1))][j-1]);
  29. qmax[i][j]=max(qmax[i][j-1],qmax[i+(1<<(j-1))][j-1]);
  30. }
  31. }
  32. }
  33. int minn(int l,int r){
  34. int k=0;
  35. while(1<<(k+1)<=r-l+1)k++;
  36. return min(dmin[l][k],dmin[r-(1<<k)+1][k]);
  37. }
  38. int maxc(int l,int r){
  39. int k=0;
  40. while(1<<(k+1)<=r-l+1)k++;
  41. return max(qmax[l][k],qmax[r-(1<<k)+1][k]);
  42. }
  43. int find(int x){
  44. if(x==f[x])return x;
  45. return f[x]=find(f[x]);
  46. }
  47. void merge(int x,int y){
  48. int f1=find(x);
  49. int f2=find(y);
  50. f[f1]=f2;
  51. }
  52. int main(){
  53. freopen("basicgraph.in","r",stdin);
  54. freopen("basicgraph.out","w",stdout);
  55. n=read();
  56. for(int i=1;i<=n;i++){
  57. cin>>a[i];
  58. f[i]=i;
  59. }
  60. RMQ_INIT();
  61. m=read();
  62. for(int i=1;i<=m;i++){
  63. l=read(),r=read();
  64. Amin=minn(l,r);
  65. Amax=maxc(l,r);
  66. merge(Amin,Amax);
  67. }
  68. k=read();
  69. for(int i=1;i<=k;i++){
  70. l=read(),r=read();
  71. int f1=find(l);
  72. int f2=find(r);
  73. if(f1==f2)puts("YES");
  74. else puts("NO");
  75. }
  76. return 0;
  77. }