未完待续。。。

终于改对了 热泪盈眶.jpg

错误原因:pushdown的时候没有判断是否有左右儿子,也没当x=0 return,于是出现一些奇怪的错误

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define N 500005
  4. char s[];
  5. int n,m;
  6. int root,fa[N],sz[N],ch[N][],lc[N],rc[N],num[N],c[N],rev[N],tag[N];
  7. void pushup(int x){
  8. int l=ch[x][],r=ch[x][];
  9. sz[x]=sz[l]+sz[r]+;
  10. num[x]=num[l]+num[r]+;
  11. lc[x]=rc[x]=c[x];
  12. if(l)num[x]-=rc[l]==c[x],lc[x]=lc[l];
  13. if(r)num[x]-=lc[r]==c[x],rc[x]=rc[r];
  14. }
  15. void pushdown(int x){
  16. if(!x)return;
  17. int l=ch[x][],r=ch[x][];
  18. if(tag[x]){
  19. tag[x]=;
  20. if(l){
  21. num[l]=;tag[l]=;
  22. lc[l]=rc[l]=c[l]=c[x];
  23. }
  24. if(r){
  25. num[r]=;tag[r]=;
  26. lc[r]=rc[r]=c[r]=c[x];
  27. }
  28. }
  29. if(rev[x]){
  30. rev[x]^=;rev[l]^=;rev[r]^=;
  31. if(l){
  32. swap(lc[l],rc[l]);
  33. swap(ch[l][],ch[l][]);
  34. }
  35. if(r){
  36. swap(lc[r],rc[r]);
  37. swap(ch[r][],ch[r][]);
  38. }
  39. }
  40. }
  41. void rotate(int x){
  42. int y=fa[x],z=fa[y],k=ch[y][]==x;
  43. fa[ch[y][k]=ch[x][!k]]=y;
  44. fa[ch[x][!k]=y]=x;
  45. fa[x]=z;
  46. if(z)ch[z][ch[z][]==y]=x;else root=x;
  47. pushup(y);
  48. }
  49. void splay(int x,int f){
  50. pushdown(x);
  51. while(fa[x]!=f){
  52. int y=fa[x],z=fa[y];
  53. pushdown(z);pushdown(y);pushdown(x);
  54. if(z==f)rotate(x);
  55. else{
  56. if((ch[z][]==y)==(ch[y][]==x))rotate(y);
  57. else rotate(x);
  58. rotate(x);
  59. }
  60. }
  61. pushup(x);
  62. }
  63. int select(int k,int f){
  64. int x=root;pushdown(x);
  65. while(sz[ch[x][]]!=k-){
  66. if(sz[ch[x][]]>=k)x=ch[x][];
  67. else k-=sz[ch[x][]]+,x=ch[x][];
  68. pushdown(x);
  69. }
  70. splay(x,f);
  71. return x;
  72. }
  73. void build(int l,int r,int f){
  74. int mid=l+r>>;
  75. fa[mid]=f;if(mid<f)ch[f][]=mid;else ch[f][]=mid;
  76. if(l==r){sz[mid]=;lc[mid]=rc[mid]=c[mid];num[mid]=;return;}
  77. if(l<mid)build(l,mid-,mid);
  78. if(r>mid)build(mid+,r,mid);
  79. pushup(mid);
  80. }
  81. void change(int k){
  82. int x=select(n-k-,),y=select(n,root);
  83. int z=ch[y][];fa[z]=;ch[y][]=;
  84. pushup(y);pushup(x);
  85. x=select(,);y=select(,root);
  86. ch[y][]=z;fa[z]=y;
  87. pushup(y);pushup(x);
  88. }
  89. void Flip(){
  90. int x=select(,),y=select(n,root);
  91. int z=ch[y][];
  92. if(tag[z])return;
  93. rev[z]^=;swap(ch[z][],ch[z][]);swap(lc[z],rc[z]);
  94. pushup(y);pushup(x);
  95. }
  96. void Swap(int x,int y){
  97. x=select(x+,);
  98. int cx=c[x];
  99. y=select(y+,);
  100. int cy=c[y];
  101. c[y]=cx;pushup(y);
  102. splay(x,);
  103. c[x]=cy;pushup(x);
  104. }
  105. void Paint(int x,int y,int cc){
  106. if(x<=y){
  107. x=select(x,);
  108. y=select(y+,root);
  109. int z=ch[y][];
  110. tag[z]=;
  111. c[z]=lc[z]=rc[z]=cc;num[z]=;
  112. splay(z,);
  113. }
  114. else{
  115. change(n--x);
  116. Paint(,n--x+y,cc);
  117. change(x-);
  118. }
  119. }
  120. int CountSeg(int x,int y){
  121. if(x<=y){
  122. x=select(x,);y=select(y+,root);
  123. return num[ch[y][]];
  124. }
  125. else{
  126. change(n--x);
  127. int ans=CountSeg(,n--x+y);
  128. change(x-);
  129. return ans;
  130. }
  131. }
  132. int Count(){
  133. int ans=num[root]-;
  134. int x=select(,),y=select(n,root);
  135. int z=ch[y][];
  136. ans-=lc[z]==rc[z];
  137. return max(ans,);
  138. }
  139. int main(){
  140. scanf("%d%d",&n,&m);
  141. for(int i=;i<=n+;i++)scanf("%d",&c[i]);
  142. n+=;build(,n,);root=(+n)>>;
  143. scanf("%d",&m);
  144. int x,y,z;
  145. while(m--){
  146. scanf("%s",s);
  147. if(s[]=='R'){
  148. scanf("%d",&x);change(x);
  149. }
  150. else if(s[]=='F')Flip();
  151. else if(s[]=='S'){
  152. scanf("%d%d",&x,&y);Swap(x,y);
  153. }
  154. else if(s[]=='P'){
  155. scanf("%d%d%d",&x,&y,&z);
  156. Paint(x,y,z);
  157. }
  158. else if(s[]=='S'){
  159. scanf("%d%d",&x,&y);
  160. printf("%d\n",CountSeg(x,y));
  161. }
  162. else printf("%d\n",Count());
  163. }
  164. return ;
  165. }

