Count Color poj2777 线段树

题意

有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色。

解题思路

这里使用线段树,因为刷颜色可以看作是区间修改,使用lazy标记区间的颜色种类,下传标记后,当前节点的lazy标记就标记为0,然后使用vis数组来标记颜色(颜色种类很少)。剩下的基本就是线段树的模板了。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+17;
struct node{
int l, r, lazy;
}a[maxn<<2];
int vis[35];//颜色种类
int L, T, O, ans;
void build(int rt, int l, int r)
{
a[rt].l=l;
a[rt].r=r;
a[rt].lazy=1;//默认为第一种颜色
if(l==r){
return ;
}
int mid=(l+r)>>1;
build(rt<<1, l, mid);
build(rt<<1|1, mid+1, r);
}
void down(int k)
{
a[k<<1].lazy=a[k].lazy;
a[k<<1|1].lazy=a[k].lazy;
a[k].lazy=0;//表示他的节点下面可能是两种不同的颜色
}
void update(int rt, int L, int R, int x)
{
if(L<=a[rt].l && a[rt].r<=R)
{
a[rt].lazy=x;
return ;
}
int mid=(a[rt].l+a[rt].r)>>1;
if(a[rt].lazy !=0 ) //记得一定要下传标记
down(rt);
if(L<=mid) update(rt<<1, L, R, x);
if(R>mid) update(rt<<1|1, L, R, x);
}
void query(int rt, int L, int R)
{
if(a[rt].lazy!=0) //如果不为零就可以进行判断,因为下面的也是这种颜色
{
if(!vis[a[rt].lazy])// 看是否之前标记过
{
ans++; //没有标记就加一
vis[a[rt].lazy]=1; //标记
}
return ;
}
int mid=(a[rt].l+a[rt].r)>>1;
if(a[rt].lazy!=0)
down(rt);
if(L<=mid) query(rt<<1, L, R);
if(R>mid) query(rt<<1|1, L, R);
}
int main()
{
int l, r, c;
char s[4];
while(scanf("%d%d%d", &L, &T, &O)!=EOF)
{
build(1, 1, L);
for(int i=1; i<=O; i++)
{
scanf("%s", s);
if(s[0]=='C')
{
scanf("%d%d%d", &l, &r, &c);
if(l > r){
swap(l, r);
}
update(1, l, r, c);
}
else {
scanf("%d%d", &l, &r);
if(l > r) {
swap(l, r);
}
memset(vis, 0, sizeof(vis));
ans=0;
query(1, l, r);
printf("%d\n", ans);
}
}
}
return 0;
}

Count Color poj2777 线段树的更多相关文章

  1. 【POJ 2777】 Count Color(线段树区间更新与查询)

    [POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4094 ...

  2. POJ-2777 Count Color(线段树,区间染色问题)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40510 Accepted: 12215 Descrip ...

  3. [POJ2777]Count Color(线段树)

    题目链接:http://poj.org/problem?id=2777 给你一个长为L想线段,向上面染色,颜色不超过30种,一共有O次操作,操作有两种: C a b c 在[a,b]上染上c颜色 P ...

  4. POJ 2777 Count Color(线段树染色,二进制优化)

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42940   Accepted: 13011 Des ...

  5. POJ 2777 Count Color(线段树 + 染色问题)

    传送门:Count Color Description Chosen Problem Solving and Program design as an optional course, you are ...

  6. POJ 2777 Count Color【线段树】

    题目大意:要求完成以下两个操作:1.将一个区间刷上一种颜色2.询问一段区间上有多少种颜色 思路:这两个操作线段树都可以很迅速的完成,具体做法是:线段树上每个节点存这个线段上的颜色数量,由于颜色数很少, ...

  7. 【POJ2777】Count Color(线段树)

    以下是题目大意: 有水平方向上很多块板子拼成的墙,一开始每一块都被涂成了颜色1,有C和P两个操作,代表的意思是:C X Y Z —— 从X到Y将板子涂成颜色ZP X Y    —— 查询X到Y的板子共 ...

  8. poj 2777 Count Color(线段树 区间更新)

    题目:http://poj.org/problem?id=2777 区间更新,比点更新多一点内容, 详见注释,  参考了一下别人的博客.... 参考博客:http://www.2cto.com/kf/ ...

  9. POJ 2777 Count Color(线段树+位运算)

    题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...

随机推荐

  1. java Collections.binarySearch 用法

    package testCollections; import java.util.ArrayList;import java.util.Collections;import java.util.Co ...

  2. django orm(2)

    目录 聚合函数 分组查询 F与Q查询 F查询 Q查询 事务 Django中的事务 orm字段及参数 自定义char字段 聚合函数 这里的聚合函数和SQL里的聚合函数对应,在使用前需要先进行模块的导入: ...

  3. springboot自定义错误页

    静态错误页放在         动态可以放在freemaker或者thymeleaf         匹配规则: 先找动态页面再找静态页面 先找精确错误页面再找模糊页面     注:精确错误页面=50 ...

  4. appium环境666

    一.安装JDK,配置JDK环境    appium下载地址: https://github.com/appium/appium-desktop/releases/ 百度搜索下载就行,这里分享一个下载链 ...

  5. 完美解决linux不能编辑sshd_cofig和实现xshell远程连接的问题

    第一步:我们使用命令行vim /etc/ssh/sshd_config   执行修改,强制保持  :wq!  系统不让我们修改这个文件 "/etc/ssh/sshd_config" ...

  6. idea 打包model 为jar包

    1,在项目上鼠标右键 --> Open Module Settings 2, Artifacts --> + --> JAR --> From modules with dep ...

  7. PC端无论页面有没有完全撑开把footer保持在最底部(不用定位)

    最近在写项目,有的页面没有占到一屏,然后footer也就是底部就靠上了,这样很影响美观,于是在网上找了找,下面是我的成果 解决该问题的最好方法是采用CSS3提供的一种先进布局模型 :flexbox,可 ...

  8. (12)QT中搭建opencv开发环境

    只需要在项目工程文件pro中添加上: INCLUDEPATH += G:/opencv/build/include \ G:/opencv/build/include/opencv \ G:/open ...

  9. 查看Oracle数据库中的执行计划

    1.set autotrace traceonly命令 2.explain plan for命令 1)explain plan for select * from dual; 2)select * f ...

  10. spoj 3267 D-query

    题目链接:http://vjudge.net/problem/SPOJ-DQUERY --------------------------------------------------------- ...