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); } }}
阅读全文
0 0
- 2017.5.15 项链工厂 思考记录
- 2017.5.7 能量项链 思考记录
- 2017.9.18 HH的项链 思考记录
- NOI 项链工厂
- 1493: [NOI2007]项链工厂
- [BZOJ1493][NOI2007]项链工厂
- bzoj1493: [NOI2007]项链工厂
- 2017.5.14-15 CPU监控 思考记录
- 【线段树】【NOI2007】项链工厂
- 【BZOJ 1493】[NOI2007]项链工厂
- 【bzoj1493】项链工厂【线段树】
- bzoj1493: [NOI2007]项链工厂 splay
- BZOJ1493: [NOI2007]项链工厂 Splay
- [题解]bzoj1493 NOI2007项链工厂
- 【BZOJ】1493 [NOI2007]项链工厂 线段树
- BZOJ 1493 NOI2007 项链工厂 Splay
- BZOJ 1493 NOI 2007 项链工厂 Splay
- 【BZOJ】【P1493】【NOI2007】【项链工厂】【题解】【Treap】
- 从一道面试题谈js函数声明
- 今天做到一道面试题:关于堆内存与栈内存的区别
- java 获取elasticsearch Client以及 判断是否存在此索引
- python抓取安居客上的所有地区链接
- 强大的集合操作类Stream(一)
- 2017.5.15 项链工厂 思考记录
- Altium Designer 电路设计1
- php7+apache2.4+phalcon 问题 How to enable rewrite module in Apache
- vue自定义指令
- C++primer学习笔记-----6.5特殊用途语言特性
- PackageManagerService——掌管APP的安装、卸载和查询
- 如何实现本机Windows连接虚拟机中的CentOS
- jira6.3.6破解版本安装指导
- 数独游戏--判断现有数字是否有解--不管是否最终有解Valid Sudoku