rt。这是我的代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5;
int a[N],op,l,r,q,m,t,n;
//inline int read(){
// int x=0,f=1;char ch=getchar();
// while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
// while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
// return x*f;
//}
struct node{
int l;
int r;
int val;
int lazy;
}tree[N*4];
int L(int p){
long long s=1;
for(int i=1;i<=p;i++){
s*=2;
}
return s;
}
void f(long long ans){
int res=0;
for(;ans!=0;){
if(ans%2==1) res++;
ans=ans/2;
}
printf("%d\n",res);
return;
}
void pushup(int rt){
tree[rt].val=tree[rt*2].val+tree[rt*2+1].val;
}
void pushdown(int rt){
int cur=tree[rt].lazy;
tree[rt*2].lazy=cur;
tree[rt*2+1].lazy=cur;
int mid=(l+r)/2;
tree[rt*2].val=cur;
tree[rt*2+1].val=cur;
tree[rt].lazy=0;
}
void update(int rt,int ql,int qr,int q){
int l=tree[rt].l;int r=tree[rt].r;
if(ql<=l && r<=qr){
tree[rt].lazy=L(q-1);
tree[rt].val=L(q-1);
return;
}
pushdown(rt);
int mid=(l+r)/2;
if(ql<=mid) update(rt*2,ql,qr,q);
if(qr>=mid+1) update(rt*2+1,ql,qr,q);
pushup(rt);
}
int query(int rt,int ql, int qr){
int l=tree[rt].l;int r=tree[rt].r;
if(ql<=l && r<=qr)return tree[rt].val;
pushdown(rt);
int res=0;
int mid=(l+r)/2;
if(ql<=mid) res+=query(rt*2,ql,qr);
if(qr>=mid+1) res+=query(rt*2+1,ql,qr);
return res;
}
void build(int rt,int l,int r){
tree[rt].l=l;tree[rt].r=r;
if(l==r){
tree[rt].val=a[l];
return;
}
int mid=(l+r)/2;
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
pushup(rt);
}
signed main(){
cin>>m>>t>>n;
build(1,1,m);
for(int i=1;i<=n;i++){
cin>>op;
if(op==1){
cin>>l>>r>>q;
if(l>r){
int k=l;
l=r;
r=k;
}
update(1,l,r,q);
}
else{
cin>>l>>r;
if(l>r){
int k=l;
l=r;
r=k;
}
int ans=query(1,l,r);
f(ans);
}
}
return 0;
}
这是题解的代码
#include<stdio.h>
#include<string.h>
int l,t,o;
int a[1000005]={0},lazy[1000005]={0};
long long lala(int x){
long long temp=1;
for(int lmq=0;lmq<x;lmq++){
temp*=2;
}
return temp;
}
void pushdown(int num){
if(lazy[num]){
lazy[num*2]=lazy[num];
lazy[num*2+1]=lazy[num];
a[num*2]=lazy[num];
a[num*2+1]=lazy[num];
lazy[num]=0;
}
}
void pushup(int num){
a[num]=a[num*2]|a[num*2+1];
}
void build(int left,int right,int num){
if(left==right){
a[num]=1;
return;
}
int mid=(left+right)/2;
build(left,mid,num*2);
build(mid+1,right,num*2+1);
pushup(num);
}
void color(int l,int r,int c,int left,int right,int num){
if(l<=left&&r>=right){//找到符合区间直接覆盖
pushdown(num);
long long tmp=lala(c-1);
a[num]=tmp;
lazy[num]=tmp;
return ;
}
pushdown(num);
int mid=(left+right)/2;
if(l<=mid){
color(l,r,c,left,mid,num*2);
}
if(mid<r){
color(l,r,c,mid+1,right,num*2+1);
}
pushup(num);
}
long long ask(int l,int r,int left,int right,int num){
if(l<=left&&right<=r){
return a[num];
}
pushdown(num);
int mid=(left+right)/2;
long long temp=0;
if(l<=mid){
temp=temp|ask(l,r,left,mid,num*2);//两个状态用或运算合在一起
}
if(mid<r){
temp=temp|ask(l,r,mid+1,right,num*2+1);
}
return temp;
}
void f(long long x){
int res=0;
for(;x!=0;){
if(x%2==1) res++;
x=x/2;
}
printf("%d\n",res);
return;
}
int main(){//主函数
scanf("%d%d%d",&l,&t,&o);
build(1,l,1);//输入完建树
for(int i=0;i<o;i++){
char q[3];
scanf("%s",q);
if(q[0]=='C'){
int c1,c2,c3;
scanf("%d%d%d",&c1,&c2,&c3);
if(c1>c2){
int chicken=c1;
c1=c2;
c2=chicken;
}
color(c1,c2,c3,1,l,1);//color覆盖染色
}
else{
int c1,c2;
scanf("%d%d",&c1,&c2);
if(c1>c2){
int chicken=c1;
c1=c2;
c2=chicken;
}
long long ans=ask(c1,c2,1,l,1);//询问区间染色状态
f(ans);//将二进制数转化为颜色种类数并输出
}
}
return 0;
}
有区别吗?
AstaSunch_ 没看出来