poj 2777

news/2025/2/14 4:12:04/

题意:1给区间染色

        2问区间有多少颜色

#include<iostream>
using namespace std;
struct Node
{int x;//区间覆盖颜色int end;int L,R;Node *Right,*Left;
};
Node Tree[1200100];
int nCount;
void Build(Node *root,int l,int r)
{root->x=1;//初始颜色root->L=l;root->R=r;root->end=1;if(l==r)return ;nCount++;root->Left=Tree+nCount;Build(root->Left,l,(l+r)/2);nCount++;root->Right=Tree+nCount;Build(root->Right,(l+r)/2+1,r);
}
void Updata(Node *root,int l,int r,int nColor)
{if(root->L==l&&root->R==r) //若到空间直接
    {root->x=nColor;root->end=1;return ;}if(root->end)               //此区间的颜色要更新  区间覆盖要pushdown,因为不push就是错的,这个区间的子区间已经不是这个状态,与区间增加减少多少个值不同;而区间增加减少c则不需要pushdown 区间lr所经过的节点肯定是父节点 可以从上向下更新;这里与与区间增加恰恰相反。
    {root->Right->end=1;root->Right->x=root->x;root->Left->x=root->x;root->Left->end=1;root->end=0;}if(l>(root->R+root->L)/2) Updata(root->Right,l,r,nColor);else if(r<=(root->R+root->L)/2)Updata(root->Left,l,r,nColor);else{Updata(root->Left,l,(root->R+root->L)/2,nColor);Updata(root->Right,(root->R+root->L)/2+1,r,nColor);}root->x=root->Right->x|root->Left->x;//执行完左右孩子节点后的总结
}
int Query(Node *root,int l,int r)
{if(root->end)//这里不需要pushdown 与区间增加某只恰恰相反;因为父节点的覆盖代表了各个子节点的状态return root->x;if(root->R==r&&root->L==l)return root->x;if(l>(root->L+root->R)/2)return Query(root->Right,l,r);else if(r<=(root->L+root->R)/2) return Query(root->Left,l,r);elsereturn Query(root->Left,l,(root->L+root->R)/2)|Query(root->Right,(root->L+root->R)/2+1,r);}
int Countbit(int sum)
{int x=1;int ans=0;int i;for(i=0;i<32;i++,x<<=1)if(x&sum)ans++;return ans;
}int main()
{int n,t,i,q,l,r,nColor;char c;scanf("%d%d%d",&n,&t,&q);nCount=0;Build(Tree,0,n-1);while(q--){cin>>c;if(c=='C'){scanf("%d%d%d",&l,&r,&nColor);if(l>r){int t=l;l=r;r=t;}Updata(Tree,l-1,r-1,1<<(nColor-1));}else {scanf("%d%d",&l,&r);if(l>r){int t=l;l=r;r=t;}        printf("%d\n",Countbit(Query(Tree,l-1,r-1)));}}    return 0;
}

 

转载于:https://www.cnblogs.com/zhangdashuai/p/4351523.html


http://www.ppmy.cn/news/491707.html

相关文章

poj2777

poj2777区间修改&#xff0c;区间查询mark-1表示这个区间有多种颜色&#xff0c;否则就1种 #include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<set> #include<…

文件特殊权限(SUID,SGID,Sticky)

三种特殊权限&#xff1a;SUID&#xff0c;SGID&#xff0c;Sticky SUID 安全上下文&#xff0c;何为安全上下文 安全上下是一个访问控制属性&#xff0c;是selinux中的重要组成部分&#xff0c;在进行移动时&#xff0c;不会改变文件的属性和权限&#xff0c;而复制的过程会…

单元6:Linux系统中的权限管理

一、权限查看及读取 1、权限查看 | 命令功能ls -l file查看文件权限ls -ld dir查看目录权限 2、权限的读取 文件的属性被叫做文件的元数据(meta data) 一种元数据用1个byte来记录内容 文件权限信息&#xff1a; “- | rw-r–r-- | . | 1 | root | root | 0 | Apr 12 10:…

工作了一辈子,你的住房公积金一共能有多少钱?

工作了快二十年了&#xff0c;02年大学毕业&#xff0c;进的私企两年后才开始有公积金账户&#xff0c;从140元每个月开始缴纳。到了现在这个单位才基本趋于正常&#xff0c;每月也就总共缴纳1858元。现在总额才15万多一点。假设我再工作二十年才退休&#xff0c;按照现在的扣款…

公积金提取一次需要间隔多长时间

住房公积金提取一次需要间隔的时间&#xff0c;得看提取的类型是什么&#xff1a; 1.购房并使用房贷&#xff1a;每个月可以提取一次住房公积金&#xff0c;累计提取总额不能超过实际发生的住房支出。 2.购房一次性付款&#xff1a;职工及其配偶每季度可以全额提取一次住房公…

事业单位工资计算机公积金计算,事业单位住房公积金基数怎么算?

阅读本文前&#xff0c;请您先点击上面的蓝色字体“人事聊”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注 事业单位住房公积金基数都是按职工的月工资来进行计算&#xff1b;对于公积金的计…

广州如何下载公积金的缴交证明和个人信息表

广州如何下载公积金的缴交证明和个人信息表 广州如何下载公积金的缴交证明和个人信息表 广州如何下载公积金的缴交证明和个人信息表 打开广州住房公积金管理中心&#xff08;http://gjj.gz.gov.cn/&#xff09; 在菜单中找到网上办事 在后面的菜单中&#xff0c;点击个人缴交…

公积金的提取规则

平常咱们工作中单位都缴纳一部分的的住房公积金&#xff0c;也有一些已经工作了一定年限的朋友&#xff0c;自己的公积金账户里少则也有上万元&#xff0c;多则可能都有十几万元&#xff0c;那么怎么才能把公积金提取出来呢 公积金官网&#xff1a;http://www.shgjj.com/ 第一&…