CodeVS1743 反转卡片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeVS1743 反转卡片相关的知识,希望对你有一定的参考价值。

传送门

splay裸裸哒区间翻转维护,月考考跪装作很开心的样子

直接贴代码。

技术分享
  1 //CodeVS
  2 //by Cydiater
  3 //2016.9.11
  4 #include <iostream>
  5 #include <cstring>
  6 #include <string>
  7 #include <algorithm>
  8 #include <queue>
  9 #include <map>
 10 #include <cstdio>
 11 #include <cmath>
 12 #include <ctime>
 13 #include <iomanip>
 14 #include <cstdlib>
 15 using namespace std;
 16 #define ll long long
 17 #define up(i,j,n)        for(int i=j;i<=n;i++)
 18 #define down(i,j,n)        for(int i=j;i>=n;i--)
 19 const int MAXN=1e6+5;
 20 const int oo=0x3f3f3f3f;
 21 inline int read(){
 22     char ch=getchar();int x=0,f=1;
 23     while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}
 24     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
 25     return x*f;
 26 }
 27 int N,a[MAXN],tol=0,root=0,ans=0;
 28 struct SplayTree{
 29     int son[2],fa,v,siz,tag;
 30 }t[MAXN];
 31 namespace solution{
 32     int get(int node){return t[t[node].fa].son[1]==node;}
 33     void updata(int node){
 34         if(node){
 35             t[node].siz=1;
 36             if(t[node].son[0])t[node].siz+=t[t[node].son[0]].siz;
 37             if(t[node].son[1])t[node].siz+=t[t[node].son[1]].siz;
 38         }
 39     }
 40     void downit(int node){
 41         if(t[node].tag){
 42             swap(t[node].son[0],t[node].son[1]);
 43             t[t[node].son[0]].tag^=1;t[t[node].son[1]].tag^=1;
 44             t[node].tag=0;
 45         }
 46     }
 47     int get_node(int num){
 48         int now=root;
 49         while(1){
 50             downit(now);
 51             int tmp=(t[now].son[0]?t[t[now].son[0]].siz:0);
 52             if(num==tmp+1)                        return now;
 53             if(tmp>=num)now=t[now].son[0];
 54             else{
 55                 num-=(tmp+1);
 56                 now=t[now].son[1];
 57             }
 58         }
 59     }
 60     void rotate(int node){
 61         int old=t[node].fa,oldf=t[old].fa,which=get(node);
 62         t[old].son[which]=t[node].son[which^1];t[t[old].son[which]].fa=old;
 63         t[old].fa=node;t[node].son[which^1]=old;t[node].fa=oldf;
 64         if(oldf)t[oldf].son[old==t[oldf].son[1]]=node;
 65         updata(old);updata(node);
 66     }
 67     void splay(int node,int aim){
 68         for(int fa;(fa=t[node].fa);rotate(node)){
 69             if(node==aim)    break;
 70             if(t[node].fa==aim){
 71                 rotate(node);
 72                 break;
 73             }
 74             if(t[fa].fa==aim){
 75                 rotate(get(fa)==get(node)?fa:node);
 76                 rotate(node);
 77                 break;
 78             }
 79             rotate(get(fa)==get(node)?fa:node);
 80         }
 81         if(aim==root)root=node;
 82     }
 83     void build(int leftt,int rightt,int node,int fa){
 84         t[node].tag=0;
 85         if(leftt==rightt){
 86             t[node].fa=fa;t[node].son[1]=t[node].son[0]=0;
 87             t[node].v=a[leftt];t[node].siz=1;
 88             return;
 89         }
 90         int mid=(leftt+rightt)>>1;
 91         t[node].fa=fa;t[node].v=a[mid];
 92         if(leftt<=mid-1){
 93             t[node].son[0]=++tol;
 94             build(leftt,mid-1,tol,node);
 95         }
 96         if(mid+1<=rightt){
 97             t[node].son[1]=++tol;
 98             build(mid+1,rightt,tol,node);
 99         }
100         updata(node);
101     }
102     void init(){
103         N=read();
104         up(i,2,N+1)a[i]=read();a[1]=oo;a[N+2]=oo;
105         root=1;
106         build(1,N+2,++tol,0);
107     }
108     void slove(){
109         while(1){
110             int node=get_node(2);
111             if(t[node].v==1)break;
112             int k=t[node].v;
113             //cout<<k<<endl;
114             int leftt=get_node(1),rightt=get_node(k+2);
115             splay(leftt,root);splay(rightt,t[root].son[1]);
116             int son=t[root].son[1];t[t[son].son[0]].tag^=1;
117             if(++ans==100000){
118                 ans=-1;
119                 break;
120             }
121         }
122     }
123     void output(){
124         cout<<ans<<endl;
125     }
126 }
127 int main(){
128     //freopen("input.in","r",stdin);
129     using namespace solution;
130     init();
131     slove();
132     output();
133     return 0;
134 }
View Code

 

是时候去搞LCT了!

以上是关于CodeVS1743 反转卡片的主要内容,如果未能解决你的问题,请参考以下文章

[codevs1743]反转卡片

codevs 1743 反转卡片 rope or splay

1743 反转卡片

Splay复习

选项卡片段内的卡片视图

大神的游戏(codevs 1353)