NOI2007项链工厂——sbTreap代码
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <cstdlib>
- using namespace std;
- struct node
- {
- int data;
- int left;
- int right;
- int key;
- int size;
- bool turn;
- int ans;
- int mark;
- node* ls,*rs;
- node(int dat=,int ke=)
- {
- data=dat;
- key=ke;
- left=data;
- right=data;
- size=;
- turn=false;
- mark=;
- ans=;
- ls=NULL;
- rs=NULL;
- }
- }no[];
- void pushdown(node* now)
- {
- if (now->mark)
- {
- if (now->ls)
- {
- now->ls->data=now->mark;
- now->ls->mark=now->mark;
- now->ls->left=now->mark;
- now->ls->right=now->mark;
- now->ls->ans=;
- }
- if (now->rs)
- {
- now->rs->data=now->mark;
- now->rs->mark=now->mark;
- now->rs->left=now->mark;
- now->rs->right=now->mark;
- now->rs->ans=;
- }
- now->mark=;
- }
- if (now->turn)
- {
- node* l=now->ls;
- node* r=now->rs;
- if (now->ls)
- now->ls->left^=now->ls->right^=now->ls->left^=now->ls->right;
- if (now->rs)
- now->rs->left^=now->rs->right^=now->rs->left^=now->rs->right;
- now->ls=r;
- now->rs=l;
- if (now->ls) now->ls->turn=!now->ls->turn;
- if (now->rs) now->rs->turn=!now->rs->turn;
- now->turn=false;
- }
- }
- void update(node* now)
- {
- now->size=;
- now->ans=;
- now->left=now->data;
- now->right=now->data;
- if (now->ls)
- {
- now->size+=now->ls->size;
- now->ans+=now->ls->ans;
- now->left=now->ls->left;
- }
- if (now->rs)
- {
- now->size+=now->rs->size;
- now->ans+=now->rs->ans;
- now->right=now->rs->right;
- }
- if (now->ls)
- if (now->ls->right==now->data) now->ans--;
- if (now->rs)
- if (now->rs->left==now->data) now->ans--;
- }
- node* merge(node* a,node* b)
- {
- if (!b) return a;
- if (!a) return b;
- pushdown(a);
- pushdown(b);
- if (a->key<=b->key)
- {
- a->rs=merge(a->rs,b);
- update(a);
- return a;
- }
- else
- {
- b->ls=merge(a,b->ls);
- update(b);
- return b;
- }
- }
- struct npair
- {
- node* l,*r;
- npair(node* a,node* b)
- {
- l=a;
- r=b;
- }
- };
- npair split(node* a,int k)
- {
- if (!a) return npair(NULL,NULL);
- if (k==) return npair(NULL,a);
- pushdown(a);
- if (a->ls)
- {
- if (a->ls->size>=k)
- {
- npair km=split(a->ls,k);
- a->ls=km.r;
- update(a);
- return npair(km.l,a);
- }
- else
- {
- npair km=split(a->rs,k-a->ls->size-);
- a->rs=km.l;
- update(a);
- return npair(a,km.r);
- }
- }
- else
- {
- npair km=split(a->rs,k-);
- a->rs=km.l;
- update(a);
- return npair(a,km.r);
- }
- }
- node* insert(node* root,node* newnode)
- {
- return merge(root,newnode);
- }
- void turn(node* now)
- {
- now->turn=!now->turn;
- now->left^=now->right^=now->left^=now->right;
- }
- node* rotate(node* root,int num)
- {
- int n=root->size;
- num=num%n;
- int k=n-num;
- npair km = split(root,k);
- return merge(km.r,km.l);
- }
- node* flip(node* root)
- {
- int n=root->size;
- int r;
- if (n%==)
- {
- r=n/+;
- }
- else
- {
- r=n/;
- }
- npair km=split(root,r);
- npair km2=split(km.l,);
- if (n%==)
- {
- turn(km2.r);
- turn(km.r);
- return merge(merge(km2.l,km.r),km2.r);
- }
- else
- {
- npair km3=split(km.r,);
- turn(km2.r);
- turn(km3.r);
- return merge(merge(km2.l,km3.r),merge(km3.l,km2.r));
- }
- }
- node* swap(node* root,int i,int j)
- {
- if (i>j) i^=j^=i^=j;
- if (i==j) return root;
- npair km=split(root,i);
- npair km2=split(km.l,i-);
- npair km3=split(km.r,j-i);
- npair km4=split(km3.l,j-i-);
- return merge(merge(merge(km2.l,km4.r),km4.l),merge(km2.r,km3.r));
- }
- node* paint(node* root,int i,int j,int x)
- {
- int n=root->size;
- if (i<=j)
- {
- npair km=split(root,i-);
- npair km2=split(km.r,j-i+);
- km2.l->mark=x;
- km2.l->data=x;
- km2.l->ans=;
- km2.l->left=x;
- km2.l->right=x;
- return merge(km.l,merge(km2.l,km2.r));
- }
- else
- {
- npair km=split(root,j);
- int nn=km.r->size;
- npair km2=split(km.r,nn-n+i-);
- km.l->mark=x;
- km.l->data=x;
- km.l->ans=;
- km.l->left=x;
- km.l->right=x;
- km2.r->mark=x;
- km2.r->data=x;
- km2.r->ans=;
- km2.r->left=x;
- km2.r->right=x;
- return merge(km.l,merge(km2.l,km2.r));
- }
- }
- node* root;
- int countS(int i,int j)
- {
- int n=root->size;
- if (i<=j)
- {
- npair km=split(root,i-);
- npair km2=split(km.r,j-i+);
- int ret=km2.l->ans;
- root=merge(km.l,merge(km2.l,km2.r));
- return ret;
- }
- else
- {
- npair km=split(root,j);
- int nn=km.r->size;
- npair km2=split(km.r,nn-n+i-);
- int ret=km.l->ans+km2.r->ans;
- if (km.l->left==km2.r->right) ret--;
- root=merge(km.l,merge(km2.l,km2.r));
- return ret;
- }
- }
- int count()
- {
- int ret=root->ans;
- if (root->left==root->right&&ret!=) ret--;
- return ret;
- }
- void print(node* now,bool b)
- {
- if (!now) return;
- b=b^now->turn;
- // if (!b)
- print(now->ls,b);
- // else
- // print(now->rs,b);
- 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);
- // if (!b)
- print(now->rs,b);
- // else
- // print(now->ls,b);
- }
- void print(node* now)
- {
- if (!now) return;
- pushdown(now);
- print(now->ls);
- printf("%d\n",now->data);
- print(now->rs);
- }
- int cnt=-;
- int main()
- {
- int n,c;
- scanf("%d%d",&n,&c);
- int j;
- for (int i=;i<=n;++i)
- {
- scanf("%d",&j);
- node* q=&no[++cnt];
- *q=node(j,rand());
- root=insert(root,q);
- }
- int m;
- scanf("%d",&m);
- char cmd[];
- int l,r,k;
- for (int i=;i<=m;++i)
- {
- scanf("%s",cmd);
- if (cmd[]=='R'){scanf("%d",&k);root=rotate(root,k);}
- if (cmd[]=='F'){root=flip(root);}
- if (cmd[]=='S'){scanf("%d%d",&l,&r);root=swap(root,l,r);}
- if (cmd[]=='P'){scanf("%d%d%d",&l,&r,&k);root=paint(root,l,r,k);}
- if (cmd[]=='C'&&cmd[]!='S'){printf("%d\n",count());}
- if (cmd[]=='C'&&cmd[]=='S'){scanf("%d%d",&l,&r);printf("%d\n",countS(l,r));}
- // printf("%d\n",i);
- // printf("--------------------\n");
- // print(root,false);
- // printf("--------------------\n");
- }
- return ;
- }
NOI2007项链工厂——sbTreap代码的更多相关文章
- bzoj 1493: [NOI2007]项链工厂(线段树)
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1256 Solved: 545[Submit][Status] ...
- BZOJ_1493_[NOI2007]项链工厂_Splay
BZOJ_1493_[NOI2007]项链工厂_Splay Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打算 ...
- BZOJ1493 [NOI2007]项链工厂
未完待续... 终于改对了 热泪盈眶.jpg 错误原因:pushdown的时候没有判断是否有左右儿子,也没当x=0 return,于是出现一些奇怪的错误 #include<bits/stdc++ ...
- 数据结构(Splay平衡树): [NOI2007] 项链工厂
[NOI2007] 项链工厂 ★★★ 输入文件:necklace.in 输出文件:necklace.out 简单对比 时间限制:4 s 内存限制:512 MB [问题描述] T公司是一 ...
- bzoj1493[NOI2007]项链工厂 线段树
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1712 Solved: 723[Submit][Status] ...
- BZOJ1493 NOI2007 项链工厂 线段树模拟
提交地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1493 题目大意:给一个数列,进行一系列操作.包括旋转,翻转,改变等操作,以及查询颜色段数. ...
- 1493: [NOI2007]项链工厂
线段树. 真还就是个线段树.. 除去操作1,2的话,线段树很容易就处理了,问题在于如何处理操作1和2.(这点没想到).. 我们用一个delta维护操作1,如果没有旋转就+k,不然就-k. 每次读入i和 ...
- NOI2007 项链工厂
题目链接:戳我 60pts 有一点容易写错的小细节: 比如说求全局的段数的时候,如果只有一种颜色,那么当左右端点相等时,就不要ans--了. 注意右端点小于左端点的情况. #include<io ...
- 【BZOJ-1493】项链工厂 Splay
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1440 Solved: 626[Submit][Status] ...
随机推荐
- .net core发布程序
这里说的是,和.net core运行库一起发布,所以,目标运行系统,可以不安装.net core也能运行 1.project.json 把dependencies里面的type删除掉,后面加入&quo ...
- Notepad++运行JAVA代码
第一种方法: 工具栏->运行 点击后选择运行 1.在运行窗口中输入: cmd /k javac "$(FULL_CURRENT_PATH)" & echo 编译成功 ...
- B.2 列表
从很多方面来说,列表是最简单也最自然的集合类型.框架中包含很多实现,具有各种功能 和性能特征.一些常用的实现在哪里都可以使用,而一些较有难度的实现则有其专门的使用场景. B.2.1 List< ...
- Linux之网络文件共享服务(FTP)
一.FTP概念 •File Transfer Protocol 早期的三个应用级协议之一 •基于C/S结构 •双通道协议:数据和命令连接 •数据传输格式:二进制(默认)和文本 •两种模式:服务器角度 ...
- 1.2 Java“白皮书”的关键术语
Java的设计者已经编写了颇有影响力的“白皮书”,来解释设计的初衷以及完成的情况,并且发布了一个简短的摘要.这个摘要用下面11个关键术语进行组织: 简单性 面向对象 分布式 健壮性 安全性 体 ...
- python在Linux中安装虚拟环境,区别python2和python3,分别安装模块
安装虚拟环境的时候遇到的问题,解决的过程很闹心,在这里简单直接的分享出来,就是为了解决问题. 安装虚拟环境(须在联网状态下) $ sudo pip install virtualenv $ sudo ...
- redis高可用,保证高并发
目录 redis如何通过读写分离来承载读请求QPS超过10万+ redis replication以及master持久化对主从架构的安全意义 redis主从复制原理.断点续传.无磁盘化复制.过期key ...
- CODEVS1533 Fibonacci数列 (矩阵乘法)
嗯,,,矩阵乘法最基础的题了. Program CODEVS1250; ..,..] of longint; var T,n,mo:longint; a,b:arr; operator *(a,b:a ...
- JDK(Java Development Kit)内置常用自带工具一览(转)
注意:可能随着JDK的版本升级,工具也会随着增多. JDK(Java Development Kit)是Java程序员最核心的开发工具,没有之一. JDK是一个功能强大的Java开发套装,它不仅仅为我 ...
- MySQL:解决MySQL无法启动的问题
MySQL无法启动的原因有多种,这里是我遇到的一种情况和解决方法. 起因: 最近项目需要使用MySQL,于是想在MAC上安装一个本地的数据库,但是其实忘了已经安装过一个版本了,结果发现新的服务器怎么也 ...