第一次是用 ODT 过的...(虽说跑得飞慢但它就是能过)

而且还写了发题解...

第二次是在考场上碰到了这道题,然后居然打了线段树,各种 bug 直接让代码爆零

但还是补好了代码重新交了一发,发现跑得还可以...

于是题解也再来一发,不过鉴于 luogu 审题解有点麻烦于是就 cnblogs 上写好了...

ODT 联动 请点赞谢谢...QWQ

关于线段树咱其实就是把原来的环破成链,然后维护这个序列,对于旋转和翻转操作打标记,然后其余四种操作都是线段树上询问和维护就能解决了

然后注意维护的方式就好了,一个是 rotate 要倒着维护以及根据 fl 决定旋转方向,并且对于跨过原端点的区间,我们分成两部分求救,最后合并一下输出就好了

最最关键的一点,询问整个环的时候原本是有个首位相连颜色是否相同的操作,但如果整个环都是一个颜色就需要特判否则会输出 0

当然还有线段树别打炸...

  1. //by Judge
  2. #include<bits/stdc++.h>
  3. #define Rg register
  4. #define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
  5. #define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
  6. #define open(S) freopen(S".in","r",stdin),freopen(S".out","w",stdout)
  7. #define ll long long
  8. using namespace std;
  9. const int M=5e5+3;
  10. typedef int arr[M];
  11. #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
  12. char buf[1<<21],*p1,*p2;
  13. inline int read(){ int x=0,f=1; char c=getchar();
  14. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  15. for(;isdigit(c);c=getchar()) x=x*10+c-48; return x*f;
  16. } inline int pread(){ char c=getchar(); while(!isalpha(c)) c=getchar();
  17. if(c!='C') return c=='F'?1:(c=='R'?2:(c=='S'?3:4)); c=getchar(); return c=='S'?5:6;
  18. } char sr[1<<21],z[21]; int Z,C=-1;
  19. inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
  20. inline void print(int x,char chr='\n'){
  21. if(C>1<<20) Ot(); if(x<0) x=-x,sr[++C]='-';
  22. while(z[++Z]=x%10+48,x/=10);
  23. while(sr[++C]=z[Z],--Z); sr[++C]=chr;
  24. } int n,q,Ro,Fl; arr a;
  25. namespace Seg_T{ int tag[M<<2];
  26. struct Tr{ int num,L,R; }t[M<<2],ans,ze;
  27. #define ls (k<<1)
  28. #define rs (k<<1|1)
  29. #define lson ls,l,mid
  30. #define rson rs,mid+1,r
  31. inline Tr merge(Tr x,Tr y){
  32. if(!x.num) return y; if(!y.num) return x;
  33. return (Tr){x.num+y.num-(x.R==y.L),x.L,y.R};
  34. }
  35. inline void pushdown(int k){ if(!tag[k]) return ;
  36. t[ls]=t[rs]=(Tr){1,tag[k],tag[k]};
  37. tag[ls]=tag[rs]=tag[k],tag[k]=0;
  38. }
  39. void build(int k,int l,int r){ int mid=(l+r)>>1;
  40. if(l==r) return t[k]=(Tr){1,a[l],a[l]},void();
  41. build(lson),build(rson),t[k]=merge(t[ls],t[rs]);
  42. }
  43. void update(int k,int l,int r,int L,int R,int c){ int mid=(l+r)>>1;
  44. if(l>R||L>r) return ; if(L<=l&&r<=R) return t[k]=(Tr){1,c,c},tag[k]=c,void();
  45. pushdown(k); update(lson,L,R,c),update(rson,L,R,c),t[k]=merge(t[ls],t[rs]);
  46. }
  47. Tr query(int k,int l,int r,int L,int R){ int mid=(l+r)>>1;
  48. if(l>R||L>r) return ze; if(L<=l&&r<=R) return t[k];
  49. pushdown(k); return merge(query(lson,L,R),query(rson,L,R));
  50. }
  51. void update_c(int k,int l,int r,int x,int c){ int mid=(l+r)>>1;
  52. if(l==r) return t[k]=(Tr){1,c,c},void(); pushdown(k);
  53. if(x<=mid) update_c(lson,x,c); else update_c(rson,x,c); t[k]=merge(t[ls],t[rs]);
  54. }
  55. int query_c(int k,int l,int r,int x){ int mid=(l+r)>>1;
  56. if(l==r) return t[k].L; pushdown(k);
  57. return x<=mid?query_c(lson,x):query_c(rson,x);
  58. }
  59. } using namespace Seg_T;
  60. // 对于 R、F 操作,打标记处理。对于剩下的操作线段树上维护 (心情复杂)
  61. int main(){ int op,x,y,z;
  62. n=read(),z=read(),ze.num=0;
  63. fp(i,1,n) a[i]=read();
  64. build(1,1,n),q=read();
  65. while(q--){ op=pread();
  66. if(op==1) Fl^=1;
  67. else if(op==2){ x=read();
  68. if(Fl) Ro=(Ro+x)%n; else Ro=(Ro-x+n)%n;
  69. } else if(op==3){ x=read(),y=read();
  70. if(Fl) x=(n-x+1)%n+1,y=(n-y+1)%n+1;
  71. x=(x+Ro-1)%n+1,y=(y+Ro-1)%n+1;
  72. a[x]=query_c(1,1,n,x),a[y]=query_c(1,1,n,y);
  73. update_c(1,1,n,x,a[y]),update_c(1,1,n,y,a[x]);
  74. } else if(op==4){ x=read(),y=read(),z=read();
  75. if(Fl) x=(n-x+1)%n+1,y=(n-y+1)%n+1;
  76. x=(x+Ro-1)%n+1,y=(y+Ro-1)%n+1;
  77. if(Fl) swap(x,y);
  78. if(x>y) update(1,1,n,x,n,z),update(1,1,n,1,y,z);
  79. else update(1,1,n,x,y,z);
  80. } else if(op==5){ x=read(),y=read();
  81. if(Fl) x=(n-x+1)%n+1,y=(n-y+1)%n+1;
  82. x=(x+Ro-1)%n+1,y=(y+Ro-1)%n+1;
  83. if(Fl) swap(x,y);
  84. if(x>y) ans=merge(query(1,1,n,x,n),query(1,1,n,1,y));
  85. else ans=query(1,1,n,x,y); print(max(ans.num,1));
  86. } else print(max(t[1].num-(t[1].L==t[1].R),1));
  87. } return Ot(),0;
  88. }

