2017.5.15 项链工厂 思考记录

来源:互联网 发布:星巴克巧克力知乎 编辑:程序博客网 时间:2024/06/04 18:50

        有是神烦码力费时题、

       对于不同的操作只需要抓住一个原则:

          顺时针是+   逆时针是-   F是顺逆互换


   所以就可以打 区间赋值线段树了(和颜色种数没关系)


    犯得错误:1、  开数组  <<1、、、

                        2、  忘了up、、、

                        3、  忘了仔细考虑=的情况、、有时候=的情况不是随便随>、<的、




好像偏移的时候没这么麻烦、、、太追求实际意义了、

又瘦又长的码:

#include<iostream>#include<cstdio>using namespace std;#define zuo l,mid,o<<1#define you mid+1,r,o<<1|1#define N 500005#include<cmath>int z[N<<2],y[N<<2],c[N<<2],x,fx,linz,liny,lin1,lin2,a,b,la,lb,bj[N<<2],op,ans,qi=1,n,q,k,i; char ch[5];void down(int o){if(bj[o]){z[o<<1]=bj[o];y[o<<1|1]=bj[o];c[o<<1]=1;c[o<<1|1]=1;y[o<<1]=bj[o];z[o<<1|1]=bj[o];bj[o<<1]=bj[o];bj[o<<1|1]=bj[o];}bj[o]=0;}void up(int o){c[o]=c[o<<1]+c[o<<1|1];if(y[o<<1]==z[o<<1|1]){c[o]--;}y[o]=y[o<<1|1];z[o]=z[o<<1];}void jian(int l,int r,int o){if(l==r){scanf("%d",&x);c[o]=1;z[o]=x;y[o]=x;return;}int mid=(l+r)>>1;jian(zuo);jian(you);up(o);}void wen(int l,int r,int o){if(l!=r)down(o);if(a<=l&&r<=b){if(op==1){if(!linz){linz=z[o];        liny=y[o];ans+=c[o];return;}ans+=c[o];if(liny==z[o])ans--;liny=y[o];return;}if(op==2){z[o]=x;y[o]=x;c[o]=1;bj[o]=x;return;}if(op==3){ans=z[o];return;}}int mid=(l+r)>>1;if(a<=mid)wen(zuo);if(b>mid)wen(you);up(o);}void shun(int &p){int lin=qi+p;if(lin>n){p=lin%n;if(p==0)p=n;}else p=lin;}void ni(int &p){int lin=qi-p;if(lin<=0){  p=lin+n*(fabs(lin/n)+1);}else p=lin;}int main(){scanf("%d%d",&n,&k);qi=1;jian(1,n,1); scanf("%d",&q); for(i=1;i<=q;i++) { scanf("%s",ch);while(ch[0]=='\n')scanf("%s",ch); if(ch[0]=='R') {           scanf("%d",&x);if(fx==0){    qi-=x;if(qi<=0)qi+=n*(fabs(qi/n)+1);    }else    {qi+=x;qi%=n;if(qi==0)qi=n;}    }    if(ch[0]=='F')fx^=1; if(ch[0]=='S') { scanf("%d%d",&la,&lb); la--;lb--; if(fx==0) {  shun(la);shun(lb); }else {   ni(la);ni(lb); } a=la; b=la;             op=3;             wen(1,n,1);     lin1=ans;          a=lb;     b=lb;     wen(1,n,1); lin2=ans;  a=la;  b=la;  op=2;  x=lin2;  wen(1,n,1);  a=lb;  b=lb;  op=2;  x=lin1;  wen(1,n,1); } if(ch[1]=='S') { scanf("%d%d",&la,&lb); la--;lb--; op=1;ans=0;           if(fx==0)           {           shun(la);           shun(lb);   if(la<=lb) {a=la;b=lb;linz=0;wen(1,n,1);  }else  {  a=la;b=n;  linz=0;wen(1,n,1);  lin1=liny;  a=1; b=lb;  linz=0;wen(1,n,1);  lin2=linz;  //////////linz  if(lin1==lin2)ans--;  if(ans==0)ans++;}     }else   {   ni(la);   ni(lb);   if(la>=lb)   {   a=lb;b=la;linz=0;wen(1,n,1);   }else{a=lb;b=n;  linz=0;wen(1,n,1);  lin1=liny;  a=1; b=la;  linz=0;wen(1,n,1);  lin2=linz;  //////////linz  if(lin1==lin2)ans--;}   } printf("%d\n",ans); continue; } if(ch[0]=='P') { scanf("%d%d%d",&la,&lb,&x); la--;lb--;  op=2; //if(la==lb){op=2; a=1,b=n;wen(1,n,1); continue;} if(fx==0) {shun(la);  shun(lb); if(la>lb) { a=1; b=lb; wen(1,n,1); a=la,b=n;  wen(1,n,1); }else { a=la,b=lb; wen(1,n,1);  }}else{ni(la);ni(lb);if(la<lb){ a=1; b=la; wen(1,n,1);  a=lb,b=n;  wen(1,n,1);}else{ a=lb; b=la; wen(1,n,1);}}  } if(ch[0]=='C') {  linz=0; a=1; b=n; ans=0; op=1; wen(1,n,1); if(linz==liny)ans--; if(ans==0)ans++; printf("%d\n",ans); } }}


原创粉丝点击