P4130或JZOJ 1214. 【NOI2007】项链工厂

news/2024/11/2 2:30:44/

D e s c r i p t i o n Description Description

写一种数据结构,支持区间染色,区间翻转,区间旋转,区间查询颜色,单点修改颜色
对 于 100 % 的 数 据 , N ≤ 500000 , Q ≤ 500000 , c ≤ 100 对于100\%的数据,N ≤ 500 000,Q ≤ 500 000,c ≤ 1 00 100%N500000Q500000c100


S o l u t i o n Solution Solution

Splay裸题

我们可以用线段树搞

染色、查询、修改线段树 s o e a s y so\ easy so easy

重点是旋转和翻转

旋转的话我们可以对于每个对应的编号求出其转后的编号即可,没啥影响

翻转则需要每次特殊处理,注意到翻转只会相对1转,所以直接稍微处理一下环形的细节即可

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)


C o d e Code Code

#include<cstdio>
#include<cctype>
#include<algorithm>
#define N 500010
using namespace std;int n,C,m,a[N],p;
bool rev;
inline int read()
{int f=0,d=1;char c;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
inline void Seg(int &x)
{if(rev) x=n-x+2;x-=p;while(x<1) x+=n;while(x>n) x-=n;return;
}
struct xds
{#define lson k<<1#define rson k<<1|1int sum[N<<2],lc[N<<2],rc[N<<2],col[N<<2];inline void down(int k){if(!col[k]) return;lc[lson]=rc[lson]=lc[rson]=rc[rson]=col[lson]=col[rson]=col[k];sum[lson]=sum[rson]=1;col[k]=0;return;}inline void up(int k){sum[k]=sum[lson]+sum[rson];if(rc[lson]==lc[rson]) sum[k]--;lc[k]=lc[lson];rc[k]=rc[rson];return;}inline void build(int k,int l,int r){col[k]=0;if(l==r){lc[k]=rc[k]=read();sum[k]=1;return;}int mid=l+r>>1;build(lson,l,mid);build(rson,mid+1,r);up(k);return;}inline void modify(int x,int y,int v,int k=1,int l=1,int r=n){if(x<=l&&y>=r){col[k]=v;lc[k]=rc[k]=v;sum[k]=1;return;}down(k);int mid=l+r>>1;if(x<=mid) modify(x,y,v,lson,l,mid);if(y>mid) modify(x,y,v,rson,mid+1,r);up(k);return;}inline int query(int x,int y,int k=1,int l=1,int r=n){if(x<=l&&y>=r) return sum[k];down(k);int mid=l+r>>1;int ans=0;if(x<=mid) ans+=query(x,y,lson,l,mid);if(y>mid) ans+=query(x,y,rson,mid+1,r);if(x<=mid&&y>mid&&rc[lson]==lc[rson]) ans--;return ans;}inline int queryC(int x,int k=1,int l=1,int r=n){if(l==r&&r==x) return lc[k];down(k);int mid=l+r>>1;if(x<=mid) return queryC(x,lson,l,mid);else return queryC(x,rson,mid+1,r);}#undef lson#undef rson
}Tree;
signed main()
{n=read();C=read();Tree.build(1,1,n);m=read();for(char op[5];m--;){scanf("%s",op);int x,y;if(op[0]=='C')if(op[1]){x=read(),y=read();Seg(x);Seg(y);//得到新的坐标点if(rev) swap(x,y);//翻转if(x<=y){int ans=Tree.query(x,y);if(x==1&&y==n&&Tree.lc[1]==Tree.rc[1]&&ans>1) ans--;//边界连起来处理环形情况printf("%d\n",ans);}else{int ans=Tree.query(x,n)+Tree.query(1,y);if(Tree.lc[1]==Tree.rc[1]) ans--;//越过一圈处理printf("%d\n",ans);}continue;}else{int ans=Tree.query(1,n);if(Tree.lc[1]==Tree.rc[1]&&ans>1) ans--;printf("%d\n",ans);continue;}if(op[0]=='R')//区间旋转{x=read();if(rev) p-=x;else p+=x;while(p<0) p+=n;while(p>n) p-=n;continue;}if(op[0]=='F') {rev^=1;continue;}//区间翻转if(op[0]=='S')//交换两点{x=read();y=read();Seg(x);Seg(y);//得到原坐标int xc=Tree.queryC(x),yc=Tree.queryC(y);//get颜色Tree.modify(x,x,yc);Tree.modify(y,y,xc);//单点染色continue;}if(op[0]=='P')//区间染色{x=read();y=read();int v=read();Seg(x);Seg(y);if(rev) swap(x,y);if(x<=y) Tree.modify(x,y,v);else Tree.modify(x,n,v),Tree.modify(1,y,v);continue;}}
}

http://www.ppmy.cn/news/221948.html

相关文章

P4130,jzoj1214-[NOI2007]项链工厂【线段树】

正题 题目链接:https://www.luogu.org/problemnew/show/P4130 题目大意 一个环形颜色珠子链&#xff0c;位置(注意不是上面的珠子)从最上顺时针下来位置依次标号 1 ∼ n 1\sim n 1∼n。 然后要求支持以下操作 R k : R\ k: R k:将所有珠子顺时针旋转 k k k个。 F : F: F:将所…

intel 从CPU上怎么看几代

比如现在的处理器&#xff0c;i系列&#xff0c;i3&#xff0c;i5&#xff0c;或i7&#xff0c;用i3举例&#xff0c;第一代是i3 1530&#xff0c;这里把1代省了&#xff0c;所以是i3 530。二代比如i3 2100&#xff0c;三代i3 3220&#xff0c;四代i3 4130&#xff0c;就是从i3…

图解LeetCode——114. 二叉树展开为链表

一、题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 二…

PDF怎么转换成WORD?分享这几个方法给大家!

PDF怎么转换成Word&#xff1f;在我们的工作过程中&#xff0c;经常会使用到PDF文件、Word文件等等。而在很多时候&#xff0c;需要根据工作需求&#xff0c;将各种文件进行格式转换&#xff0c;例如将PDF文件转换成Word格式&#xff0c;从而满足我们对文件进行编辑、更改等需求…

3.完成ODS层数据采集操作

将原始数据导入mysql 1 选中mysql 运行脚本 2 验证结果 数据存储格式和压缩方案 存储格式 分类 1.行式存储(textFile) 缺点:可读性较好 执行 select * 效率比较高 缺点:耗费磁盘资源 执行 select 字段 效率比较低 2.列式存储(orc) 优点:节省磁盘空间. 执行 select 字段…

二次元播放器php源码,Miko动漫视频网站整站源码+二次元动漫网源码+视频弹幕网+自带播放器数据下载...

出现这个怎么办&#xff1f;&#xff1f;&#xff1f; Discuz! Database Error (1045) notconnect PHP Debug No.FileLineCode 1portal.php18discuz_application->init() 2source/class/discuz/discuz_application.php65discuz_application->_init_db() 3source/class/di…

【Qt学习】 设计视频播放器界面

目录 一&#xff1a;源码分享 二&#xff1a;QMessageBox弹窗类 三&#xff1a;视频播放器界面设计效果展示 一&#xff1a;源码分享 indexwin.h .cpp 【视频播放器界面】 #ifndef INDEXWIN_H #define INDEXWIN_H#include <QWidget> #include<QVBoxLayout>//垂直…