锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
璁╀綘姹傚嚭绔栫嚎孌靛拰妯嚎孌電殑浜ょ偣鏁幫紝鍖呮嫭绔偣銆?br>
鍋氭硶錛?br>鎴戠殑鍋氭硶鏄厛姹傚嚭闈炵鐐圭殑浜ょ偣 鏈鍚庣瓟妗堜究鏄?tot+N
鍏堝皢鏁扮粍澶嶅埗涓閬?涓涓暟緇勬寜鐓?鍏抽敭瀛梮 2鍏抽敭瀛梱鎺掑簭 鍙︿竴涓叧閿瓧欏哄簭鍙嶄竴鍙?br>灝唜鎴栬厃紱繪暎鍖?榪欓噷浠涓轟緥
鍥犱負宸茬粡鎸墆鎺掕繃搴?鎵浠ユ墍鏈夋í綰挎宸茬粡閮借兘寰楀埌浜?鐩擱偦涓孌電浉鍚寉鍧愭爣鐨勭偣灞炰簬鍚屼竴鏉$嚎孌?
騫舵爣璁版瘡鏉℃í綰挎鐨勪袱涓鐐廣?br>
鐒跺悗鎴戜滑鏋氫婦鎸墄鍧愭爣鐢卞乏杈瑰悜鍙寵竟鐨勬瘡鏉$珫綰挎
鎴戜滑鍙姹傚嚭鏈夊灝戞í綰挎涓庡畠鏈変氦 渚挎槸榪欐潯绔栫嚎孌靛艦鎴愮殑浜ょ偣鏁?br>榪欑瓑浠蜂簬姹傚嚭鍦ㄥ綋鍓峹鍧愭爣鐨勬儏鍐典笅 妯嚎孌電殑鍙崇鐐箈鍧愭爣澶т簬褰撳墠绔栫嚎孌祒鍧愭爣鐨勭嚎鏁?br>榪欐牱灝卞彲浠ョ敤綰挎鏍戞垨鑰呮爲鐘舵暟緇勭淮鎶鍧愭爣鐨勭偣錛堝嵆緇存姢褰撳墠榪樺瓨鍦ㄧ殑綰挎錛夊氨鍙互浜?br>
濡備綍緇存姢鍛紵
瀵逛簬涓鏉$珫綰挎 鎴戜滑鏋氫婦褰㈡垚褰撳墠绔栫嚎鐨勬墍鏈夌偣 濡傛灉鏌愪釜鐐瑰凡緇忔槸妯嚎孌電殑緇撳熬 閭e氨浠庢爲涓垹闄よ繖涓獃鍧愭爣
鍙嶄箣濡傛灉鏄í綰挎鐨勫紑濮?閭e氨鍔犲叆榪欎釜y鍧愭爣
鍦ㄦ灇涓句箣鍓嶅綋鐒惰姹傚綋鍓嶇嚎鐨勪氦鐐逛釜鏁幫細
瀵逛簬鏋氫婦鍒扮殑鐩擱偦涓や釜鐩稿悓x鍧愭爣鐨勭偣 鍋囪y1<y2 鎴戜滑姹傚嚭 [y1,y2)鐨勫瓨鍦ㄧ殑綰挎涓暟 閭d究鏄氦鐐逛釜鏁?br>
榪欐牱灝卞湪NLogN鏃墮棿鍐呰В鍐充簡姝ら
ps錛氬彂瑙夋垜鐨勫熀紜澶樊浜嗐傘備簩鍒嗘煡鎵綶y1,y2)鐨勪袱涓鐐規椂鍊欑珶鐒跺繕璁頒簡 (y2-1)榪欎釜鍧愭爣浜嬪疄涓婂彲鑳戒笉瀛樺湪
鎵浠ヤ簩鍒嗘煡鎵炬壘绔偣鐨勬椂鍊欐寕浜嗐傘?span style="COLOR: red; FONT-SIZE: 18pt">BS鎴戞妸
鏈鍔犲己鐗堟槸 dhx瀛﹂暱 鍑虹殑 Religious
2 #include <algorithm>
3 using namespace std;
4 #define n 100005
5 struct Tpoint
6 {
7 #define x0(i) p0[i].x
8 #define y0(i) p0[i].y
9 #define nod0(i) p0[i].nod
10 #define x1(i) p1[i].x
11 #define y1(i) p1[i].y
12 #define nod1(i) p1[i].nod
13 int x,y,nod;
14 } p0[n],p1[n];
15 int N,ny[n],New,T[n],ret=0;
16 bool sta[n],end[n];
17 inline bool cmp0(const Tpoint &a,const Tpoint &b)
18 {
19 return a.y<b.y||a.y==b.y&&a.x<b.x;
20 }
21 inline bool cmp1(const Tpoint &a,const Tpoint &b)
22 {
23 return a.x<b.x||a.x==b.x&&a.y<b.y;
24 }
25 inline int find(int x)
26 {
27 int l=0,r=New;
28 for (int mid=(l+r)>>1;l+1<r;mid=(l+r)>>1)
29 if (ny[mid]<=x) l=mid;
30 else r=mid;
31 if (x<ny[r]) return l;
32 return r;
33 }
34 inline int Sum(int x)
35 {
36 int ret=0;
37 for (;x;x-=x&-x)
38 ret+=T[x];
39 return ret;
40 }
41 inline void Add(int x,int delt)
42 {
43 for (;x<=N;x+=x&-x)
44 T[x]+=delt;
45 }
46 int main()
47 {
48 scanf("%d",&N);
49 for (int i=0;i<N;++i)
50 {
51 scanf("%d%d",&x0(i),&y0(i));
52 nod0(i)=i;nod1(i)=i;
53 x1(i)=x0(i),y1(i)=y0(i);
54 }
55 sort(p0,p0+N,cmp0);
56 sta[nod0(0)]=end[nod0(N-1)]=1;
57 for (int i=1;i<N;++i)
58 sta[nod0(i)]=(y0(i)!=y0(i-1));
59 for (int i=0;i<N-1;++i)
60 end[nod0(i)]=(y0(i)!=y0(i+1));
61 ny[++New]=y0(0);
62 for (int i=1;i<N;++i)
63 if (y0(i)!=y0(i-1)) ny[++New]=y0(i);
64 sort(p1,p1+N,cmp1);
65 for (int i=0,k;i<N;i=k)
66 {
67 for (k=i+1;k<N&&x1(i)==x1(k);++k)
68 if (y1(k-1)<y1(k)-1)
69 ret+=Sum(find(y1(k)-1))-Sum(find(y1(k-1)));
70 for (int j=i;j<k;++j)
71 {
72 if (sta[nod1(j)]&&!end[nod1(j)])
73 Add(find(y1(j)),1);
74 if (!sta[nod1(j)]&&end[nod1(j)])
75 Add(find(y1(j)),-1);
76 }
77 }
78 printf("%d\n",N+ret);
79 return 0;
80 }
81
]]>
]]>
]]>
]]>
b x y琛ㄧず鏌ヨx y鐨勮繛閫氭?濡傛灉榪為氳緭鍑?no"鍚﹀垯杈撳嚭"yes"騫跺湪x,y涔嬮棿榪炶竟
p x y琛ㄧず灝唜鑺傜偣鏉冨間慨鏀逛負y
e x y琛ㄧず鏌ヨx鍒皔璺緞涓婄殑鏉冨煎拰 濡傛灉榪為氳緭鍑虹瓟妗堝惁鍒欒緭鍑?impossible"
N<=30000 Q<=300000
鍋氭硶錛?br>瑕佸湪綰夸箞..鍔ㄦ佹爲鎼炴悶鍚?br>
瀵逛簬B
鏌ヨ涓や釜鑺傜偣鏄惁鍦ㄥ悓涓媯靛姩鎬佹爲涓?鍏跺疄渚挎槸鎷夊疄鍚庣湅鏍硅妭鐐規槸鍚︿竴鏍?br>濡傛灉涓嶈繛閫?閭d箞灝嗗叾涓竴涓妭鐐瑰彉鎴愭墍鍦ㄥ姩鎬佹爲鐨勬牴 鐒跺悗鎺ュ埌鍙︿竴涓妭鐐逛笂鍘?br>
瀵逛簬P 娌′粈涔堝ソ璇寸殑 鍒繕浜唘pdate
瀵逛簬E 涔熸病浠涔堝ソ璇寸殑 涓ゆ鎷夊疄灝卞彲浠ヤ簡 鎵懼埌LCA鐒跺悗鏌ヨ
2 struct Tsplay
3 {
4 #define Lch(t) (T[t].l)
5 #define Rch(t) (T[t].r)
6 #define Par(t) (T[t].p)
7 #define Sum(t) (T[t].sum)
8 #define Val(t) (T[t].val)
9 #define Rev(t) (T[t].rev)
10 #define Root(t) (Lch(Par(t))!=t&&Rch(Par(t))!=t)
11 int l,r,p;
12 int sum,val;
13 bool rev;
14 } T[30005];
15 int Stk[30005],N,Q,x,y;
16 char cmd[1005];
17 inline void Down(int x)
18 {
19 if (Rev(x))
20 {
21 int t=Lch(x);Lch(x)=Rch(x);Rch(x)=t;
22 Rev(Lch(x))^=1,Rev(Rch(x))^=1,Rev(x)=0;
23 }
24 }
25 inline void Tupdate(int x)
26 {
27 Sum(x)=Sum(Lch(x))+Val(x)+Sum(Rch(x));
28 }
29 inline void zig(int x)
30 {
31 int y=Par(x),z=Par(y);
32 Lch(y)=Rch(x),Par(Lch(y))=Rch(x)=y;
33 if (Lch(z)==y) Lch(z)=x;
34 else
35 if (Rch(z)==y) Rch(z)=x;
36 Par(x)=z,Par(y)=x;
37 Tupdate(y);
38 }
39 inline void zag(int x)
40 {
41 int y=Par(x),z=Par(y);
42 Rch(y)=Lch(x),Par(Rch(y))=Lch(x)=y;
43 if (Lch(z)==y) Lch(z)=x;
44 else
45 if (Rch(z)==y) Rch(z)=x;
46 Par(x)=z,Par(y)=x;
47 Tupdate(y);
48 }
49 inline void splay(int x)
50 {
51 Stk[++Stk[0]]=x;
52 for (int u=x;!Root(u);u=Par(u))
53 Stk[++Stk[0]]=Par(u);
54 for (;Stk[0];--Stk[0])
55 Down(Stk[Stk[0]]);
56 for (int y,z;!Root(x);)
57 {
58 y=Par(x),z=Par(y);
59 if (Root(y))
60 if (Lch(y)==x) zig(x);
61 else zag(x);
62 else
63 if (Lch(z)==y)
64 if (Lch(y)==x) zig(y),zig(x);
65 else zag(x),zig(x);
66 else
67 if (Rch(y)==x) zag(y),zag(x);
68 else zig(x),zag(x);
69 }
70 Tupdate(x);
71 }
72 inline int Expose(int u)
73 {
74 int v=0;
75 for (;u;u=Par(u))
76 splay(u),Rch(u)=v,Tupdate(v=u);
77 for (;Lch(v);v=Lch(v));
78 return v;
79 }
80 inline void Modify(int x,int y)
81 {
82 splay(x),Val(x)=y,Tupdate(x);
83 }
84 inline void Query(int x,int y)
85 {
86 int Ry=Expose(y),Rx=Expose(x);
87 if (Rx!=Ry) puts("impossible");
88 else
89 for (int u=y,v=0;u;u=Par(u))
90 {
91 if (splay(u),!Par(u))
92 {
93 printf("%d\n",Sum(Rch(u))+Val(u)+Sum(v));
94 return;
95 }
96 Rch(u)=v,Tupdate(v=u);
97 }
98 }
99 inline void Connect(int x,int y)
100 {
101 int Ry=Expose(y),Rx=Expose(x);
102 if (Rx==Ry) puts("no");
103 else
104 {
105 splay(x);
106 Rch(x)=0,Rev(x)=1,Par(x)=y;
107 puts("yes");
108 }
109 }
110 int main()
111 {
112 freopen("otoci.in","r",stdin);
113 freopen("otoci.out","w",stdout);
114 scanf("%d",&N);
115 for (int i=1;i<=N;++i)
116 scanf("%d",&Val(i)),Sum(i)=Val(i);
117 for (scanf("%d",&Q);Q--;)
118 {
119 scanf("%s%d%d",cmd,&x,&y);
120 if (cmd[0]=='e') Query(x,y);
121 else
122 if (cmd[0]=='b') Connect(x,y);
123 else Modify(x,y);
124 }
125 return 0;
126 }
127
128
]]>
鍋氭硶錛?br>splay涔辨悶鎼?.
鍙渶瑕佺煡閬?鐐癸細
1.鏁存5鏍戠殑涓簭閬嶅巻搴忓垪渚挎槸褰撳墠搴忓垪銆?br>2.緲昏漿涓涓尯闂寸瓑浠蜂簬浜ゆ崲瀛愭爲涓墍鏈夎妭鐐圭殑宸﹀瓙鏍戝拰鍙沖瓙鏍戙?br>3.浼犳噿鏍囪瑕佹敞鎰忓湪姝g‘鐨勬椂鍊欎笅浼狅紝浠ュ強瑕佸皢鏂版敼鍙樼殑鑺傜偣splay鍒版牴銆?br>
2 #include <cstring>
3 struct Tsplay
4 {
5 #define Lch(t) T[t].l
6 #define Rch(t) T[t].r
7 #define Par(t) T[t].p
8 #define Max(t) T[t].max
9 #define Delt(t) T[t].delt
10 #define Val(t) T[t].val
11 #define Rev(t) T[t].rev
12 #define Size(t) T[t].size
13 int l,r,p,size;
14 int delt,max,val;
15 bool rev;
16 } T[50005];
17 int Stk[50005],root,Root;
18 int N,M,cmd,x,y,delt;
19 inline void Down(int t)
20 {
21 if (Delt(t))
22 {
23 if (Lch(t)) Delt(Lch(t))+=Delt(t),Val(Lch(t))+=Delt(t),Max(Lch(t))+=Delt(t);
24 if (Rch(t)) Delt(Rch(t))+=Delt(t),Val(Rch(t))+=Delt(t),Max(Rch(t))+=Delt(t);
25 Delt(t)=0;
26 }
27 if (Rev(t))
28 {
29 int tmp=Lch(t);Lch(t)=Rch(t);Rch(t)=tmp;
30 Rev(Lch(t))^=1,Rev(Rch(t))^=1,Rev(t)=0;
31 }
32 }
33 inline void Tupdate(int t)
34 {
35 Size(t)=1,Max(t)=Val(t);
36 if (Lch(t))
37 {
38 if (Max(Lch(t))>Max(t)) Max(t)=Max(Lch(t));
39 Size(t)+=Size(Lch(t));
40 }
41 if (Rch(t))
42 {
43 if (Max(Rch(t))>Max(t)) Max(t)=Max(Rch(t));
44 Size(t)+=Size(Rch(t));
45 }
46 }
47 inline void zig(int x)
48 {
49 int y=Par(x),z=Par(y);
50 Lch(y)=Rch(x),Par(Lch(y))=Rch(x)=y;
51 if (Lch(z)==y) Lch(z)=x;
52 else Rch(z)=x;
53 Par(x)=z,Par(y)=x;
54 Tupdate(y);
55 }
56 inline void zag(int x)
57 {
58 int y=Par(x),z=Par(y);
59 Rch(y)=Lch(x),Par(Rch(y))=Lch(x)=y;
60 if (Lch(z)==y) Lch(z)=x;
61 else Rch(z)=x;
62 Par(x)=z,Par(y)=x;
63 Tupdate(y);
64 }
65 inline void splay(int &root,int x)
66 {
67 Stk[++Stk[0]]=x;
68 for (int u=x;Par(u);u=Par(u))
69 Stk[++Stk[0]]=Par(u);
70 for (;Stk[0];--Stk[0])
71 Down(Stk[Stk[0]]);
72 for (int y,z;Par(x);)
73 {
74 y=Par(x),z=Par(y);
75 if (!z)
76 if (Lch(y)==x) zig(x);
77 else zag(x);
78 else
79 if (Lch(z)==y)
80 if (Lch(y)==x) zig(y),zig(x);
81 else zag(x),zig(x);
82 else
83 if (Rch(y)==x) zag(y),zag(x);
84 else zig(x),zag(x);
85 }
86 Tupdate(root=x);
87 }
88 inline int Findkth(int k)
89 {
90 if (k==0) return 0;
91 if (k>N) return N+1;
92 for (int p=root;;)
93 {
94 Down(p);
95 if (k<=Size(Lch(p))) p=Lch(p);
96 else
97 if (k<=Size(Lch(p))+1) return p;
98 else k-=Size(Lch(p))+1,p=Rch(p);
99 }
100 }
101 inline int Findintv(int l,int r)
102 {
103 int u=Findkth(l-1),v=Findkth(r+1),tmp;
104 if (l==1&&r==N) return root;
105 if (u<1) return splay(root,v),Lch(v);
106 if (v>N) return splay(root,u),Rch(u);
107 splay(root,v);
108 Par(Lch(v))=0;
109 splay(Lch(v),u);
110 Par(u)=v;
111 return Rch(u);
112 }
113 int main()
114 {
115 scanf("%d%d",&N,&M);
116 root=1;
117 for (int i=1;i<=N;++i)
118 Par(i)=i-1,Rch(i-1)=i,Size(i)=N-i+1;
119 for (int i=1;i<=M;++i)
120 {
121 scanf("%d%d%d",&cmd,&x,&y);
122 Root=Findintv(x,y);
123 if (cmd==1)
124 {
125 scanf("%d",&delt);
126 Delt(Root)+=delt,Max(Root)+=delt,Val(Root)+=delt;
127 splay(root,Root);
128 }
129 else
130 if (cmd==2) Rev(Root)^=1;
131 else printf("%d\n",Max(Root));
132 }
133 return 0;
134 }
135
]]>