【BZOJ1493】项链工厂(线段树)

题面

BZOJ

洛谷

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

题解

先不考虑翻转之类的操作

剩下的操作很显然就是一个线段树,

具体的就是和SDOI染色那道题目是一样的

考虑翻转和旋转操作

一个是顺时针旋转,如果不存在翻转操作

我们显然可以通过记录顺时针旋转的次数来还原当前的一号位置

多了一个翻转

仔细观察,就是把顺时针变为了逆时针而已

所以直接乘个负号,额外加一个标记就行了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define lson (now<<1)
#define rson (now<<1|1)
#define MAX 555555
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Node
{
int lc,rc;
int s,tag;
}t[MAX<<2];
void pushup(int now)
{
t[now].lc=t[lson].lc;t[now].rc=t[rson].rc;
t[now].s=t[lson].s+t[rson].s-(t[lson].rc==t[rson].lc);
}
void Build(int now,int l,int r)
{
if(l==r){t[now].s=1;t[now].lc=t[now].rc=read();return;}
int mid=(l+r)>>1;
Build(lson,l,mid);Build(rson,mid+1,r);
pushup(now);
}
void pushdown(int now)
{
if(!t[now].tag)return;
int c=t[now].tag;
t[lson].lc=t[lson].rc=t[rson].lc=t[rson].rc=c;
t[lson].tag=t[rson].tag=c;
t[lson].s=t[rson].s=1;
t[now].tag=0;
}
void Modify(int now,int l,int r,int L,int R,int c)
{
if(L<=l&&r<=R){t[now].lc=t[now].rc=t[now].tag=c;t[now].s=1;return;}
pushdown(now);int mid=(l+r)>>1;
if(L<=mid)Modify(lson,l,mid,L,R,c);
if(R>mid)Modify(rson,mid+1,r,L,R,c);
pushup(now);
}
int Getcolor(int now,int l,int r,int p)
{
if(l==r)return t[now].lc;
pushdown(now);int mid=(l+r)>>1;
if(p<=mid)return Getcolor(lson,l,mid,p);
else return Getcolor(rson,mid+1,r,p);
}
int Query(int now,int l,int r,int L,int R)
{
if(l==L&&r==R)return t[now].s;
pushdown(now);int mid=(l+r)>>1;
if(R<=mid)return Query(lson,l,mid,L,R);
if(L>mid)return Query(rson,mid+1,r,L,R);
return Query(lson,l,mid,L,mid)+Query(rson,mid+1,r,mid+1,R)-(t[lson].rc==t[rson].lc);
}
int Rev,K,n;
int Pos(int x)
{
if(Rev)x=n-x+2;
x-=K;
while(x<1)x+=n;while(x>n)x-=n;
return x;
}
int main()
{
freopen("yyb.in","r",stdin);
n=read();int C=read();Build(1,1,n);
int Q=read();char opt[5];
while(Q--)
{
scanf("%s",opt);
if(opt[0]=='R')
{
if(Rev)K-=read();
else K+=read();
while(K<1)K+=n;while(K>n)K-=n;
}
else if(opt[0]=='F')Rev^=1;
else if(opt[0]=='S')
{
int x=read(),y=read();x=Pos(x);y=Pos(y);
int c1=Getcolor(1,1,n,x),c2=Getcolor(1,1,n,y);
Modify(1,1,n,x,x,c2);Modify(1,1,n,y,y,c1);
}
else if(opt[0]=='P')
{
int x=read(),y=read(),c=read();
x=Pos(x);y=Pos(y);if(Rev)swap(x,y);
if(x<=y)Modify(1,1,n,x,y,c);
else Modify(1,1,n,x,n,c),Modify(1,1,n,1,y,c);
}
else if(opt[0]=='C'&&opt[1]=='S')
{
int x=read(),y=read();
x=Pos(x);y=Pos(y);if(Rev)swap(x,y);
if(x<=y)printf("%d\n",Query(1,1,n,x,y));
else printf("%d\n",Query(1,1,n,x,n)+Query(1,1,n,1,y)-(t[1].lc==t[1].rc));
}
else printf("%d\n",max(1,Query(1,1,n,1,n)-(t[1].lc==t[1].rc)));
}
return 0;
}

【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. BZOJ1493 [NOI2007]项链工厂

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

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

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

  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. 数据结构(Splay平衡树): [NOI2007] 项链工厂

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

  8. 1878. [SDOI2009]HH的项链【线段树 或 莫队】

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...

  9. 洛谷——P1972 [SDOI2009]HH的项链(线段树)

    P1972 [SDOI2009]HH的项链 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的 ...

  10. 1493: [NOI2007]项链工厂

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

随机推荐

  1. Struts 2(五):输入校验 & 校验框架

    第一节 Struts2输入校验 1.1 输入校验的重要性 输入校验分为客户端校验和服务器端校验.客户端校验用来过滤用户的错误操作,一般使用JavaScript代码实现.服务器端校验用来防止非法用户的恶 ...

  2. window + office 激活方法(不提供下载)

    下载KMSTools工具,里面集成了许多激活方法. WINDOWS KMS激活方式 比较简单,随便点一个KMSTools带有KMS字样的工具就可以了,但是KMS激活方式有效期为180天,到期需要继续激 ...

  3. 在eclipse中通过git添加Maven 多重项目时会遇到的问题

    最近,项目换到了使用git作版本控制.于是就开始了,拉代码,测试的时候了. 再过程中遇到两个问题: 1.下载下来的不是项目,只是文档,转换为Maven项目之后 pom.xml报错(org.codeha ...

  4. 自己做的一个固定大小对象内存池,效率大概为原始的new/delete的2倍

    提升不高,不过好处是可以多次申请小对象,一次释放.(只适应于无动态申请资源的class) vs2012测试情况如下: // CHchFixLenMemPool.h #pragma once #ifnd ...

  5. ython进阶06 循环对象

    这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念. 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标 ...

  6. hdfs遍历文件方法

    import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org. ...

  7. JAVA学习笔记--策略设计模式与适配器模式

    一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分.策略就是传递进去的参数对象,它包含要执行 ...

  8. asp.net的forms身份验证 单用户身份验证

    asp.net的forms身份验证  单用户身份验证 首先要配置Web.config文件 <system.web> <authentication mode="Forms& ...

  9. [朴孝敏][Gold]

    歌词来源:http://music.163.com/#/song?id=406924220 作曲 : Ryan S. Jhun/David Quinones/Edwin Menjivar/Mateo ...

  10. 详解Python中的下划线

    本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已. 单下划线(_) 通常情况下,会在以下3种场景中使用 ...