BZOJ1493 [NOI2007]项链工厂
未完待续。。。
终于改对了 热泪盈眶.jpg
错误原因:pushdown的时候没有判断是否有左右儿子,也没当x=0 return,于是出现一些奇怪的错误
#include<bits/stdc++.h>
using namespace std;
#define N 500005
char s[];
int n,m;
int root,fa[N],sz[N],ch[N][],lc[N],rc[N],num[N],c[N],rev[N],tag[N];
void pushup(int x){
int l=ch[x][],r=ch[x][];
sz[x]=sz[l]+sz[r]+;
num[x]=num[l]+num[r]+;
lc[x]=rc[x]=c[x];
if(l)num[x]-=rc[l]==c[x],lc[x]=lc[l];
if(r)num[x]-=lc[r]==c[x],rc[x]=rc[r];
}
void pushdown(int x){
if(!x)return;
int l=ch[x][],r=ch[x][];
if(tag[x]){
tag[x]=;
if(l){
num[l]=;tag[l]=;
lc[l]=rc[l]=c[l]=c[x];
}
if(r){
num[r]=;tag[r]=;
lc[r]=rc[r]=c[r]=c[x];
}
}
if(rev[x]){
rev[x]^=;rev[l]^=;rev[r]^=;
if(l){
swap(lc[l],rc[l]);
swap(ch[l][],ch[l][]);
}
if(r){
swap(lc[r],rc[r]);
swap(ch[r][],ch[r][]);
}
}
}
void rotate(int x){
int y=fa[x],z=fa[y],k=ch[y][]==x;
fa[ch[y][k]=ch[x][!k]]=y;
fa[ch[x][!k]=y]=x;
fa[x]=z;
if(z)ch[z][ch[z][]==y]=x;else root=x;
pushup(y);
}
void splay(int x,int f){
pushdown(x);
while(fa[x]!=f){
int y=fa[x],z=fa[y];
pushdown(z);pushdown(y);pushdown(x);
if(z==f)rotate(x);
else{
if((ch[z][]==y)==(ch[y][]==x))rotate(y);
else rotate(x);
rotate(x);
}
}
pushup(x);
}
int select(int k,int f){
int x=root;pushdown(x);
while(sz[ch[x][]]!=k-){
if(sz[ch[x][]]>=k)x=ch[x][];
else k-=sz[ch[x][]]+,x=ch[x][];
pushdown(x);
}
splay(x,f);
return x;
}
void build(int l,int r,int f){
int mid=l+r>>;
fa[mid]=f;if(mid<f)ch[f][]=mid;else ch[f][]=mid;
if(l==r){sz[mid]=;lc[mid]=rc[mid]=c[mid];num[mid]=;return;}
if(l<mid)build(l,mid-,mid);
if(r>mid)build(mid+,r,mid);
pushup(mid);
}
void change(int k){
int x=select(n-k-,),y=select(n,root);
int z=ch[y][];fa[z]=;ch[y][]=;
pushup(y);pushup(x);
x=select(,);y=select(,root);
ch[y][]=z;fa[z]=y;
pushup(y);pushup(x);
}
void Flip(){
int x=select(,),y=select(n,root);
int z=ch[y][];
if(tag[z])return;
rev[z]^=;swap(ch[z][],ch[z][]);swap(lc[z],rc[z]);
pushup(y);pushup(x);
}
void Swap(int x,int y){
x=select(x+,);
int cx=c[x];
y=select(y+,);
int cy=c[y];
c[y]=cx;pushup(y);
splay(x,);
c[x]=cy;pushup(x);
}
void Paint(int x,int y,int cc){
if(x<=y){
x=select(x,);
y=select(y+,root);
int z=ch[y][];
tag[z]=;
c[z]=lc[z]=rc[z]=cc;num[z]=;
splay(z,);
}
else{
change(n--x);
Paint(,n--x+y,cc);
change(x-);
}
}
int CountSeg(int x,int y){
if(x<=y){
x=select(x,);y=select(y+,root);
return num[ch[y][]];
}
else{
change(n--x);
int ans=CountSeg(,n--x+y);
change(x-);
return ans;
}
}
int Count(){
int ans=num[root]-;
int x=select(,),y=select(n,root);
int z=ch[y][];
ans-=lc[z]==rc[z];
return max(ans,);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n+;i++)scanf("%d",&c[i]);
n+=;build(,n,);root=(+n)>>;
scanf("%d",&m);
int x,y,z;
while(m--){
scanf("%s",s);
if(s[]=='R'){
scanf("%d",&x);change(x);
}
else if(s[]=='F')Flip();
else if(s[]=='S'){
scanf("%d%d",&x,&y);Swap(x,y);
}
else if(s[]=='P'){
scanf("%d%d%d",&x,&y,&z);
Paint(x,y,z);
}
else if(s[]=='S'){
scanf("%d%d",&x,&y);
printf("%d\n",CountSeg(x,y));
}
else printf("%d\n",Count());
}
return ;
}
1493: [NOI2007]项链工厂
Time Limit: 30 Sec Memory Limit: 64 MB
Submit: 1320 Solved: 576
[Submit][Status][Discuss]
Description
.png)