【NOI2007】项链工厂 ——老题新做.jpg的更多相关文章

  1. Splay POJ3468(老题新做)

    A Simple Problem with Integers Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%I64d ...

  2. 数据结构(Splay平衡树): [NOI2007] 项链工厂

    [NOI2007] 项链工厂 ★★★   输入文件:necklace.in   输出文件:necklace.out   简单对比 时间限制:4 s   内存限制:512 MB [问题描述] T公司是一 ...

  3. BZOJ1493 [NOI2007]项链工厂

    未完待续... 终于改对了 热泪盈眶.jpg 错误原因:pushdown的时候没有判断是否有左右儿子,也没当x=0 return,于是出现一些奇怪的错误 #include<bits/stdc++ ...

  4. bzoj 1493: [NOI2007]项链工厂(线段树)

    1493: [NOI2007]项链工厂 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 1256  Solved: 545[Submit][Status] ...

  5. bzoj1493[NOI2007]项链工厂 线段树

    1493: [NOI2007]项链工厂 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 1712  Solved: 723[Submit][Status] ...

  6. BZOJ_1493_[NOI2007]项链工厂_Splay

    BZOJ_1493_[NOI2007]项链工厂_Splay Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打算 ...

  7. BZOJ1493 NOI2007 项链工厂 线段树模拟

    提交地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1493 题目大意:给一个数列,进行一系列操作.包括旋转,翻转,改变等操作,以及查询颜色段数. ...

  8. 旧题新做:从idy的视角看数据结构

    “今天你不写总结……!!!” 额…… 还是讲我的吧.这些考试都是idy出的题. 20170121:DFS序. ST表.线段树练习 这是第一次考数据结构. Problem 1. setsum 1 sec ...

  9. 1493: [NOI2007]项链工厂

    线段树. 真还就是个线段树.. 除去操作1,2的话,线段树很容易就处理了,问题在于如何处理操作1和2.(这点没想到).. 我们用一个delta维护操作1,如果没有旋转就+k,不然就-k. 每次读入i和 ...

随机推荐

  1. UOJ #395 BZOJ 5417 Luogu P4770 [NOI2018]你的名字 (后缀自动机、线段树合并)

    NOI2019考前做NOI2018题.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=5417 (luogu) http ...

  2. 箭头函数详解()=>{}

    摘要:箭头函数有几个使用注意点. (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象,箭头函数继承而来的this指向永远不变. (2)不可以当作构造函数,也就是说,不可以使用n ...

  3. Spark 2.1.1 源码编译

    Spark 2.1.1 源码编译 标签(空格分隔): Spark Spark 源码编译 环境准备与起因 由于线上Spark On Yarn Spark Streaming程序在消费kafka 写入HD ...

  4. 大哥带的Orchel数据库的注入

    0X01 先进行判断 a.jsp?username=SMITH and = 发现单引号闭合  我们尝试构造闭合  存在注入 a.jsp?username=SMITH'='1 正确 a.jsp?user ...

  5. bat实践小集

    查找当前文件夹下的exe和bat文件,并存储到txt中 for /f "tokens=4 delims= " %a in ('dir ^| findstr "^.exe ...

  6. linux 系统环境变量配置

    使用Ubuntu 进行开发绕不开的就是环境变量的配置,由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,如果不了解其调用顺序,很有可能遇到配置了环境变量,而没有其作用的问题 ...

  7. 将项目发布到neuxs私服

    需要在 pom.xml中配置 <distributionManagement> <repository> <id>user-release</id> & ...

  8. 如何将post请求转换成put和delete请求

    <form:form action="${pageContext.request.contextPath}/emp" method="POST" mode ...

  9. java数字加密算法

    数字加密在项目中时常会遇到,如手机号,身份证号信息等,下面小白将自己手写的数字加密算法分享给大家,可在项目中直接运用.加密规则,入参时传递一个字段时间戳 time:* 1.以字母代替数字,0-9分别为 ...

  10. lgb参数及调参

    1 参数含义 max_depth: 设置树的最大深度,默认为-1,即不限制最大深度,它用于限制过拟合 num_leave: 单颗树的叶子数目,默认为31 eval_metric: 评价指标,可以用lg ...