BZOJ 2002 && BZOJ 2409 LCT && BZOJ 3282 初步练习

Posted on 2016-07-07 18:55  yyjxx2010xyu  阅读(213)  评论(0编辑  收藏  举报
 1 #include <cstdio>
 2 const int Maxn=400010;
 3 inline void Get_Int(int & x)
 4 {
 5     char ch=getchar(); x=0;
 6     while (ch<'0' || ch>'9') ch=getchar();
 7     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
 8 }
 9 //========================================
10 char str[20];
11 int n,m,u,v;
12 struct Node;
13 inline void Swap(Node *&x,Node *&y);
14 struct Node
15 {
16     Node * pre,* ch[2];
17     int rev;
18     inline int d() {return pre->ch[1]==this;}
19     inline void Rev() {Swap(ch[0],ch[1]),rev^=1;}
20     inline void setc(Node * r,int d) {ch[d]=r; r->pre=this;}
21 }; 
22 Node Memory[Maxn],* Port=Memory,* null,* S[Maxn],* t[Maxn];
23 inline void Swap(Node *&x,Node *&y) {Node * t=x;x=y;y=t;}
24 inline void Init() {null=Port++; null->rev=0; null->pre=null->ch[0]=null->ch[1]=null;}
25 inline Node * NewNode(){Node * Ret=Port++; Ret->rev=0; Ret->pre=Ret->ch[0]=Ret->ch[1]=null; return Ret;}
26 inline bool IsRoot(Node * x) {return x->pre==null || (x->pre->ch[0]!=x && x->pre->ch[1]!=x);}
27 inline bool Push_Down(Node * x) 
28 {
29     if (x->rev)
30     {
31         x->rev=0;
32         x->ch[0]->Rev();
33         x->ch[1]->Rev();
34     }
35 }
36 inline void Rotate(Node * x)
37 {
38     Node * y=x->pre; int d=x->d();
39     Push_Down(y); Push_Down(x);
40     if (IsRoot(y)) x->pre=y->pre; else y->pre->setc(x,y->d());
41     y->setc(x->ch[!d],d);
42     x->setc(y,!d);
43 }
44 inline void Splay(Node * x)
45 {
46     Push_Down(x);
47     while (!IsRoot(x))
48         if (IsRoot(x->pre)) Rotate(x); else
49         (x->pre->d()==x->d()) ? (Rotate(x->pre),Rotate(x)) : (Rotate(x),Rotate(x));
50 }
51 inline void Access(Node * f)
52 {
53     Node * c=null;
54     while (f!=null)
55     {
56         Splay(f);
57         f->ch[1]=c;
58         c=f;
59         f=f->pre;
60     }
61 }
62 inline void Make_Root(Node * x)
63 {
64     Access(x),Splay(x),x->Rev();
65 }
66 inline void Link(Node * x,Node * y)
67 {
68     Make_Root(x),x->pre=y;
69 }
70 inline void Cut(Node * x,Node * y) 
71 {
72     Access(x),Splay(x),Splay(y);
73     if (y->pre!=x) Swap(x,y);
74     Access(x),Splay(x),Splay(y);
75     y->pre=null;
76 }
77 inline Node * Find(Node * x)
78 {
79     while (x->pre!=null) x=x->pre; return x;
80 }
81 inline bool Check(Node * x,Node * y)
82 {
83     if (Find(x)==Find(y)) return true; else return false;
84 }
85 int main()
86 {
87     Init();
88     Get_Int(n),Get_Int(m);
89     for (int i=1;i<=n;i++) t[i]=NewNode();
90     for (int i=1;i<=m;i++)
91     {
92         scanf("%s",str); Get_Int(u),Get_Int(v);
93         if (str[0]=='C') Link(t[u],t[v]);
94         if (str[0]=='D') Cut(t[u],t[v]);
95         if (str[0]=='Q') puts(Check(t[u],t[v])?"Yes":"No");
96     }
97     return 0;
98 }
99 
BZOJ 2409
  1 #include <cstdio>
  2 inline void Get_Int(int &x)
  3 {
  4     x=0; register char ch=getchar(); int f=1;
  5     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
  6     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} x*=f;
  7 }
  8 inline void Put_Int(int x)
  9 {
 10     char ch[20]; register int top=0;
 11     if (x<0) putchar('-'),x=-x;
 12     if (x==0) ch[++top]='0';
 13     while (x) ch[++top]=x%10+'0',x/=10;
 14     while (top) putchar(ch[top--]); putchar('\n');
 15 }
 16 inline int Min(int x,int y) {return x>y?y:x;}
 17 //===============================================
 18 const int Maxn=400010;
 19 int n,m,k[Maxn],x,y,Type;
 20 struct Node
 21 {
 22     Node * pre,* ch[2];
 23     int size,rev;
 24     inline int d() {return pre->ch[1]==this;}
 25     inline void setc(Node * r,int d) {ch[d]=r; r->pre=this;}
 26 };
 27 Node Memory[Maxn],* port=Memory,* t[Maxn],* null,* S[Maxn];
 28 inline void Swap(Node *&x,Node *&y) {Node * t=x;x=y;y=t;} 
 29 inline void Init() {null=port++; null->rev=0; null->size=0;null->pre=null->ch[0]=null->ch[1]=null;}
 30 inline Node * NewNode(){Node * Ret=port++; Ret->ch[0]=Ret->ch[1]=Ret->pre=null;Ret->size=1;Ret->rev=0; return Ret;}
 31 inline void Push_Up(Node * x) {x->size=x->ch[0]->size+x->ch[1]->size+1;}
 32 inline void Push_Down(Node * x) 
 33 {
 34     if (x->rev) 
 35     {
 36         x->ch[0]->rev^=1;
 37         x->ch[1]->rev^=1;
 38         x->rev=0;
 39         Swap(x->ch[0],x->ch[1]);
 40     }
 41 }
 42 inline bool IsRoot(Node * x) {return x->pre==null || (x->pre->ch[0]!=x && x->pre->ch[1]!=x);}
 43  
 44 inline void Rotate(Node * x)
 45 {
 46     Node * y=x->pre; int d=x->d();
 47     if (IsRoot(y)) x->pre=y->pre; else y->pre->setc(x,y->d());
 48     y->setc(x->ch[!d],d);
 49     x->setc(y,!d);
 50     Push_Up(y),Push_Up(x);
 51 }
 52 inline void Splay(Node * x)
 53 {
 54     int s=1; S[1]=x; Node * r=x; 
 55     while (!IsRoot(r->pre)) S[++s]=r=r->pre;
 56     while (s) Push_Down(S[s--]);    
 57      
 58     while (!IsRoot(x))
 59         if (IsRoot(x->pre)) Rotate(x); else
 60         (x->pre->d()==x->d()) ? (Rotate(x->pre),Rotate(x)) : (Rotate(x),Rotate(x));
 61   Push_Up(x);
 62 }
 63  
 64 inline void Access(Node * f)
 65 {
 66     Node * c=null;
 67     while (f!=null)
 68     {
 69         Splay(f);
 70         f->ch[1]=c;
 71         c=f;
 72         f=f->pre;
 73     }
 74 }
 75 inline void Make_Root(Node * r)
 76 {
 77     Access(r),Splay(r),r->rev^=1;
 78 }
 79 inline void Link(Node * x,Node * y)
 80 {
 81     Make_Root(x);x->pre=y;
 82 }
 83 inline void Cut(Node * x,Node * y)
 84 {
 85     Access(x),Splay(y);
 86     if (y->pre!=x) Swap(x,y);
 87     Access(x),Splay(y);
 88     y->pre=null;
 89 }
 90 int main()
 91 {
 92     // freopen("c.in","r",stdin);
 93     Init();
 94     Get_Int(n);
 95     for (int i=1;i<=n+1;i++) t[i]=NewNode();
 96     for (int i=1;i<=n;i++)
 97         Get_Int(x),k[i]=Min(i+x,n+1),Link(t[i],t[k[i]]);
 98     Get_Int(m); Make_Root(t[n+1]);
 99     for (int i=1;i<=m;i++)
100     {
101         Get_Int(Type);
102         if (Type==1) 
103         {
104             Get_Int(x); x++;
105             Make_Root(t[n+1]);
106             Access(t[x]),Splay(t[x]);
107             Put_Int(t[x]->size-1);
108         }
109         if (Type==2)
110         {
111             Get_Int(x),Get_Int(y); x++;
112             Cut(t[x],t[k[x]]); 
113             k[x]=Min(n+1,x+y);
114             Link(t[x],t[k[x]]);
115         }
116     }
117     return 0;
118 }
119 
BZOJ 2002