Input
Output
对于每一个 C 和 CS 命令,应输出一个整数代表相应的答案。
Sample Input
1 2 3 2 1
4
C
R 2
P 5 5 2
CS 4 1
Sample Output
1
HINT

BZOJ1493 [NOI2007]项链工厂的更多相关文章
- 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 题目大意:给一个数列,进行一系列操作.包括旋转,翻转,改变等操作,以及查询颜色段数. ...
- bzoj 1493: [NOI2007]项链工厂(线段树)
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1256 Solved: 545[Submit][Status] ...
- 数据结构(Splay平衡树): [NOI2007] 项链工厂
[NOI2007] 项链工厂 ★★★ 输入文件:necklace.in 输出文件:necklace.out 简单对比 时间限制:4 s 内存限制:512 MB [问题描述] T公司是一 ...
- 【BZOJ-1493】项链工厂 Splay
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1440 Solved: 626[Submit][Status] ...
- BZOJ_1493_[NOI2007]项链工厂_Splay
BZOJ_1493_[NOI2007]项链工厂_Splay Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打算 ...
- 1493: [NOI2007]项链工厂
线段树. 真还就是个线段树.. 除去操作1,2的话,线段树很容易就处理了,问题在于如何处理操作1和2.(这点没想到).. 我们用一个delta维护操作1,如果没有旋转就+k,不然就-k. 每次读入i和 ...
- NOI2007项链工厂——sbTreap代码
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> ...
- NOI2007 项链工厂
题目链接:戳我 60pts 有一点容易写错的小细节: 比如说求全局的段数的时候,如果只有一种颜色,那么当左右端点相等时,就不要ans--了. 注意右端点小于左端点的情况. #include<io ...
随机推荐
- json 对象 字符串 转换
json字符串转json对象:jQuery.parseJSON(jsonStr); json对象转json字符串:JSON.stringify(jsonObj);
- JavaScript -- 小试牛刀
//var a = parseInt(window.prompt("请输入一个数字!","")); //switch(a) { // case 1 : // c ...
- GitHub使用教程
一直以来都想使用Git来管理自己平时积累的小代码,就是除了工作之外的代码了.有时候自己搞个小代码,在公司写了,就要通过U盘或者网盘等等一系列工具进行Copy,然后回家才能继续在原来的基础上作业.Cop ...
- 主流浏览器css兼容问题的总结
最近又搞了一波网站的兼容,由于要求ie浏览器还是要兼容到ie8,所以调起来还是各种蛋疼. 现在就post一些做兼容的总结,可能不够全面,但是可以告诉大家如何避过一些坑.主要测试了chrome,fire ...
- table 相关
border-collapse: collapse; 合并多余边框
- sql 创建表、删除表 增加字段 删除字段操作
下面是Sql Server 和 Access 操作数据库结构的常用Sql,希望对你有所帮助. 新建表:create table [表名]([自动编号字段] int IDENTITY (1,1) PRI ...
- tornado 路由系统----扩展(include)
在Tornado中实现Django分层路由 看了几个 Tornado 的 demo 发现都是一个py搞定所有,这样做做为例子来讲确实很直观,但如果在大型项目中这样做肯定不现实,所以博主考虑如何制定合理 ...
- dynamic和var的区别
1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型. 2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段,参数. 3.表达式不能转型为 ...
- Java基础之反射和动态代理
1,反射是依赖于Class对象,然后根据Class对象,去操作该类的资源的.Class对象是发射的基石! 问题1:人这类事物用什么表示?汽车这类事物用什么表示>计算机文件用什么表示?有如此多的事 ...
- Linux C编程学习之C语言简介---预处理、宏、文件包含……
C的简介 C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的 C语言的表达能力十分强大.C语言兼顾了高级语言和汇编语 ...