博客
关于我
ZOJ1610 Count the Colors (分块写法) 区间覆盖
阅读量:220 次
发布时间:2019-03-01

本文共 1953 字,大约阅读时间需要 6 分钟。

Count the Colors

问题描述

在一条直线上画一些彩色的线段,一些以前画过的线段可能被后面的线段覆盖。

你的任务是计算你最终能看到的不同颜色的片段。

输入

每个数据集的第一行恰好包含一个整数n, 1 <= n <= 8000,等于彩色段的数量。

下面的n行每一行由3个非负整数组成,用空格隔开:
(x1, x2) c
x1和x2表示线段的左端点和右端点,c表示线段的颜色。
所有的数字都在[0,8000]范围内,它们都是整数。
输入可以包含多个数据集,处理到文件末尾。

输出

输出的每一行都应该包含一个可以从顶部看到的颜色索引,在此颜色的段数之后,应该根据颜色索引打印它们。

如果有些颜色看不到,就不应该打印出来。
在每个数据集之后打印空行。

Sample Input

5

0 4 4
0 3 1
3 4 2
0 2 2
0 2 3
4
0 1 1
3 4 1
1 3 2
1 3 1
6
0 1 0
1 2 1
2 3 1
1 2 0
2 3 0
1 2 1

Sample Output

1 1

2 1
3 1
1 1

0 2

1 1

分析:

线段树入门题,但是最近学了分块想拿分块写。

这题题目的n不是区间长度,区间长度是固定的8000
类似线段树laz标记。分块一样开个数组标记。记得最后重置标记!!!(pushdown)

记录下来提醒自己

我的代码(分块):

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef long long ll;const int inf=0x3f3f3f3f;const int inn=0x80808080;using namespace std;const int maxm=8000+5;int n;int num,block;int mark[maxm];//其实不用开这么大的数组,但是空间不值钱int l[maxm],r[maxm];int a[maxm];int belong[maxm];void build(){ int ma=8001; memset(a,-1,sizeof a); memset(mark,-1,sizeof mark); block=sqrt(ma); num=ma/block; if(ma%block)num++; for(int i=1;i<=num;i++){ l[i]=(i-1)*block+1; r[i]=i*block; } r[num]=ma; for(int i=1;i<=ma;i++){ belong[i]=(i-1)/block+1; }}void reset(int node){ //重置标记(pushdown) if(mark[node]==-1){ return ; } for(int i=l[node];i<=r[node];i++){ a[i]=mark[node]; } mark[node]=-1;}void check(int node,int val){ //检查是否可以标记 for(int i=l[node];i<=r[node];i++){ if(a[i]!=val){ mark[node]=-1; return ; } } mark[node]=val;}void update(int x,int y,int val){ if(belong[x]==belong[y]){ reset(belong[x]); for(int i=x;i<=y;i++){ a[i]=val; } check(belong[x],val); return ; } reset(belong[x]); for(int i=x;i<=r[belong[x]];i++){ a[i]=val; } check(belong[x],val); reset(belong[y]); for(int i=l[belong[y]];i<=y;i++){ a[i]=val; } check(belong[y],val); for(int i=belong[x]+1;i
0){ printf("%d %d\n",i,ans[i]); } } printf("\n"); } return 0;}

转载地址:http://rxuv.baihongyu.com/

你可能感兴趣的文章
MySQL 快速创建千万级测试数据
查看>>
mysql 快速自增假数据, 新增假数据,mysql自增假数据
查看>>
MySql 手动执行主从备份
查看>>
Mysql 批量修改四种方式效率对比(一)
查看>>
mysql 批量插入
查看>>
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
MySQL 数据库设计总结
查看>>
Mysql 数据库重置ID排序
查看>>