数据结构(Splay平衡树): [NOI2007] 项链工厂
[NOI2007] 项链工厂
★★★ 输入文件:necklace.in 输出文件:necklace.out 简单对比
时间限制:4 s
内存限制:512 MB
【问题描述】
T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖、款式多样、价格适中,广受青年人的喜爱。最近T公司打算推出一款项链自助生产系统,使用该系统顾客可以自行设计心目中的美丽项链。
该项链自助生产系统包括硬件系统与软件系统,软件系统与用户进行交互并控制硬件系统,硬件系统接受软件系统的命令生产指定的项链。该系统的硬件系统已经完成,而软件系统尚未开发,T公司的人找到了正在参加全国信息学竞赛的你,你能帮助T公司编写一个软件模拟系统吗?
一条项链包含N个珠子,每个珠子的颜色是1, 2, …, c中的一种。项链被固定在一个平板上,平板的某个位置被标记位置1,按顺时针方向其他位置被记为2,3,…,N。

你将要编写的软件系统应支持如下命令:
| 命令 | 参数限制 | 内容 |
| R k | 0 | 意为Rotate k。将项链在平板上顺时针旋转k个位置, 即原来处于位置1的珠子将转至位置k+1,处于位置2的珠子将转至位置k+2,依次类推。 |
| F | 意为Flip。将平板沿着给定的对称轴翻转,原来处于位置1的珠子不动,位置2上的珠子与位置N上的珠子互换,位置3上的珠子与位置N-1上的珠子互换,依次类推。 | |
| S i j | 1≤i , j≤N | 意为Swap i , j。将位置i上的珠子与位置j上的珠子互换。 |
| P i j x | 1≤i , j≤N, x≤c | 意为Paint i , j , x。将位置i沿顺时针方向到位置j的一段染为颜色x。 |
| C | 意为Count。查询当前的项链由多少个“部分”组成,我们称项链中颜色相同的一段为一个“部分” | |
| CS i j | 1≤i , j≤N | 意为CountSegment i , j。查询从位置i沿顺时针方向到位置j的一段中有多少个部分组成。 |
【输入文件】
输入文件第一行包含两个整数N, c,分别表示项链包含的珠子数目以及颜色数目。第二行包含N个整数,x1, x2…, xn,表示从位置1到位置N的珠子的颜色,1 ≤xi ≤c。第三行包含一个整数Q,表示命令数目。接下来的Q行每行一条命令,如上文所述。
【输出文件】
对于每一个C和CS命令,应输出一个整数代表相应的答案。
【输入样例】
5 3
1 2 3 2 1
4
C
R 2
P 5 5 2
CS 4 1
【输出样例】
4
1
【评分方法】
本题没有部分分,你的程序的输出只有和标准答案完全一致才能获得满分, 否则不得分。
【数据规模和约定】
- 对于60%的数据,N ≤1 000,Q ≤1 000;
- 对于100%的数据,N ≤500 000,Q ≤500 000,c ≤1 000。
改了一上午终于AC!
发现自己一直看错题了,Flip指令要以1为中轴,所以1不参与Flip!!!
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
int ch[maxn][],fa[maxn],sz[maxn],flip[maxn],mark[maxn];
int key[maxn],tot[maxn],L[maxn],R[maxn],rt;
int n,Q,l,r,d,c;
char op[];
void Push_up(int x){
sz[x]=sz[ch[x][]]+sz[ch[x][]]+;
L[x]=ch[x][]?L[ch[x][]]:key[x];
R[x]=ch[x][]?R[ch[x][]]:key[x];
tot[x]=tot[ch[x][]]+tot[ch[x][]]+;
if(ch[x][]&&R[ch[x][]]==key[x])tot[x]-=;
if(ch[x][]&&key[x]==L[ch[x][]])tot[x]-=;
} void Flip(int x){
if(!x)return;
swap(ch[x][],ch[x][]);
swap(L[x],R[x]);
flip[x]^=;
} void Mark(int x,int d){
if(!x)return;
key[x]=L[x]=R[x]=d;
tot[x]=;mark[x]=d;
} void Push_down(int x){
if(mark[x]!=-){
Mark(ch[x][],mark[x]);
Mark(ch[x][],mark[x]);
mark[x]=-;
}
if(flip[x]){
Flip(ch[x][]);
Flip(ch[x][]);
flip[x]=;
}
} void Rotate(int x){
int y=fa[x],g=fa[y],c=ch[y][]==x;
ch[y][c]=ch[x][c^];fa[ch[y][c]]=y;
ch[x][c^]=y;fa[y]=x;fa[x]=g;
if(g)ch[g][ch[g][]==y]=x;
Push_up(y);
} void Splay(int x,int g=){
for(int y;(y=fa[x])!=g;Rotate(x))
if(fa[y]!=g)
Rotate((ch[fa[y]][]==y)==(ch[y][]==x)?y:x);
Push_up(x);
if(!g)rt=x;
} int Build(int x,int l,int r){
if(l>r)return ;
int mid=(l+r)>>;
ch[mid][]=Build(mid,l,mid-);
if(mid!=&&mid!=n+)
scanf("%d",&key[mid]);
ch[mid][]=Build(mid,mid+,r);
sz[mid]=;mark[mid]=-;
fa[mid]=x;Push_up(mid);
return mid;
} int Get_ID(int k){
int p=rt;
while(true){
Push_down(p);
if(sz[ch[p][]]+==k)break;
if(sz[ch[p][]]+<k)k-=sz[ch[p][]]+,p=ch[p][];
else p=ch[p][];
}
return p;
} int main(){
#ifndef ONLINE_JUDGE
freopen("necklace.in","r",stdin);
freopen("necklace.out","w",stdout);
#endif
scanf("%d%d",&n,&c);
rt=Build(,,n+);
scanf("%d",&Q);
while(Q--){
scanf("%s",op);
if(op[]=='R'){
scanf("%d",&d);d%=n;
if(d==)continue;
Splay(Get_ID(n-d+));
Splay(Get_ID(n+),rt);
int tmp=ch[ch[rt][]][];
ch[ch[rt][]][]=;
Splay(Get_ID());
Splay(Get_ID(),rt);
ch[ch[rt][]][]=tmp;
fa[tmp]=ch[rt][];
}
else if(op[]=='F'){
Splay(Get_ID());
Splay(Get_ID(n+),rt);
Flip(ch[ch[rt][]][]);
}
else if(op[]=='S'){
scanf("%d%d",&l,&r);
if(l>r)swap(l,r);
if(l==r)continue;
Splay(Get_ID(l+));
Splay(Get_ID(r+),rt);
swap(key[rt],key[ch[rt][]]);
}
else if(op[]=='P'){
scanf("%d%d%d",&l,&r,&d);
if(l<=r){
Splay(Get_ID(l));
Splay(Get_ID(r+),rt);
Mark(ch[ch[rt][]][],d);
}
else{
Splay(Get_ID(l));
Splay(Get_ID(n+),rt);
Mark(ch[ch[rt][]][],d);
Splay(Get_ID());
Splay(Get_ID(r+),rt);
Mark(ch[ch[rt][]][],d);
}
}
else if(op[]=='C'&&op[]!='S'){
Splay(Get_ID());
Splay(Get_ID(n+),rt);
if(L[ch[ch[rt][]][]]==R[ch[ch[rt][]][]]&&tot[ch[ch[rt][]][]]>)
printf("%d\n",tot[ch[ch[rt][]][]]-);
else
printf("%d\n",tot[ch[ch[rt][]][]]);
}
else if(op[]=='C'&&op[]=='S'){
scanf("%d%d",&l,&r);
if(l<=r){
Splay(Get_ID(l));
Splay(Get_ID(r+),rt);
printf("%d\n",tot[ch[ch[rt][]][]]);
}
else{
int ans=;
Splay(Get_ID(l));
Splay(Get_ID(n+),rt);
ans+=tot[ch[ch[rt][]][]];
Splay(Get_ID());
Splay(Get_ID(r+),rt);
ans+=tot[ch[ch[rt][]][]];
Splay(Get_ID());
Splay(Get_ID(n+),rt);
if(L[ch[ch[rt][]][]]==R[ch[ch[rt][]][]])
ans-=;
printf("%d\n",ans);
}
}
}
return ;
}
数据结构(Splay平衡树): [NOI2007] 项链工厂的更多相关文章
- BZOJ1493 [NOI2007]项链工厂
未完待续... 终于改对了 热泪盈眶.jpg 错误原因:pushdown的时候没有判断是否有左右儿子,也没当x=0 return,于是出现一些奇怪的错误 #include<bits/stdc++ ...
- BZOJ_1493_[NOI2007]项链工厂_Splay
BZOJ_1493_[NOI2007]项链工厂_Splay Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打算 ...
- bzoj 1493: [NOI2007]项链工厂(线段树)
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1256 Solved: 545[Submit][Status] ...
- bzoj1493[NOI2007]项链工厂 线段树
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1712 Solved: 723[Submit][Status] ...
- 数据结构(Splay平衡树):HDU 1890 Robotic Sort
Robotic Sort Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列
339. [NOI2005] 维护数列 时间限制:3 s 内存限制:256 MB [问题描述] 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际 ...
- BZOJ1493 NOI2007 项链工厂 线段树模拟
提交地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1493 题目大意:给一个数列,进行一系列操作.包括旋转,翻转,改变等操作,以及查询颜色段数. ...
- 1493: [NOI2007]项链工厂
线段树. 真还就是个线段树.. 除去操作1,2的话,线段树很容易就处理了,问题在于如何处理操作1和2.(这点没想到).. 我们用一个delta维护操作1,如果没有旋转就+k,不然就-k. 每次读入i和 ...
- NOI2007项链工厂——sbTreap代码
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> ...
随机推荐
- sql知识点的积累和使用过的例子
越来越发现自己的sql方面的知识的欠缺,所以只能放低姿态一点一点的学了 一 游标和charIndex的使用. 游标我一直没用过,以前只是在同事们写的存储过程里见过,但是一直没看明白(可是我就是比较笨吧 ...
- css兼容性问题
其实做网页最大的问题还是兼容性吧,要调试IE的各种浏览器. DIV+CSS设计IE6.IE7.FF 兼容性 DIV+CSS网页布局这是一种趋势,我也开始顺应这股趋势了,不过在使用DIV+CSS网站设 ...
- Android常用第三方框架
1.volley (截击) 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载: (2) 网络请求的排序(sch ...
- jQuery AJAX实现调用页面后台方法
1.新建demo.aspx页面.2.首先在该页面的后台文件demos.aspx.cs中添加引用. using System.Web.Services; 3.无参数的方法调用. 大家注意了,这个版本不能 ...
- xargs rm -rf 与 -exec rm
# find ./ -exec rm {} \; # find ./ | xargs rm -rf 两者都可以把find命令查找到的结果删除,其区别简单的说是前者是把find发现的结果一次性传给exe ...
- javascript基础学习(四)
javascript之流程控制语句 学习要点: 表达式语句含义 选择语句:if.if...else.switch 循环语句:while.do...while.for.for...in 跳转语句:bre ...
- xml程序 个人练习1
package cn.gdpe.xml2; import java.io.File;import java.io.FileOutputStream;import java.util.List; imp ...
- 【JQuery学习历程】2.JQuery选择器
基本选择器 选择器 描述 返回 示例 #id 根据给定的id匹配元素 单个元素 $("#myId") .class 根据给定的class类匹配元素 集合元素 $(".my ...
- JS获取IP
新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js新浪多地域测试方法:http://int.dpool.s ...
- win7访问windows server 2003服务器出现未知的用户名或者错误的密码(转载)
直接放答案,感谢网友提供答案,否则自已还一直在纳闷,为什么? win7系统的安全机制限制了登陆.只要系统时间和win2003服务器的系统时间相差很多,系统就会阻止其登陆,并显示错误信息:"未 ...