1493: [NOI2007]项链工厂

Time Limit: 30 Sec  Memory Limit: 64 MB
Submit: 1320  Solved: 576
[Submit][Status][Discuss]

Description

T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖、款式多样、价格适中,广受青年人的喜爱。
最近T公司打算推出一款项链自助生产系统,使用该系统顾客可以自行设计心目中的美丽项链。该项链自助生产系
统包括硬件系统与软件系统,软件系统与用户进行交互并控制硬件系统,硬件系统接受软件系统的命令生产指定的
项链。该系统的硬件系统已经完成,而软件系统尚未开发,T公司的人找到了正在参加全国信息学竞赛的你,你能
帮助T公司编写一个软件模拟系统吗?一条项链包含 N 个珠子,每个珠子的颜色是 1,2,…,c 中的一种。项链
被固定在一个平板上,平板的某个位置被标记位置 1 ,按顺时针方向其他位置被记为 2,3,…,N。
你将要编写的软件系统应支持如下命令:

Input

输入文件第一行包含两个整数 N,c ,分别表示项链包含的珠子数目以及颜色数目。
第二行包含 N 个整数,x1,x2,…,xn ,表示从位置 1 到位置 N 的珠子的颜色,1≤xi≤c 。
第三行包含一个整数 Q ,表示命令数目。接下来的 Q 行每行一条命令,如上文所述。N≤500000 ,Q≤500000,c≤1000 
 

Output

对于每一个 C 和 CS 命令,应输出一个整数代表相应的答案。

Sample Input

5 3
1 2 3 2 1
4
C
R 2
P 5 5 2
CS 4 1

Sample Output

4
1

HINT

注意旋转命令旋转“珠子”但不改变“位置”的编号,而反转命令始终以位置 1 为对称轴。例如当 N=10 时,项
链上的位置编号如图1:

但注意此时项链上的位置编号仍然如图1所示,于是翻转的对称轴不变。因而再执行一次“F”命令时,项链的颜色
如图4所示。
2. 关于CountSegment命令CS命令表示查询一个“线段”中有多少个“部分”。尤其注意当查询的长度
等于 N 时,我们仍然将查询部分作为“线段”理解。例如在图4所示的情况中,执行“CS 1 10”命令,查询从位
置 1 开始到位置 10 结束的这个长度为 10 的线段中有多少个“部分”,于是得到返回值 3 。与之形成对照的是
,若执行“C”命令,返回值则为 2

BZOJ1493 [NOI2007]项链工厂的更多相关文章

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

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

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

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

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

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

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

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

  5. 【BZOJ-1493】项链工厂 Splay

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

  6. BZOJ_1493_[NOI2007]项链工厂_Splay

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

  7. 1493: [NOI2007]项链工厂

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

  8. NOI2007项链工厂——sbTreap代码

    #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> ...

  9. NOI2007 项链工厂

    题目链接:戳我 60pts 有一点容易写错的小细节: 比如说求全局的段数的时候,如果只有一种颜色,那么当左右端点相等时,就不要ans--了. 注意右端点小于左端点的情况. #include<io ...

随机推荐

  1. ecshop 实现购物车退出不清空

    ecshop模板在使用过程中会遇到会员退出再登陆时购物车里面的商品会被清空掉的,通过ecshop开发中心的技术,整理的文档,对程序做简单修改即可实现会员退出不清空购物车 ECShop版本:V2.7.3 ...

  2. Android接入支付宝和银联

    支付宝接入参考链接:https://software.intel.com/zh-cn/node/542608 银联接入参考链接:http://blog.csdn.net/gf771115/articl ...

  3. ThinkPhP 分页

    <?php namespace User\Service; use Think\Controller; use Think\Exception; class UserService { // 每 ...

  4. Json字符串和Json对象的简单总结

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). ...

  5. Description Resource Path Location Type Java compiler level does not match the version of the instal

    解决办法 在项目上右键Properties->Project Facets,在打开的Project Facets页面中的Java下拉列表中,选择相应版本. 有可能是java1.6 改成java6 ...

  6. Javascript 俄罗斯方块 游戏代码解释!

    俄罗斯方块代码说明 /** 名称:Javascript 俄罗斯方块! 作者:Gloot 邮箱:glootz@gmail.com QQ:345268267 网站:http://www.cnblogs.c ...

  7. 【转载】使用pandas进行数据清洗

    使用pandas进行数据清洗 本文转载自:蓝鲸的网站分析笔记 原文链接:使用python进行数据清洗 目录: 数据表中的重复值 duplicated() drop_duplicated() 数据表中的 ...

  8. 关于session和cookie

    一.cookie机制和session机制的区别 **************************************************************************** ...

  9. Mongodb profile(慢查询日志)

    在MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是MongoDB Database Profiler.所以MongoDB 不仅有,而 ...

  10. Thrift的TCompactProtocol紧凑型二进制协议分析

    Thrift的紧凑型传输协议分析: 用一张图说明一下Thrift的TCompactProtocol中各个数据类型是怎么表示的. 报文格式编码: bool类型: 一个字节. 如果bool型的字段是结构体 ...