1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cstdlib>
  6.  
  7. using namespace std;
  8. struct node
  9. {
  10. int data;
  11. int left;
  12. int right;
  13. int key;
  14. int size;
  15. bool turn;
  16. int ans;
  17. int mark;
  18. node* ls,*rs;
  19. node(int dat=,int ke=)
  20. {
  21. data=dat;
  22. key=ke;
  23. left=data;
  24. right=data;
  25. size=;
  26. turn=false;
  27. mark=;
  28. ans=;
  29. ls=NULL;
  30. rs=NULL;
  31. }
  32. }no[];
  33.  
  34. void pushdown(node* now)
  35. {
  36. if (now->mark)
  37. {
  38. if (now->ls)
  39. {
  40. now->ls->data=now->mark;
  41. now->ls->mark=now->mark;
  42. now->ls->left=now->mark;
  43. now->ls->right=now->mark;
  44. now->ls->ans=;
  45. }
  46. if (now->rs)
  47. {
  48. now->rs->data=now->mark;
  49. now->rs->mark=now->mark;
  50. now->rs->left=now->mark;
  51. now->rs->right=now->mark;
  52. now->rs->ans=;
  53. }
  54. now->mark=;
  55. }
  56. if (now->turn)
  57. {
  58. node* l=now->ls;
  59. node* r=now->rs;
  60. if (now->ls)
  61. now->ls->left^=now->ls->right^=now->ls->left^=now->ls->right;
  62. if (now->rs)
  63. now->rs->left^=now->rs->right^=now->rs->left^=now->rs->right;
  64. now->ls=r;
  65. now->rs=l;
  66. if (now->ls) now->ls->turn=!now->ls->turn;
  67. if (now->rs) now->rs->turn=!now->rs->turn;
  68. now->turn=false;
  69. }
  70. }
  71.  
  72. void update(node* now)
  73. {
  74. now->size=;
  75. now->ans=;
  76. now->left=now->data;
  77. now->right=now->data;
  78. if (now->ls)
  79. {
  80. now->size+=now->ls->size;
  81. now->ans+=now->ls->ans;
  82. now->left=now->ls->left;
  83. }
  84. if (now->rs)
  85. {
  86. now->size+=now->rs->size;
  87. now->ans+=now->rs->ans;
  88. now->right=now->rs->right;
  89. }
  90. if (now->ls)
  91. if (now->ls->right==now->data) now->ans--;
  92. if (now->rs)
  93. if (now->rs->left==now->data) now->ans--;
  94. }
  95.  
  96. node* merge(node* a,node* b)
  97. {
  98. if (!b) return a;
  99. if (!a) return b;
  100. pushdown(a);
  101. pushdown(b);
  102. if (a->key<=b->key)
  103. {
  104. a->rs=merge(a->rs,b);
  105. update(a);
  106. return a;
  107. }
  108. else
  109. {
  110. b->ls=merge(a,b->ls);
  111. update(b);
  112. return b;
  113. }
  114. }
  115.  
  116. struct npair
  117. {
  118. node* l,*r;
  119. npair(node* a,node* b)
  120. {
  121. l=a;
  122. r=b;
  123. }
  124. };
  125.  
  126. npair split(node* a,int k)
  127. {
  128. if (!a) return npair(NULL,NULL);
  129. if (k==) return npair(NULL,a);
  130. pushdown(a);
  131. if (a->ls)
  132. {
  133. if (a->ls->size>=k)
  134. {
  135. npair km=split(a->ls,k);
  136. a->ls=km.r;
  137. update(a);
  138. return npair(km.l,a);
  139. }
  140. else
  141. {
  142. npair km=split(a->rs,k-a->ls->size-);
  143. a->rs=km.l;
  144. update(a);
  145. return npair(a,km.r);
  146. }
  147. }
  148. else
  149. {
  150. npair km=split(a->rs,k-);
  151. a->rs=km.l;
  152. update(a);
  153. return npair(a,km.r);
  154. }
  155. }
  156. node* insert(node* root,node* newnode)
  157. {
  158. return merge(root,newnode);
  159. }
  160.  
  161. void turn(node* now)
  162. {
  163. now->turn=!now->turn;
  164. now->left^=now->right^=now->left^=now->right;
  165. }
  166.  
  167. node* rotate(node* root,int num)
  168. {
  169. int n=root->size;
  170. num=num%n;
  171. int k=n-num;
  172. npair km = split(root,k);
  173. return merge(km.r,km.l);
  174. }
  175.  
  176. node* flip(node* root)
  177. {
  178. int n=root->size;
  179. int r;
  180. if (n%==)
  181. {
  182. r=n/+;
  183. }
  184. else
  185. {
  186. r=n/;
  187. }
  188. npair km=split(root,r);
  189. npair km2=split(km.l,);
  190. if (n%==)
  191. {
  192. turn(km2.r);
  193. turn(km.r);
  194. return merge(merge(km2.l,km.r),km2.r);
  195. }
  196. else
  197. {
  198. npair km3=split(km.r,);
  199. turn(km2.r);
  200. turn(km3.r);
  201. return merge(merge(km2.l,km3.r),merge(km3.l,km2.r));
  202. }
  203. }
  204.  
  205. node* swap(node* root,int i,int j)
  206. {
  207. if (i>j) i^=j^=i^=j;
  208. if (i==j) return root;
  209. npair km=split(root,i);
  210. npair km2=split(km.l,i-);
  211. npair km3=split(km.r,j-i);
  212. npair km4=split(km3.l,j-i-);
  213. return merge(merge(merge(km2.l,km4.r),km4.l),merge(km2.r,km3.r));
  214. }
  215.  
  216. node* paint(node* root,int i,int j,int x)
  217. {
  218. int n=root->size;
  219. if (i<=j)
  220. {
  221. npair km=split(root,i-);
  222. npair km2=split(km.r,j-i+);
  223. km2.l->mark=x;
  224. km2.l->data=x;
  225. km2.l->ans=;
  226. km2.l->left=x;
  227. km2.l->right=x;
  228. return merge(km.l,merge(km2.l,km2.r));
  229. }
  230. else
  231. {
  232. npair km=split(root,j);
  233. int nn=km.r->size;
  234. npair km2=split(km.r,nn-n+i-);
  235. km.l->mark=x;
  236. km.l->data=x;
  237. km.l->ans=;
  238. km.l->left=x;
  239. km.l->right=x;
  240. km2.r->mark=x;
  241. km2.r->data=x;
  242. km2.r->ans=;
  243. km2.r->left=x;
  244. km2.r->right=x;
  245. return merge(km.l,merge(km2.l,km2.r));
  246. }
  247. }
  248.  
  249. node* root;
  250. int countS(int i,int j)
  251. {
  252. int n=root->size;
  253. if (i<=j)
  254. {
  255. npair km=split(root,i-);
  256. npair km2=split(km.r,j-i+);
  257. int ret=km2.l->ans;
  258. root=merge(km.l,merge(km2.l,km2.r));
  259. return ret;
  260. }
  261. else
  262. {
  263. npair km=split(root,j);
  264. int nn=km.r->size;
  265. npair km2=split(km.r,nn-n+i-);
  266. int ret=km.l->ans+km2.r->ans;
  267. if (km.l->left==km2.r->right) ret--;
  268. root=merge(km.l,merge(km2.l,km2.r));
  269. return ret;
  270. }
  271. }
  272.  
  273. int count()
  274. {
  275. int ret=root->ans;
  276. if (root->left==root->right&&ret!=) ret--;
  277. return ret;
  278. }
  279.  
  280. void print(node* now,bool b)
  281. {
  282. if (!now) return;
  283. b=b^now->turn;
  284. // if (!b)
  285. print(now->ls,b);
  286. // else
  287. // print(now->rs,b);
  288. printf("data: %d size: %d mark: %d turn: %d ans: %d left: %d right: %d\n",now->data,now->size,now->mark,now->turn,now->ans,now->left,now->right);
  289. // if (!b)
  290. print(now->rs,b);
  291. // else
  292. // print(now->ls,b);
  293. }
  294.  
  295. void print(node* now)
  296. {
  297. if (!now) return;
  298. pushdown(now);
  299. print(now->ls);
  300. printf("%d\n",now->data);
  301. print(now->rs);
  302. }
  303.  
  304. int cnt=-;
  305. int main()
  306. {
  307. int n,c;
  308. scanf("%d%d",&n,&c);
  309. int j;
  310. for (int i=;i<=n;++i)
  311. {
  312. scanf("%d",&j);
  313. node* q=&no[++cnt];
  314. *q=node(j,rand());
  315. root=insert(root,q);
  316. }
  317. int m;
  318. scanf("%d",&m);
  319. char cmd[];
  320. int l,r,k;
  321. for (int i=;i<=m;++i)
  322. {
  323. scanf("%s",cmd);
  324. if (cmd[]=='R'){scanf("%d",&k);root=rotate(root,k);}
  325. if (cmd[]=='F'){root=flip(root);}
  326. if (cmd[]=='S'){scanf("%d%d",&l,&r);root=swap(root,l,r);}
  327. if (cmd[]=='P'){scanf("%d%d%d",&l,&r,&k);root=paint(root,l,r,k);}
  328. if (cmd[]=='C'&&cmd[]!='S'){printf("%d\n",count());}
  329. if (cmd[]=='C'&&cmd[]=='S'){scanf("%d%d",&l,&r);printf("%d\n",countS(l,r));}
  330. // printf("%d\n",i);
  331. // printf("--------------------\n");
  332. // print(root,false);
  333. // printf("--------------------\n");
  334. }
  335. return ;
  336. }

