找不同,玄关
  • 板块P1558 色板游戏
  • 楼主lxzy
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/5/25 14:42
  • 上次更新2024/5/25 16:42:57
查看原帖
找不同,玄关
882167
lxzy楼主2024/5/25 14:42

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_ 没看出来

2024/5/25 14:42
加载中...