【NOIP模拟】颜料大乱斗
2016-07-18 08:58
405 查看
Description
Solution
开始看到前面的题目那么水,到这题时就开始胡思乱想了,待修改莫队?树套树?30棵线段树?然后我打了30棵线段树,常数十分的大啊!
超时30分TAT。
然后旁边的人把30个颜色的值放到同一个节点上,然后就对了,?????
常数小而已嘛!
虽然两个方法的时间复杂度理论上是一样的。
其实就是每个节点存储30个颜色是否出现过,然后两个儿子向上合并就好了。
Code
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; int i,j,k,l,n,m; int a,b,c,d,num; struct node{ int add; int son[31]; }t[100007*3],ans,p; char s[10]; void down(int x,int l,int r){ if(l==r)return; int mid=(l+r)/2; if(t[x].add){ t[x*2].add=t[x].add,t[x*2+1].add=t[x].add; int i; fo(i,1,c)t[x*2].son[i]=t[x*2+1].son[i]=t[x].son[i]; t[x].add=0; } } node merge(node x,node y){ int i; node z;memset(z.son,0,sizeof(z.son)); fo(i,1,c)z.son[i]=x.son[i]|y.son[i]; return z; } void change(int x,int l,int r,int y,int z,int o){ down(x,l,r); if(l==y&&r==z){ memset(t[x].son,0,sizeof(t[x].son)); t[x].son[o]=1; t[x].add=o; return; } int mid=(l+r)/2; if(z<=mid)change(x*2,l,mid,y,z,o); else if(y>mid)change(x*2+1,mid+1,r,y,z,o); else{ change(x*2,l,mid,y,mid,o); change(x*2+1,mid+1,r,mid+1,z,o); } int i; fo(i,1,c)t[x].son[i]=t[x*2].son[i]|t[x*2+1].son[i]; } node find(int x,int l,int r,int y,int z){ down(x,l,r); if(l==y&&r==z){ int i,o=0; return t[x]; } int mid=(l+r)/2; if(z<=mid)return find(x*2,l,mid,y,z); else if(y>mid)return find(x*2+1,mid+1,r,y,z); else{ node q;memset(q.son,0,sizeof(q.son)); q=merge(find(x*2,l,mid,y,mid),find(x*2+1,mid+1,r,mid+1,z)); return q; } } int main(){ // freopen("fan.in","r",stdin); // freopen("fan.out","w",stdout); scanf("%d%d%d",&n,&c,&m); change(1,1,n,1,n,1); while(m--){ scanf("%s%d%d",s,&a,&b); if(a>b)swap(a,b); if(s[0]=='C'){ scanf("%d",&d); change(1,1,n,a,b,d); } else{ if(a>b)swap(a,b); ans=find(1,1,n,a,b); int o=0; fo(i,1,30)if(ans.son[i])o++; printf("%d\n",o); } } }
相关文章推荐
- Gi之(二)基础命令
- MacOS和iOS开发中异步调用与多线程的区别
- MacOS和iOS开发中异步调用与多线程的区别
- MacOS和iOS开发中异步调用与多线程的区别
- linux 时间同步的2种方法
- 6-DEADLOCKS
- 生活随笔:一元的意义
- Spark学习(3)--Scala语言学习
- 计算机程序的思维逻辑 (27) - 剖析包装类 (中)
- XZ_HTML之HTML简介
- 简单的JS轮播图代码
- 新工作 新目标 新生活
- [android-x86-6.0-rc1] after start netd - ps
- 欢迎使用CSDN-markdown编辑器
- 程序员入职第一课
- 通过SSH部署Node app到Amazon EC2
- 基于改进形态学滤波的点云分类算法------续
- 用反射的方式获取父类中的所有属性和方法
- 对整个7月份信息学训练的总结
- “情浓端午”——利尔达园区端午主题活动