博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2777
阅读量:5330 次
发布时间:2019-06-14

本文共 1000 字,大约阅读时间需要 3 分钟。

#include<bits/stdc++.h>

using namespace std;
#define ll long long
ll sum[500000],az[500000];
ll n,p,ans;
ll ql,qr,v,hh;
void pushdown(ll o){
if(az[o]!=0){
az[o*2]=az[o*2+1]=az[o];
az[o]=0;
}
}
void wf(ll o,ll l,ll r){
if(l==r)sum[o]=az[o];
else sum[o]=sum[o*2]|sum[o*2+1];
}
void mk(ll o,ll l,ll r){
if(ql<=l&&r<=qr)az[o]=1<<(v-1);
else{
pushdown(o);
ll m=l+(r-l)/2;
if(m>=ql)mk(o*2,l,m);else wf(o*2,l,m);
if(m<qr)mk(o*2+1,m+1,r);else wf(o*2+1,m+1,r);
}
wf(o,l,r);
}
void qz(ll o,ll l,ll r){
if(az[o]>=0){
ans=ans|az[o];
}else {
if(ql<=l&&qr>=r)
ans=ans|sum[o];
else{
ll m=l+(r-l)/2;
if(ql<=m)qz(o*2,l,m);
if(qr>m)qz(o*2+1,m+1,r);
}
}
}
int main(){
freopen("p.in","r",stdin);
ll t;
cin>>n>>t>>p;
for(int i=1;i<=p;i++){
char c;
cin>>c;
if(c=='P'){
ans=0;hh=0;
cin>>ql>>qr;
qz(1,1,n);
for(int i=0;i<t;i++)
if(ans&(1<<i))hh++;
cout<<hh<<endl;
}else{
cin>>ql>>qr>>v;
mk(1,1,n);
}
}
return 0;
}

[l,r]的颜色个数用30位二进制数表示。

线段树支持区间修改。

sum[o]=sum[o*2] or sum[o*2+1]

转载于:https://www.cnblogs.com/lxzl/p/9737438.html

你可能感兴趣的文章
Kev的视频学习
查看>>
keepalived高可用
查看>>
Zabbix 监控搭建
查看>>
AIX下查看磁盘的相关命令
查看>>
navigator.userAgent.toLowerCase();判断浏览器做兼容
查看>>
POJ 1741 Tree 求树上路径小于k的点对个数)
查看>>
UVA 1648 Business Center
查看>>
CF&&CC百套计划2 CodeChef December Challenge 2017 Chef and Hamming Distance of arrays
查看>>
【模板】左偏树(可并堆)
查看>>
Python,Jupyter Notebook,IPython快速安装教程
查看>>
EL表达式和标准标签库
查看>>
大数据学习——linux常用命令(四)
查看>>
3.3.5 高效读取:不变模式下的CopyOnWriteArrayList
查看>>
JDBC JAVA数据库插入语句
查看>>
map重写比较器
查看>>
解析xml文件的几种技术与Dom4j与sax之间的对比
查看>>
BZOJ 3210: 花神的浇花集会
查看>>
R条件筛选
查看>>
日期转周几
查看>>
Cin、Cout 加快效率方法
查看>>