题目链接: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. Unity时钟定时器插件——Vision Timer源码分析之一

    因为项目中,UI的所有模块都没有MonBehaviour类(纯粹的C#类),只有像NGUI的基本组件的类是继承MonoBehaviour.因为没有继承MonoBehaviour,这也不能使用Updat ...

  2. vue 登录前做校验this.$router.push(location)

    有很多按钮在执行跳转之前,还会执行一系列方法,这时可以使用 this.$router.push(location) 来修改 url,完成跳转 例如:登录按钮,点击时需要先判断验证码等是否正确,此时

  3. 【python】入门指南1

    基础的数据结构:int, float, string 注意:python入门系列的文章的示例均使用python3来完成. #!/bin/python a = 1 b = 1.0 c = 'string ...

  4. Repeater绑定数据 后台自定义的DataTable

    前台:<asp:Repeater ID="Repeater1" runat="server">            <ItemTemplat ...

  5. .NET通用工具——正则表达式

    正则表达式就是一组字符串运算规则,你需要先把元字符记熟,然后就可以随意组合获得你想要的结果.把一些常用的正则表达式背下来也是一种方法,再加以变化获得你想要的结果. 正则表达式不需要刻意的去学习,当用到 ...

  6. 无法连接到localhost.其他信息:用户“sa”登录失败。(MicroSoft Sql Server,错误:18456)

    18456错误: 在安装的时候如果选择的身份验证模式为:Window身份验证模式,就会出现18456的错误. 解决方案: 使用windows身份验证登录之后,在下面红框上单击右键,点击属性: 点击属性 ...

  7. 多线程的异常处理、线程取消、临时变量、lock

    异步多线程的异常,抓不到,因为是在子线程执行. #region 多线程的异常处理.线程取消.临时变量.lock { try { List<Task> list = new List< ...

  8. hdu 1495 (搜索) 非常可乐

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 搜索模拟出每此倒得情况就好,详情见代码\ (好困啊!!!!1) #include<cstdio> ...

  9. javascript 高级程序设计 三

    Sorry,前两张介绍的主题还是JavaScript,而第一章介绍了JavaScript和ECMAScript区别,所以前两章介绍的主题应该改为ECMAScript,但是 标题就不改了因为现在人们习惯 ...

  10. python实现文件下载图片视频

    最近在学习爬虫,在爬取网站时很多时候是需要将图片或视频下载到本地 今天就来说说如何使用urllib将图片保存到本地 以下代码均为win7  python3.6.* 方法一(使用下载函数保存) from ...