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 这 ...
随机推荐
- 解决node-pre-gyp install --fallback-to-build 卡住不动
一般是因为需要下载国外的包,要么连VPN,要么使用淘宝的镜像: 使用cnpm: npm install -g cnpm --registry=https://registry.npm.taobao.o ...
- f5 V11 TMSH命令行操作手册
1.命令行登录工具:“SshClient.exe” 2.查看当前系统配置: # show running-config # show running-config net interface:网络接口 ...
- f5主备切换演练
1.准备工作: 1)保证主备机同步 2)备份主备机配置 2.切换:所有操作均在主机 方法1:shutdown主机上联的核心交换机的端口: 此方法在主备切换过程中会丢1个包 方法2:命令行下reboot ...
- git add 文件夹
1. 本地新建好文件夹,在文件夹里新建*.md 2. 切换到文件夹父目录 3. git add 文件夹名 4. git commit 5. git push
- Linux下 MYSQL 主从复制、同步
mysql从3.23.15版本以后提供数据库复制功能.利用该功能可以实现两个数据库同步,主从模式(A->B),互相备份模式(A<=>B)的功能. 主从模式(A->B)的配置过程 ...
- InertialNav
https://github.com/priseborough/InertialNav Instructions To Run Simulink Model Note : Simulink model ...
- HTML 转 PDF 之 wkhtmltopdf 工具精讲
术语定义 文档对象 “文档对象”是指PDF文档中的文档对象,共有三种类型的“文档对象”,他们分别是“页面对象”,“封面对象”和“目录对象”. 页面对象 “页面对象”是指以页面的形式在PDF文档中呈现的 ...
- python学习笔记Day2
字符编码 编程规范(PEP8) 变量1.常量(用大写) 2.变量 常用类型:str .int.float. long.bool 字串格式化: %d 整数 %2d占两位 %02d占两位用0填充 %f 浮 ...
- 10.15 JS日记
1.JS 介绍 js的全称是JavaScript,它是一门前台语言 Java是一门后台语言 ,它们两个之间毫无关系 JavaScript的作者是布兰登,艾奇 前台语言:运行在客户端 后台语言:与数据库 ...
- c# 使用ssh.net 上传文件
在ssh.net 客户端实例下无法普通用户切换到su root 超级用户,原因是tty 的不支持,具体原因未查, 连接时用超级用户,问题解决 使用ssh.net 能实现远程命令, 使用其中的sf ...