• bzoj 4415: [Shoi2013]发牌


    2333,一开始想了一下,嗯,就是支持一个点删除,然后翻转的话,就把(删除点之后)总区间,点的左区间和右区间都翻转一下就好了。

    然后开开心心的码完,sb的调了半天。然后TLE

    呵呵呵

    然后弱势围观题解,题解就写了30行多。

    原来这种东西可以用权值线段树来维护还有哪些点可行,而且每一次的销牌可以看做是向右移动多少位置(当然要取模的)

    诶,太弱了。代码能力什么的,根本没有233

      1 /*#include <cstdio>
      2 #include <iostream>
      3 #include <cstring>
      4 #include <algorithm>
      5 #define inf 0x3f3f3f3f
      6 #define LL long long
      7 #define eps 1e-8
      8 #define N 100005
      9 #define ls c[x][0]
     10 #define rs c[x][1]
     11 using namespace std;
     12 inline int ra()
     13 {
     14     int x=0,f=1; char ch=getchar();
     15     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
     16     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
     17     return x*f;
     18 }
     19 
     20 const int maxn=700010;
     21 
     22 int root,n;
     23 
     24 struct Splay_Tree
     25 {
     26     int fa[maxn],c[maxn][2],size[maxn];
     27     bool rev[maxn];
     28     
     29     void update(int x) {size[x]=size[ls]+size[rs]+1;}
     30     void pushdown(int x)
     31     {
     32         if (rev[x]) {rev[x]^=1; rev[ls]^=1; rev[rs]^=1; swap(ls,rs);}
     33     }
     34     bool which(int x) {return c[fa[x]][1]==x;}
     35     void build(int l, int r, int FA)
     36     {
     37         if (l>r) return;
     38         if (l==r) {
     39             size[l]=1; fa[l]=FA; c[FA][l>=FA]=l;
     40             return;
     41         }
     42         int mid=l+r>>1;
     43         fa[mid]=FA; c[FA][mid>=FA]=mid;
     44         build(l,mid-1,mid); build(mid+1,r,mid);
     45         update(mid);
     46     }
     47     void rotate(int x, int &aim)
     48     {
     49         pushdown(x); 
     50         int y=fa[x],z=fa[y]; bool nx=which(x),ny=which(y);
     51     //    printf("%d %d",y,z);system("pause");
     52         if (y==aim) aim=x; else c[z][ny]=x; fa[x]=z;
     53         fa[c[x][!nx]]=y; c[y][nx]=c[x][!nx];
     54         fa[y]=x; c[x][!nx]=y; update(y); update(x);
     55     }
     56     void Splay(int x, int &aim)
     57     {
     58         while (x!=aim)
     59         {
     60             int y=fa[x],z=fa[y];
     61             if (y!=aim)
     62             {
     63                 if (which(x)==which(y)) rotate(y,aim);
     64                     else rotate(x,aim);
     65             }
     66             rotate(x,aim);
     67         }
     68     }
     69     int find(int x, int rank)
     70     {
     71         pushdown(x);
     72     //    cout<<x;system("pause");
     73         if (!x) return 0;
     74         if (rank==size[ls]+1) return x;
     75         else if (rank<=size[ls]) return find(ls,rank);
     76         else return find(rs,rank-size[ls]-1);
     77     }
     78     void rever(int l, int r)
     79     {
     80         int x=find(root,l),y=find(root,r+2);
     81         Splay(x,root); Splay(y,c[x][1]);
     82         rev[c[y][0]]^=1;
     83     }
     84     void del(int pos)
     85     {
     86         int x=find(root,pos),y=find(root,pos+2);
     87     //    printf("%d %d
    ",x,y);system("pause");
     88         Splay(x,root); Splay(y,c[x][1]);
     89         fa[c[y][0]]=0; c[y][0]=0;
     90         update(y); update(x);
     91     }
     92 }T;
     93 int main(int argc, char const *argv[])
     94 {
     95     n=ra();
     96     T.build(1,n+2,0); root=n+3>>1;
     97     for (int i=n; i>=1; i--)
     98     {
     99         int x=ra()%i;
    100         printf("%d
    ",T.find(root,x+2)-1);
    101         T.del(x+1);
    102         T.rever(1,x); T.rever(x+1,i-1); T.rever(1,i-1);
    103     //    cout<<"!!!!"<<endl;
    104     }
    105     return 0;
    106 }*/
    107 
    108 /*
    109 #include<bits/stdc++.h>
    110 #define N 1000005
    111 #define LL long long
    112 #define inf 0x3f3f3f3f
    113 #define ls tr[x][0]
    114 #define rs tr[x][1]
    115 using namespace std;
    116  int ra()
    117 {
    118     int x=0,f=1; char ch=getchar();
    119     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    120     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    121     return x*f;
    122 }
    123 int buf[30];
    124  void write(int x)
    125 {
    126     if (x<0) putchar('-'),x=-x;
    127     buf[0]=0;
    128     while (x) buf[++buf[0]]=x%10,x/=10;
    129     if (!buf[0]) buf[0]=1,buf[1]=0;
    130     while (buf[0]) putchar('0'+buf[buf[0]--]);
    131     puts("");
    132 }
    133 struct SPLAY{
    134     bool rev[N];
    135     int fa[N],tr[N][2],root,v[N],size[N],w[N],cnt;
    136     
    137      bool which(int x){return tr[fa[x]][1]==x;}
    138      void update(int x){size[x]=size[ls]+size[rs]+1;}
    139     void build(int l, int r, int FA)
    140     {
    141         if (l>r) return;
    142         if (l==r) {
    143             size[l]=1; fa[l]=FA; tr[FA][l>=FA]=l;
    144             return;
    145         }
    146         int mid=l+r>>1;
    147         fa[mid]=FA; tr[FA][mid>=FA]=mid;
    148         build(l,mid-1,mid); build(mid+1,r,mid);
    149         update(mid);
    150     }
    151      void rotate(int x)
    152     {
    153         int y=fa[x],z=fa[y]; bool nx=which(x),ny=which(y);
    154         tr[y][nx]=tr[x][!nx]; fa[tr[x][!nx]]=y;
    155         fa[y]=x; tr[x][!nx]=y; fa[x]=z;
    156         if (z) tr[z][ny]=x; update(y); update(x);
    157     }
    158      void splay(int x, int aim)
    159     {
    160         while (fa[x]!=aim)
    161         {
    162             int y=fa[x],z=fa[y];
    163             if (z==aim) rotate(x);
    164             else if (which(x)==which(y)) rotate(y),rotate(x);
    165             else rotate(x),rotate(x);
    166         }
    167         if (!aim) root=x; update(x);
    168     }
    169     void insert(int val)
    170     {
    171         int x=root;
    172         for (;;)
    173         {
    174             if (val<v[x]) 
    175                 if (!ls) {ls=val,fa[ls]=x,size[ls]=1; splay(ls,0); break;} else x=ls;
    176             else if (!rs) {rs=val,fa[rs]=x,size[rs]=1; splay(rs,0); break;} else x=rs;
    177         }
    178     }
    179      void pushdown(int x)
    180     {
    181         if (rev[x])
    182         {
    183             swap(ls,rs);
    184             rev[ls]^=1; rev[rs]^=1;
    185             rev[x]=0;
    186         }
    187     }
    188      int find(int x, int rank)
    189     {
    190         pushdown(x);
    191         if (!x) return 0;
    192         if (size[ls]+1==rank) return x;
    193         else if (size[ls]>=rank) return find(ls,rank);
    194         else return find(rs,rank-size[ls]-1);
    195     }
    196      void rever(int l, int r)
    197     {
    198         if (l>r) return;
    199         int x=find(root,l);int y=find(root,r+2);
    200         splay(x,0); splay(y,x);
    201         rev[tr[y][0]]^=1;
    202     }
    203      void del(int pos)
    204     {
    205         int x=find(root,pos),y=find(root,pos+2);
    206     //    printf("%d %d
    ",x,y);system("pause");
    207     //    cout<<tr[y][0];
    208         splay(x,0); splay(y,x);
    209         fa[tr[y][0]]=0; tr[y][0]=0;
    210         update(y); update(x);
    211     }
    212 }T;
    213 int n,m;
    214 int main()
    215 {
    216     freopen("bzoj4415_data.in","r",stdin);
    217     freopen("bzoj4415_data.out","w",stdout);
    218     n=ra();
    219   //  for (int i=1; i<=n+2; i++) T.insert(i);
    220       T.build(1,n+2,0); T.root=n+3>>1;// for (int i=1; i<=n+2; i++) printf("%d %d %d
    ",T.fa[i],T.tr[i][0],T.tr[i][1]);
    221     for (int i=n; i>=1; i--)
    222     {
    223         int x=ra()%i; //cout<<x;
    224         write(T.find(T.root,x+2)-1); T.del(x+1); 
    225  //   for (int j=1; j<=i+1; j++)
    226   //      printf("%d ",T.find(T.root,j)-1); cout<<endl;
    227         T.rever(1,x); T.rever(x+1,i-1); T.rever(1,i-1); 
    228         
    229    // for (int j=1; j<=i+1; j++)
    230    //     printf("%d ",T.find(T.root,j)-1);
    231     }
    232 }*/
    233 
    234 
    235 
    236 
    237 
    238 
    239 
    240 #include<bits/stdc++.h>
    241 #define N 1000005
    242 #define LL long long
    243 #define inf 0x3f3f3f3f
    244 #define ls tr[x][0]
    245 #define rs tr[x][1]
    246 using namespace std;
    247  int ra()
    248 {
    249     int x=0,f=1; char ch=getchar();
    250     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    251     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    252     return x*f;
    253 }
    254 struct seg{int l,r,sum,msg;}t[N<<2],tree[N<<2];
    255 int n;
    256 void build(int k, int l, int r)
    257 {
    258     t[k].l=l; t[k].r=r;
    259     if (l==r) {t[k].sum=1; return;}
    260     int mid=l+r>>1;
    261     build(k<<1,l,mid); build(k<<1|1,mid+1,r); 
    262     t[k].sum=r-l+1;
    263 }
    264 int query(int k, int x)
    265 {
    266     int l=t[k].l,r=t[k].r;
    267     t[k].sum--;
    268     return l==r?l:(t[k<<1].sum>=x?query(k<<1,x):query(k<<1|1,x-t[k<<1].sum));
    269 }
    270 int main()
    271 {
    272     n=ra(); build(1,1,n); int now=0;
    273     while (n--)
    274     {
    275         int x=ra(); (now+=x)%=(n+1);
    276         printf("%d
    ",query(1,now+1));
    277     }
    278 }
  • 相关阅读:
    ckeditor 3.0.1使用
    也谈QQ表情弹出框的制作
    百度的模态弹出窗口
    day03 set集合,文件操作,字符编码以及函数式编程
    写在开始之前
    day07 类的进阶,socket编程初识
    day06 面向对象编程
    day02 Python 的模块,运算,数据类型以及方法
    day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数
    day08 多线程socket 编程,tcp粘包处理
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6657663.html
Copyright © 2020-2023  润新知