poj 2777 Count 线段树区间覆盖

news/2025/2/14 0:53:12/
http://poj.org/problem?id=2777
跟贴报纸差不多,还不用离散化。
本身木棍的颜色是0,也算一种颜色,给木棍涂颜色,颜色用数字代替是1~30,不过是随时询问,不像贴报纸就问一次。
这个就要注意效率,用Lazy来延迟更新,登用到该值的时候再更新。
两种操作
C:  L R color    从L到R区间长度的木棍全都涂上color(1~30)颜色,如果本来就有颜色就覆盖。

Q: L R          从L到R区间长度上有多少种颜色。

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <deque>
#include <math.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <functional>
#define mem(a) memset(a,0,sizeof(a));
#define mem_1(a) memset(a,-1,sizeof(a));
#define sf(a) scanf("%d",&a)
#define sff(a,b) scanf("%d%d",&a,&b)
#define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
const int INF = 0x7FFFFFFF;
const int MAXN = 101000;
const double PI = acos(-1.0);
const double esp = 1e-10;
using namespace std;
struct node
{int l,r,lazy;int mid(){return (l+r)>>1;}
} Tree[MAXN<<4];
int ans = 0;
int flag[35];
void pushDown(int i)
{if(Tree[i].lazy != -1){Tree[i << 1].lazy = Tree[i].lazy;Tree[i<<1|1].lazy = Tree[i].lazy;Tree[i].lazy = -1;}
}
void build_tree(int l,int r,int i)
{Tree[i].l = l;Tree[i].r = r;Tree[i].lazy = 1;if(r == l){return ;}int mid = (l+r)>>1;build_tree(l,mid,i<<1);build_tree(mid+1,r,i<<1|1);
}
void updata(int l,int r,int i,int k)
{if(Tree[i].l == l && Tree[i].r == r){Tree[i].lazy = k;return ;}if(Tree[i].lazy == k) return ;pushDown(i);int mid = Tree[i].mid();if(r <= mid) updata(l,r,i<<1,k);else if(mid < l) updata(l,r,i<<1|1,k);else{updata(l,mid,i<<1,k);updata(mid+1,r,i<<1|1,k);}
}
void Query(int l,int r,int i)
{//if(Tree[i].l == r && Tree[i].r == r &&  Tree[i].lazy)if(Tree[i].lazy != -1){if(!flag[Tree[i].lazy]){flag[Tree[i].lazy] = 1;ans++;}return ;}pushDown(i);int mid = Tree[i].mid();if(r <= mid) Query(l,r,i<<1);else if(mid < l) Query(l,r,i<<1|1);else {Query(l,mid,i<<1);Query(mid+1,r,i<<1|1);}
}
int main()
{int n,colorNum,m;int l,r,color;char c;while(sfff(n,colorNum,m)!=EOF){build_tree(1,n,1);while(m--){cin >> c;if(c=='C'){sfff(l,r,color);if(l > r) swap(l,r);updata(l,r,1,color);}else{sff(l,r);mem(flag);ans = 0;if(l > r) swap(l,r);Query(l,r,1);printf("%d\n",ans);}}}return 0;
}



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

相关文章

洛谷P2777

玄学题&#xff0c;一开始我居然看成了单调队列,emmmm 贪心&#xff1a;每个人的最优的分时a[i]n; 其余要想他得到冠军&#xff0c;就要比他高分的人获得的最大得分是a[i]n,要让初始分数最高的人拿到最低的排名&#xff0c;证明只可意会不可言传&#xff0c;OI贪心就是比较玄学…

linux更改文件特殊权限,Linux特殊文件权限(chmod) chmod2777

一般来说,使用过Linux的同学都知道,Linux文件的权限有rwx,所有者、所有组、其它用户的rwx权限是彼此独立的。为此,经常会听到如果某个web文件需要被修改的话,需要加上777的权限,这就是让所有用户可写。 但仔细一想,这样的权限未免有些想得比较天真,没有考滤特殊情况。例…

poj 2777

题意&#xff1a;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->x1;//初始颜色roo…

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;职工及其配偶每季度可以全额提取一次住房公…