<题目链接>

题目大意:

在[0,8000]这个区间内,不断进行一些操作,将其中的一些区间染成特定颜色,如果区间重复的话,后面染的色块会覆盖前面染的色块,问最终[0,8000]这个区间内每种颜色的色块数量是多少。

解题分析:

首先要注意,这是对区间进行更新,。所以update的时候是对输入区间[a,b]的左闭右开或者是左开右闭进行处理。然后本题思路非常清晰,就是按照输入顺序更新线段树对应区间,然后对[0,8000]这个区间从左向右进行色块的统计。PS:虽然最后还是要将所有lazy下放到所有的叶子节点,进行色块数量的暴力统计,但是pushdown函数确实能够减少 update 的一些复杂度。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define Lson rt<<1,l,mid
#define Rson rt<<1|1,mid+1,r
const int M =8e3;
int tr[M<<],lazy[M<<],last;
int col[M<<];
void Pushdown(int rt){
if(lazy[rt]!=-){
int tmp=lazy[rt];
lazy[rt<<]=lazy[rt<<|]=tmp;
tr[rt<<]=tr[rt<<|]=tmp;
lazy[rt]=-;
}
}
void update(int rt,int l,int r,int L,int R,int c){ //区间染色
if(L<=l&&r<=R){
lazy[rt]=c;
tr[rt]=c;
return;
}
Pushdown(rt);
int mid=(l+r)>>;
if(L<=mid)update(Lson,L,R,c);
if(R>mid)update(Rson,L,R,c);
}
void query(int rt,int l,int r){ //运用递归(类似于dfs),达到从左到右逐步查询的效果,当遇到染色的点时,判断其是否与前一个点相同,如果不同,就说明该颜色的区块
if(l==r){
if(tr[rt]!=last&&tr[rt]!=-)col[tr[rt]]++;
last=tr[rt];
return;
}
Pushdown(rt);
int mid=(l+r)>>;
query(Lson);
query(Rson);
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
memset(tr,-,sizeof(tr));
memset(lazy,-,sizeof(lazy));
memset(col,,sizeof(col));
while(n--){
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
update(,,M,x+,y,c); //由于本题是区间更新,所以不能直接更新[a,b]这个闭区间的所有点,而是对a~b的左开右闭或者左闭右开区间进行更新,类似于图的将边权转化为点权
}
last=-;
query(,,M);
for(int i=;i<=M;i++){
if(col[i])printf("%d %d\n",i,col[i]);
}
printf("\n");
}
return ;
}

2018-09-22

最新文章

  1. 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)
  2. iOS 应用内的系统复制粘贴菜单显示的语言非中文
  3. MATLAB中的set函数
  4. tween.js是一款可生成平滑动画效果的js动画库。tween.js允许你以平滑的方式修改元素的属性值。它可以通过设置生成各种类似CSS3的动画效果。
  5. 【转载】详解CreateProcess调用内核创建进程的过程
  6. MyISAM表杂记实验
  7. 开始学习C++ Templates
  8. SDUT 3571 Password 暴力搜索
  9. CSS 最核心的几个概念
  10. 删除svn密码方法
  11. 求一无序数组中第n大的数字 - 快速选择算法
  12. linux之模拟简单登录的脚本
  13. Android入门——UI(2)
  14. JavaFX的扩展控件库ControlsFX介绍
  15. ICC_lab总结——ICC_lab2:设计规划
  16. javascript中typeof和instanceof用法的总结
  17. PYTHON:新闻聚合
  18. 责任链模式(Chain of Responsibility)
  19. nodejs简单数据迁移demo
  20. python Rpyc简单使用

热门文章

  1. 银联支付java版
  2. Confluence 6 计划任务
  3. NSLayoutConstraint 使用详解 VFL使用介绍
  4. day07 元组类型 字典类型 集合
  5. SpringData使用与整合
  6. Linux基础实操六
  7. php实现备份数据库
  8. python接口自动化测试三十三:获取时间戳(10位和13位)
  9. 论文阅读笔记五:U-Net: Convolutional Networks for Biomedical Image Segmentation(CVPR2015)
  10. vetur插件提示 [vue-language-server] Elements in iteration expect to have &#39;v-bind:key&#39; directives错误的解决办法