调了好久,明天在做几题。

 

8.17 

  1   
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cstdio>
  5 #include <algorithm>
  6 using namespace std;
  7 inline void Get_Int(int &x)
  8 {
  9     x=0; char ch=getchar();
 10     while (ch<'0' || ch>'9') ch=getchar();
 11     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
 12 }
 13 inline int Max(int x,int y) {return x>y?x:y;}
 14 inline int Min(int x,int y) {return x>y?y:x;}
 15 //===========================================
 16 const int Maxn=300100;
 17 struct Node
 18 {
 19     Node * pre,* ch[2]; int Rev,Key,v;
 20     inline int d() {return pre->ch[1]==this;}
 21     inline void setc(Node * x,int d) {ch[d]=x; x->pre=this;} 
 22 };
 23 Node Memory[Maxn<<1],* port=Memory,* null,* Nd[Maxn];
 24 int u,v,n,m,x,Type;
 25 inline bool IsRoot(Node * x) {return x->pre==null || (x->pre->ch[1]!=x && x->pre->ch[0]!=x);}
 26 inline void Swap(Node *&x,Node *&y) {Node * T=x;x=y;y=T;}
 27 inline Node * NewNode(int v) {Node * Ret=port++; Ret->v=Ret->Key=v; Ret->Rev=0; Ret->pre=Ret->ch[0]=Ret->ch[1]=null; return Ret;}
 28 inline void Init()  {null=port++; null->pre=null->ch[0]=null->ch[1]=null; null->Rev=null->Key=null->v=0;}
 29 inline void Get_Rev(Node * x)
 30 {
 31     if (x==null) return;
 32     x->Rev^=1; Swap(x->ch[0],x->ch[1]);
 33 }
 34 inline void Push_Down(Node * x)
 35 {
 36     if (x->Rev)
 37     {
 38         x->Rev=0;
 39         Get_Rev(x->ch[1]);
 40         Get_Rev(x->ch[0]);
 41     }
 42 }
 43 inline void Push_Up(Node * x) 
 44 {
 45     x->v=x->ch[0]->v^x->ch[1]->v^x->Key;
 46 }
 47 inline void Rotate(Node * x)
 48 {
 49     Node * y=x->pre; int d=x->d();
 50     Push_Down(y),Push_Down(x);
 51     if (IsRoot(y)) x->pre=y->pre; else  y->pre->setc(x,y->d());
 52     y->setc(x->ch[!d],d);
 53     x->setc(y,!d);
 54     Push_Up(y),Push_Up(x);
 55 }
 56 inline void Splay(Node * x)
 57 {
 58     Push_Down(x);
 59     while (!IsRoot(x))
 60         if (IsRoot(x->pre)) Rotate(x); else
 61             (x->d()==x->pre->d())?(Rotate(x->pre),Rotate(x)):(Rotate(x),Rotate(x));
 62     Push_Up(x);
 63 }
 64 inline void Access(Node * f)
 65 {
 66     Node * x=null;
 67     while (f!=null)
 68     {
 69         Splay(f);
 70         f->ch[1]=x;
 71         x=f;
 72         f=f->pre;
 73     }
 74 }
 75 inline void Make_Root(Node * x)
 76 {
 77     Access(x); Splay(x); Get_Rev(x);
 78 }
 79 inline void Link(Node * x,Node * y)
 80 {
 81     Make_Root(x),x->pre=y;
 82 }
 83 inline void Cut(Node * x,Node * y)
 84 {
 85     Access(x),Splay(x),Splay(y);
 86     if (y->pre!=x) Swap(x,y);
 87     Access(x),Splay(x),Splay(y);
 88     y->pre=null;
 89 }
 90 inline Node * Find(Node * x)
 91 {
 92     while (x->pre!=null) x=x->pre; return x;
 93 }
 94 inline bool Check(int p,int q)
 95 {
 96     if (Find(Nd[p])==Find(Nd[q])) return true; return false;
 97 }
 98 //==================================
 99 inline void Query()
100 {
101     Get_Int(u),Get_Int(v);
102     Make_Root(Nd[u]),Access(Nd[v]),Splay(Nd[v]);
103     printf("%d\n",Nd[v]->v);
104 }
105 inline void Connect()
106 {
107     Get_Int(u),Get_Int(v);
108     if (Check(u,v)) return;
109     Link(Nd[u],Nd[v]);
110 }
111 inline void Delete()
112 {
113     Get_Int(u),Get_Int(v);
114     if (!Check(u,v)) return;
115     Cut(Nd[u],Nd[v]);
116 }
117 inline void Modify()
118 {
119     Get_Int(u),Get_Int(v);
120     Make_Root(Nd[u]); Nd[u]->Key=v; Push_Up(Nd[u]);
121 }
122 int main()
123 {
124     Get_Int(n),Get_Int(m); Init();
125     for (int i=1;i<=n;i++) Get_Int(x),Nd[i]=NewNode(x);
126     for (int i=1;i<=m;i++)
127     {
128         Get_Int(Type);
129         if (Type==0) Query();
130         if (Type==1) Connect();
131         if (Type==2) Delete();
132         if (Type==3) Modify(); 
133     }
134     return 0;
135 }
BZOJ 3282