题目链接:http://poj.org/problem?id=2777

参考文章:https://blog.csdn.net/heucodesong/article/details/81038360

题目大意:给出T中颜色,可以给一段区域涂色,初始是全为1的颜色,然后有两种操作

(1)C x y z表示将区间x到y的颜色更改为z

(2)P x y 表示查询区间x到y的颜色种类。

题目看起来不符合区间和的条件,但是可以通过二进制转化一下。

初始化肯定都是颜色1,就表示只有一种颜色,然后每次更新颜色时,取这个数的a[x]=1<<(Item-1),a[x]中的1的位置就表示每个颜色的位置

然后pushup操作就改为:a[x]=a[x*2]|a[x*2+1],a[x]中的1的个数就是这个区间颜色的个数。对于Item为什么要-1,其实就是初始颜色时1,就相当于从第0位开始,与数组的0-n-1类似。

(易错:我当时在查询函数中一直出错,但我还没发现,主要是考虑ans1,ans2,ans的初始值是0,这里我已开始写成了1,就错了,

还有ans=ans1|ans2这一步不能少,不然编译会出错,总之,先求出结果再返回。)

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn = 1e5+;
int a[maxn*],b[maxn*];
void Init()
{
memset(a,,sizeof(a));
memset(b,,sizeof(b));
}
void pushup(int x)
{
a[x]=a[x*]|a[x*+];
}
void pushdown(int x)
{
if(b[x])
{
a[x*]=b[x];
a[x*+]=b[x];
b[x*]=b[x];
b[x*+]=b[x];
b[x]=;
}
}
void build(int x,int l,int r)
{
if(l==r)
{
a[x]=;return ;
}
int mid=(l+r)/;
build(x*,l,mid);
build(x*+,mid+,r);
pushup(x);
}
void update(int x,int l,int r,int A,int B,int Item)
{
if(A<=l&&r<=B)
{
a[x]=<<(Item-);
b[x]=<<(Item-);
return ;
}
int mid=(l+r)/;
pushdown(x);
if(A<=mid) update(x*,l,mid,A,B,Item);
if(B>mid) update(x*+,mid+,r,A,B,Item);
pushup(x);
}
int query(int x,int l,int r,int A,int B)
{
if(A<=l&&r<=B)
{
return a[x];
}
int mid=(l+r)/;
pushdown(x);
int ans1=,ans2=,ans=;
if(A<=mid) ans1=query(x*,l,mid,A,B);
if(B>mid) ans2=query(x*+,mid+,r,A,B);
ans=ans1|ans2;
return ans;
}
int main(void)
{
int n,m,t,i,x,y,z;
while(~scanf("%d%d%d",&n,&t,&m))
{
Init();
build(,,n);
char str[];
while(m--)
{
scanf("%s",str);
if(str[]=='C')
{
scanf("%d%d%d",&x,&y,&z);
if(x>y)
{
int tp=x;
x=y;
y=tp;
}
update(,,n,x,y,z);
}
else
{
scanf("%d%d",&x,&y);
if(x>y)
{
int tp=x;
x=y;
y=tp;
}
int cnt=,ans=query(,,n,x,y);
while(ans)
{
if(ans&) cnt++;
ans>>=;
}
printf("%d\n",cnt);
}
}
}
return ;
}

poj-2777(区间线段树,求种类数模板)的更多相关文章

  1. HDU 1828 / POJ 1177 Picture --线段树求矩形周长并

    题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...

  2. POJ 1151 Atlantis 线段树求矩形面积并 方法详解

    第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...

  3. poj 2777(线段树的节点更新策略)

    /* 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 后来想一想没有必要 !加入[a ...

  4. POJ 1151Atlantis 扫描线+线段树求矩形面积并

    题目链接 #include <iostream> #include <vector> #include <cstdio> #include <cstring& ...

  5. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

  6. hdu 1754 I Hate It (线段树求区间最值)

    HDU1754 I Hate It Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u D ...

  7. 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

    原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...

  8. xdoj-1324 (区间离散化-线段树求区间最值)

    思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i]  覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...

  9. ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板)

    ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板) 题意 题意:给一个n,代表n次操作,接下来每次操作表示把[l,r]区间的线段涂成k的颜色其中,l,r,k的范围都是0到8000 这 ...

随机推荐

  1. laravel excel导出调节列宽度,对某列中数据颜色处理

    //$cellData 表格标题栏各名称数组 //$result 表格内容数组//$items getForDataTable得到的表格数据 $result = array_merge($cellDa ...

  2. oracle数据库查询出多条数据,合并,之后列转行

    select B.enterprise_code, B.enterprise_name, sum(B.h0_overnum) AS over00, sum(B.h1_overnum) AS over0 ...

  3. 【转】Spring、Spring MVC、MyBatis整合文件配置详解

    见:http://www.tuicool.com/articles/eyINveF web.xml的配置 web.xml应该是整个项目最重要的配置文件了,不过servlet3.0中已经支持注解配置方式 ...

  4. 100-days: The one day

    Title:In tech race with China, US universities may lose a vital edge in tech race with  与...的科技比赛中 e ...

  5. Unicode编码字符范围和具体文字

    1)标准CJK文字 http://www.unicode.org/Public/UNIDATA/Unihan.html 2)全角ASCII.全角中英文标点.半宽片假名.半宽平假名.半宽韩文字母:FF0 ...

  6. redis集群 与spring-data-redis 集成

    所遇到的坑:必须使用如下的jedis 版本与spring-data-redis 版本,才能够达到集群效果 .1.7版本以前是不支持集群的 <dependency> <groupId& ...

  7. linux命令学习之:route

    我们在网络基础的时候谈过关于路由的问题,两台主机之间一定要有路由才能够互通TCP/IP的协议,否则就无法进行联机.一般来说,只要有网络接口,该接口就会产生一个路由,例如:eth0及lo. route命 ...

  8. 15-算法训练 P1103

    http://lx.lanqiao.cn/problem.page?gpid=T372   算法训练 P1103   时间限制:1.0s   内存限制:256.0MB      编程实现两个复数的运算 ...

  9. 5-Error:failed to find Build Tools revision 28.0.0 rc1解决方案

    将app下面的build.gradle中的版本改为你安装的 sdk 版本:

  10. Three.js 对模型多个动画切换展示(fbx)

    来源 :https://blog.csdn.net/qq_30100043/article/details/80087471 简介 上一节本想直接了结动画这一章.最后一想,没有做过模型动画切换的案例. ...