【jzoj4603】【颜料大乱斗】【线段树】
2016-08-02 09:21
351 查看
题目大意
给出一个长度为n的区间,有一些操作,对一个区间染上某种颜色,询问一个区间有多少种颜色。
解题思路
题目所说,颜色最多有30种,注意初始颜色是1,显然可以开30棵线段树,处理每种颜色。
code
#include<set> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) using namespace std; int const maxn=100000,maxc=30; int n,m,c,ans,pon=maxc+1,tag[maxn*4+10],flag[30+10]; bool size[maxc+1][maxn*4+10]; LL read(){ LL val=0;char ch=getchar(); for(;(ch<'0')||(ch>'9');ch=getchar()); for(;(ch>='0')&&(ch<='9');val=val*10+ch-'0',ch=getchar()); return val; } char readch(){ char ch=getchar(); for(;(ch!='C')&&(ch!='P');ch=getchar()); return ch; } void pushtag(int now){ int ls=now<<1,rs=(now<<1)+1; tag[ls]=tag[rs]=tag[now]; fo(i,1,30) size[i][ls]=size[i][rs]=(i==tag[now]); tag[now]=0; } void query(int now,int l,int r,int l1,int r1){ int m=(l+r)>>1,ls=now<<1,rs=(now<<1)+1; if(tag[now]&&(l!=r))pushtag(now); if((l==l1)&&(r==r1)){ fo(i,1,30) if((!flag[i])&&size[i][now]){ ans++; flag[i]=1; } } else if(r1<=m)query(ls,l,m,l1,r1); else if(m<l1)query(rs,m+1,r,l1,r1); else{ query(ls,l,m,l1,m); query(rs,m+1,r,m+1,r1); } } void change(int now,int l,int r,int l1,int r1,int c){ int m=(l+r)>>1,ls=now<<1,rs=(now<<1)+1; if(tag[now]&&(l!=r))pushtag(now); if((l==l1)&&(r==r1)){ tag[now]=c; fo(i,1,30) size[i][now]=(c==i); return; } else if(r1<=m)change(ls,l,m,l1,r1,c); else if(m<l1)change(rs,m+1,r,l1,r1,c); else{ change(ls,l,m,l1,m,c); change(rs,m+1,r,m+1,r1,c); } fo(i,1,30)size[i][now]=size[i][ls]||size[i][rs]; } int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); //scanf("%d%d%d\n",&n,&c,&m); n=read();c=read();m=read(); change(1,1,n,1,n,1); fo(i,1,m){ char ch=readch();//scanf("%c",&ch); if(ch=='P'){ int x,y,xx,yy;xx=read();yy=read();//scanf("%d%d\n",&x,&y); ans=0;memset(flag,0,sizeof(flag));x=min(xx,yy);y=max(xx,yy); query(1,1,n,x,y); printf("%d\n",ans); }else{ int x,y,xx,yy,t;xx=read();yy=read();t=read();//scanf("%d%d%d\n",&x,&y,&t); x=min(xx,yy);y=max(xx,yy); change(1,1,n,x,y,t); } } return 0; }
相关文章推荐
- FileHelper(文件工具类)
- mysqldump导出数据
- [置顶] Android 库存加减
- HDU 5775 Bubble Sort
- 关于Spring采用@value环境变量取值null或者‘’问题
- 大型网站架构设计及技术总结
- PID控制算法的C语言实现一 PID算法原理
- 【POJ】1985 - Cow Marathon(树的直径)
- iOS 内存管理
- 【转】C#环形队列
- 欧拉函数总结
- Js高级笔记
- Java编程实战宝典学习笔记——第一章Java的开发运行环境
- java动态代理
- 获取APP的版本信息或者UUID
- Spring Boot实战之导出excel,并上传存入Azure Storage
- 关于Android studio中代码覆盖率
- CodeForces 534B Covered Path (水题)
- zabbix 日志
- Android实现IOS相机滑动控件