码迷,mamicode.com
首页 > 其他好文 > 详细

hhh

时间:2019-04-17 22:09:21      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:mes   get   min   code   query   update   color   span   name   

hhh

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned int uint;
 4 const int N=2e5+5;
 5 int n,now,len[N<<2];
 6 uint hsh0,hsh1,Pow[N],hsh[2][N<<2];
 7 inline int read() {
 8     int x=0; char c=getchar();
 9     while(c<0||c>9) c=getchar();
10     while(c>=0&&c<=9) x=(x<<3)+(x<<1)+c-0,c=getchar();
11     return x;
12 }
13 
14 int ls(int p) {return p<<1;}
15 int rs(int p) {return p<<1|1;}
16 void build(int p,int l,int r) {
17     if(l==r) {len[p]=1; return ;}
18     int Mid=(l+r)>>1;
19     build(ls(p),l,Mid);
20     build(rs(p),Mid+1,r);
21     len[p]=len[ls(p)]+len[rs(p)];
22 }
23 void get(int p) {
24     hsh[0][p]=hsh[0][ls(p)]+hsh[0][rs(p)]*Pow[len[ls(p)]];
25     hsh[1][p]=hsh[1][ls(p)]*Pow[len[rs(p)]]+hsh[1][rs(p)];
26 }
27 void update(int x,int p,int l,int r) {
28     if(l==r) {hsh[0][p]=hsh[1][p]=1; return ;}
29     int Mid=(l+r)>>1;
30     if(x<=Mid) update(x,ls(p),l,Mid);
31     else update(x,rs(p),Mid+1,r);
32     get(p);
33 }
34 void query0(int ql,int qr,int p,int l,int r) {
35     if(ql<=l&&r<=qr) {
36         hsh0+=hsh[0][p]*Pow[now];
37         now+=len[p];
38         return ;
39     }
40     int Mid=(l+r)>>1;
41     if(ql<=Mid) query0(ql,qr,ls(p),l,Mid);
42     if(qr>Mid) query0(ql,qr,rs(p),Mid+1,r);
43 }
44 void query1(int ql,int qr,int p,int l,int r) {
45     if(ql<=l&&r<=qr) {
46         hsh1+=hsh[1][p]*Pow[now];
47         now+=len[p];
48         return ;
49     }
50     int Mid=(l+r)>>1;
51     if(qr>Mid) query1(ql,qr,rs(p),Mid+1,r);
52     if(ql<=Mid) query1(ql,qr,ls(p),l,Mid);
53 }
54 
55 int main() {
56     n=read();
57     Pow[0]=1;
58     for(int i=1;i<=n;i++) Pow[i]=Pow[i-1]*233;
59     build(1,1,n);
60     for(int i=1;i<=n;i++) {
61         int a=read();
62         update(a,1,1,n);
63         int l=min(a-1,n-a);
64         if(l) {
65             hsh0=now=0;
66             query0(a-l,a-1,1,1,n);
67             hsh1=now=0;
68             query1(a+1,a+l,1,1,n);
69             if(hsh0^hsh1) return printf("NO"),0;
70         }
71     }
72     printf("YES");
73 }

 

hhh

标签:mes   get   min   code   query   update   color   span   name   

原文地址:https://www.cnblogs.com/qq8260573/p/10726460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!