NOI2007项链工厂——sbTreap代码的更多相关文章

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

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

  2. BZOJ_1493_[NOI2007]项链工厂_Splay

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

  3. BZOJ1493 [NOI2007]项链工厂

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

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

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

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

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

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

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

  7. 1493: [NOI2007]项链工厂

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

  8. NOI2007 项链工厂

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

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

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

随机推荐

  1. .net core发布程序

    这里说的是,和.net core运行库一起发布,所以,目标运行系统,可以不安装.net core也能运行 1.project.json 把dependencies里面的type删除掉,后面加入&quo ...

  2. Notepad++运行JAVA代码

    第一种方法: 工具栏->运行  点击后选择运行 1.在运行窗口中输入: cmd /k javac "$(FULL_CURRENT_PATH)" & echo 编译成功 ...

  3. B.2 列表

    从很多方面来说,列表是最简单也最自然的集合类型.框架中包含很多实现,具有各种功能 和性能特征.一些常用的实现在哪里都可以使用,而一些较有难度的实现则有其专门的使用场景. B.2.1  List< ...

  4. Linux之网络文件共享服务(FTP)

    一.FTP概念 •File Transfer Protocol 早期的三个应用级协议之一 •基于C/S结构 •双通道协议:数据和命令连接 •数据传输格式:二进制(默认)和文本  •两种模式:服务器角度 ...

  5. 1.2 Java“白皮书”的关键术语

        Java的设计者已经编写了颇有影响力的“白皮书”,来解释设计的初衷以及完成的情况,并且发布了一个简短的摘要.这个摘要用下面11个关键术语进行组织: 简单性 面向对象 分布式 健壮性 安全性 体 ...

  6. python在Linux中安装虚拟环境,区别python2和python3,分别安装模块

    安装虚拟环境的时候遇到的问题,解决的过程很闹心,在这里简单直接的分享出来,就是为了解决问题.  安装虚拟环境(须在联网状态下) $ sudo pip install virtualenv $ sudo ...

  7. redis高可用,保证高并发

    目录 redis如何通过读写分离来承载读请求QPS超过10万+ redis replication以及master持久化对主从架构的安全意义 redis主从复制原理.断点续传.无磁盘化复制.过期key ...

  8. CODEVS1533 Fibonacci数列 (矩阵乘法)

    嗯,,,矩阵乘法最基础的题了. Program CODEVS1250; ..,..] of longint; var T,n,mo:longint; a,b:arr; operator *(a,b:a ...

  9. JDK(Java Development Kit)内置常用自带工具一览(转)

    注意:可能随着JDK的版本升级,工具也会随着增多. JDK(Java Development Kit)是Java程序员最核心的开发工具,没有之一. JDK是一个功能强大的Java开发套装,它不仅仅为我 ...

  10. MySQL:解决MySQL无法启动的问题

    MySQL无法启动的原因有多种,这里是我遇到的一种情况和解决方法. 起因: 最近项目需要使用MySQL,于是想在MAC上安装一个本地的数据库,但是其实忘了已经安装过一个版本了,结果发现新的服务器怎么也 ...