ZOJ - 1610 经典线段树染色问题
这个是一个经典线段树染色问题,不过题目给的是左右左右坐标,即[0,3]包含0-1这一段 1-2这一段 2-3这一段,和传统的染色不太一样,不过其实也不用太着急。
我们把左边的坐标+1,即可,那么[0,3]其实变成了[1,3]而线段树是按照点询问的,也就是每个点代表的颜色,我们就有了1,2,3,这个三个,并且避免了线段树编号不能到0的情况,然后代码就十分简单了,无需laze标记,因为每个节点的颜色就可以当成laze标记,然后不断往下pushdown既可以,当时还有一个问题就是线段树访问连续两个节点的颜色是相同的,那么它其实是一个连续的算一个,我们可以维护一个last,代表前一个区间的颜色,由于我们递归是按照左右儿子进行递归的,左儿子过了肯定是右儿子,实际上这是连续的,所以我们这需要判断这个区间颜色是不是和前面那个区间的颜色相同,从而判断这两个颜色是否相邻即可
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int maxx = ;
inline int L(int r){return r<<;};
inline int R(int r){return r<<|;};
inline int MID(int l,int r){return (l+r)>>;};
int n,last;
struct node{
int l,r,col;
}tree[maxx<<];
int ans[maxx];
void pushdown(int root){
if(tree[root].col!=-){
tree[L(root)].col=tree[root].col;
tree[R(root)].col=tree[root].col;
tree[root].col=-;
}
}
void buildtree(int root,int l,int r){
tree[root].l=l;
tree[root].r=r;
tree[root].col=-;
if (l==r){
return;
}
int mid=MID(l,r);
buildtree(L(root),l,mid);
buildtree(R(root),mid+,r);
}
void update(int root,int ul,int ur,int c){
int l=tree[root].l;
int r=tree[root].r;
if(ul<=l && r<=ur){
tree[root].col=c;
return;
};
if (tree[root].col==c)return;
pushdown(root);
int mid=MID(l,r);
if (ur<=mid){
update(L(root),ul,ur,c);
}else if(ul>mid){
update(R(root),ul,ur,c);
}else{
update(L(root),ul,mid,c);
update(R(root),mid+,ur,c);
}
}
void query(int root,int ql,int qr){
if (ql==qr){
if(tree[root].col!=- && tree[root].col!=last){
ans[tree[root].col]++;
}
last=tree[root].col;
return;
}
pushdown(root);
if(ql==qr)return;
int mid = (ql+qr)>>;
query(L(root),ql,mid);
query(R(root),mid+,qr);
}
int main(){
while(~scanf("%d",&n)){
int x,y,z;
buildtree(,,);
for (int i=;i<=n;i++){
scanf("%d%d%d",&x,&y,&z);
update(,x+,y,z);
}
last=-;
memset(ans,,sizeof(ans));
query(,,);
for (int i=;i<=;i++){
if (ans[i]){
printf("%d %d\n",i,ans[i]);
}
}
puts("");
}
return ;
}
ZOJ - 1610 经典线段树染色问题的更多相关文章
- pku 2777(经典线段树染色问题)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 41202 Accepted: 12458 Des ...
- F - Count the Colors ZOJ - 1610 线段树染色(染区间映射)
题意:给一段0-8000的线段染色 问最后 颜色x 有几段 题解:标准线段树 但是没有push_up 最后查询是单点按顺序查询每一个点 考虑过使用区间来维护不同的线段有多少种各色的线段 思路是 ...
- Count the Colors(线段树染色)
Count the Colors Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit ...
- POJ 2777 Count Color(线段树 + 染色问题)
传送门:Count Color Description Chosen Problem Solving and Program design as an optional course, you are ...
- POJ2528 Mayor's posters —— 线段树染色 + 离散化
题目链接:https://vjudge.net/problem/POJ-2528 The citizens of Bytetown, AB, could not stand that the cand ...
- POJ 2777 Count Color(线段树染色,二进制优化)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42940 Accepted: 13011 Des ...
- 2243: [SDOI2011]染色 树链剖分+线段树染色
给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组 ...
- zoj 3349 dp + 线段树优化
题目:给出一个序列,找出一个最长的子序列,相邻的两个数的差在d以内. /* 线段树优化dp dp[i]表示前i个数的最长为多少,则dp[i]=max(dp[j]+1) abs(a[i]-a[j])&l ...
- 经典线段树 UVALive 3938/UVA 1400
题意:就是相当于动规里面的求最大连续子串,不同的是,这里需要读入一个区间x,y,输出的区间 a,b 且x<=a<=b<=y,使得a b的连续子串最长,而且询问次数达到了10的五次方. ...
随机推荐
- mssql sql server 其它系统函数 parsename 点语法字符串分割函数应用简介
转自:http://www.maomao365.com/?p=4534 一. parsename函数功能简介 parsename函数的主要功能是:可以快速的使用”.”关键字分解字符串,并返回.分解后指 ...
- python Django 文件下载示例
from django.http import StreamingHttpResponse#文件流 def big_file_download(request): # do something... ...
- NLog简单使用
一.安装 二.安装后会在根目录出现NLog.config配置文件,简单修改配置文件为写入文件记录日志: <?xml version="1.0" encoding=" ...
- c#qq发邮件
// SMTP(Simple Mail Transport Protocol)简单邮件传输协议.在.NET Frameword类库中提供SmtpClient类(System.Net.Mail),她提供 ...
- perl语言中的.pm文件和.pl文件区别
perl...呵呵呵 按照惯例,.pm 应该保存 Perl Module,也就是 Perl 模块.例如 Socket.pm.pl 应该保存 Perl Library,也就是 Perl 库文件.例如 p ...
- rabbitMQ模式
1.hello 消息生产者p将消息放入队列 消费者监听队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列删除(隐患,消息可能没有被消费者正确处理,已经消失了,无法恢复) 应用场景:聊天室 案 ...
- MacOS远程Windows提示:远程桌面连接无法验证您希望连接的计算机的身份
解决方法: 1.在Windows端,运行输入 “gpedit.msc”,打开本地组策略编辑器 2.依次打开[计算机配置]→[管理模板]→[windows组件]→[远程桌面服务]→[远程桌面会话主机]→ ...
- ctf学习(web题二)
web 下面是做bugku上一些web的总结 内容链接
- 【Linux基础】VI命令模式下删除拷贝与粘贴
在VI命令模式下:y 表示拷贝, d 表示删除,p标识粘贴 1.删除 dw 表示删除从当前光标到光标所在单词结尾的内容. d0 表示删除从当前光标到光标所在行首的内容. d$ 表示删除从当前光标到光标 ...
- redis学习笔记(二)-五种数据类型
string hash hget ks k hset ks k v hgetall ks hdel ks k del ks hmset ks k v k v list set zset 通用命令 快 ...