poj-2777(区间线段树,求种类数模板)
题目链接: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(区间线段树,求种类数模板)的更多相关文章
- HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...
- POJ 1151 Atlantis 线段树求矩形面积并 方法详解
第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...
- poj 2777(线段树的节点更新策略)
/* 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 后来想一想没有必要 !加入[a ...
- POJ 1151Atlantis 扫描线+线段树求矩形面积并
题目链接 #include <iostream> #include <vector> #include <cstdio> #include <cstring& ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
- hdu 1754 I Hate It (线段树求区间最值)
HDU1754 I Hate It Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u D ...
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
- xdoj-1324 (区间离散化-线段树求区间最值)
思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i] 覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...
- ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板)
ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板) 题意 题意:给一个n,代表n次操作,接下来每次操作表示把[l,r]区间的线段涂成k的颜色其中,l,r,k的范围都是0到8000 这 ...
随机推荐
- UFPS入门: Unity FPS 教程
http://blog.csdn.net/kmyhy/article/details/72846348 UFPS : Ultimate FPS v1.7.3 download:https://item ...
- Javascript(es2016) import和require用法和区别
http://blog.csdn.net/chinaycheng/article/details/52559439 其中这个总结很到位: 加载方式 规范 命令 特点 运行时加载 CommonJS/AM ...
- swift 带有下划线的UIbutton
import UIKit /// 带下划线的Button class UnderlineButton: JYBaseButton { /// 下划线高度 var underLineHeight:CGF ...
- day 14 项目目录规范; time ; logging
import sys print(sys.modules) 程序一运行,解释器将里面的所有内容全部加载到内存 项目目录规范: 代码不可能全部只写在一个文件,十几万行代码,调整,修改都很不方便. 所 ...
- 39-java中Arrays.sort 和 collections.sort()总结
总结一下java 中的两种排序工具: Arrays.sort() : 主要针对 数组类型排序,如果数组里面的元素是对象,要按对象属性排序的话,需要重写 Comparator() 函数,重写里面的 i ...
- ContenteProvider
以前只写过程序中添加背景音乐,在程序一开始就运行音乐,当程序结束后音乐也随即停止.遇到这样的功能,我们一般是通过系统提供的ContentProvider来实现的,系统对于常用的数据也给开发者提供了方便 ...
- Windows Server 2008 MetaFile设置占用内存限制
最近遇到Windows Server 2008服务器内存持续飙升,48G内存用了99%,查看任务管理器的进程,也没发现具体哪个进程用的内存比较大? 于是,在网上找了了一个查看内存的工具RamMap,具 ...
- PAT 1076 Wifi密码(15)(代码)
1076 Wifi密码(15 分) 下面是微博上流传的一张照片:"各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B- ...
- PAT 1043 输出PATest(20)(代码+思路)
1043 输出PATest(20)(20 分) 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按"PATestPATest...."这样的顺序输出 ...
- MySql5.5 SQL优化 慢查询日志存储
一.MySql的慢查询日志的开启和存储 1.查看是否把没有使用索引的SQL记录到慢查询日志中,查看 log_queries_not_using_indexes 变量; show VARIABLES L ...