F - Count the Colors - zoj 1610(区间覆盖)
Segmentation Fault
|
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define Lson root<<1,L,tree[root].Mid()
#define Rson root<<1|1,tree[root].Mid()+1,R
const int maxn = 80005;
struct Hook{int l, r, c;}p[maxn];
struct Tree{
int L, R;
int color;//记录颜色
int Mid(){return (L+R)/2;}
}tree[maxn*4];
int Color[maxn];
void CoverColor(int L, int R, int e)//把区间LR涂成颜色e
{
for(int i=L; i<=R; i++)
Color[i] = e;
}
void Build(int root, int L, int R)
{
tree[root].L = L, tree[root].R = R;
//0代表没有被颜色覆盖,1代表未覆盖,2代表子树有被别的颜色覆盖
tree[root].color = 0;
if(L == R)return ;
Build(Lson);
Build(Rson);
}
void Up(int root)
{
if(tree[root].L != tree[root].R)
if(tree[root<<1].color == 1 && tree[root<<1|1].color == 1)
tree[root].color = 1;
}
void Insert(int root, int L, int R, int e)
{
if(tree[root].color == 1)return ;
if(tree[root].L == L && tree[root].R == R && !tree[root].color)
{
tree[root].color = 1;
CoverColor(L, R, e);
return ;
}
tree[root].color = 2;
if(R <= tree[root].Mid())
Insert(root<<1, L, R, e);
else if(L > tree[root].Mid())
Insert(root<<1|1, L, R, e);
else
{
Insert(Lson, e);
Insert(Rson, e);
}
Up(root);
}
int main()
{
int N;
while(scanf("%d", &N) != EOF)
{
int i, ans[maxn] = {0};
for(i=1; i<=N; i++)
scanf("%d%d%d", &p[i].l, &p[i].r, &p[i].c);
Build(1, 0, maxn-1);
memset(Color, -1, sizeof(Color));
for(i=N; i>0; i--)//因为给的是紧密区间,而建的树点的,所以把左边的+1,变成点覆盖的
Insert(1, p[i].l+1, p[i].r, p[i].c);
for(i=0; i<maxn; i++)
{
if( Color[i]!=-1 && (!i || Color[i]!=Color[i-1]) )
ans[Color[i]]++;
}
for(i=0; i<maxn; i++)if(ans[i])
printf("%d %d\n", i, ans[i]);
printf("\n");
}
return 0;
}
转载于:https://www.cnblogs.com/liuxin13/p/4678524.html
F - Count the Colors - zoj 1610(区间覆盖)相关推荐
- Count the Colors ZOJ - 1610
GO 题意:给一个区间,有n次染色操作,每次将[x1, x2]染为c,求最后每种颜色各有多少线段可以看到. #include<cstdio> #include<iostream> ...
- ZOJ 1610 Count the Colors (线段树区间更新)
题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...
- ZOJ 1610 Count the Colors
段树:延迟标志+暴力更新 我记得刚学段树做的时候这个话题WA一个版本.....如今,每分钟获得.... Count the Colors Time Limit: 2 Seconds Memo ...
- *【UVA - 10382】Watering Grass(贪心,区间覆盖问题,思维)
题干: 题目大意: 有一块草坪,长为l,宽为w,在它的水平中心线上有n个位置可以安装喷水装置,各个位置上的喷水装置的覆盖范围为以它们自己的半径ri为圆.求出最少需要的喷水装置个数,如果无论如何都不能覆 ...
- 区间覆盖全部类型及部分精选习题汇总详解(贪心策略)
内容如下: 1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2, ...
- BZOJ2298: [HAOI2011]problem a(带权区间覆盖DP)
Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1747 Solved: 876 [Submit][Status][Discuss] Descrip ...
- HDU - 3974 Assign the task (DFS建树+区间覆盖+单点查询)
题意:一共有n名员工, n-1条关系, 每次给一个人分配任务的时候,(如果他有)给他的所有下属也分配这个任务, 下属的下属也算自己的下属, 每次查询的时候都输出这个人最新的任务(如果他有), 没有就输 ...
- UVA10020(最小区间覆盖)
题意: 给你一个区间[0,m]和一些小的区间[l,r]让你选择最少的小区间个数去把整个区间覆盖起来. 思路: 算是比较经典的贪心题目吧(经典于难度没什么对应关系),大体思路可以 ...
- 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...
HDU 5861 题意 在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放.现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道 ...
最新文章
- R语言构建logistic回归模型并评估模型:模型预测结果抽样、可视化模型分类预测的概率分布情况、使用WVPlots包绘制ROC曲线并计算AUC值
- Hadoop系列之六:分布式文件系统HDFS
- Spring boot自动配置使用
- 软件项目管理0724:见供应商的体会
- redis入门demo
- 关于NavigateUrl中绑定Eval()方法时出现服务器标记的格式不正确的解决方法
- java实现商品的分类_Spring 商品分类
- win10专业版安装后没有wifi
- docker安装zabbix怎样修改图标和登录页文字
- cad墙线打断lisp_cad相切命令(cad相交线自动打断)
- 转:firefox os 框架解析
- 统计假设测验------(四)方差分析(F测验、多重比较原理与方法)
- windows的注册表有什么用?
- C语言 -指针 与解引用*
- c# 实现WebSocket
- SpringBoot获取微信openid(java)
- 今日科技联播:蚂蚁金服回应支付宝法人变更,子弹短信总激活用户超过400万...
- QQ音乐PB级ClickHouse实时数据平台架构演进之路
- AI(1)认知 人工智能、机器学习、神经网络、深度学习。
- wi-fi_Google语音正在测试Wi-Fi呼叫,无需呼叫转移
热门文章
- Python基础15-函数闭包与装饰器
- node.js是开源的吗_为开源做贡献并不难:我为Node.js项目做贡献的旅程
- Python多进程与进程锁的基本使用
- CSS:当子元素皆浮动,撑开父元素的3种方式
- java 接口工程_Java工程师(15)抽象类与接口
- java培训有哪些收费标准
- 中国研制量子计算机成功,中国宣布研发量子计算机,这次很可能真的要领先世界!速度太快!...
- 使用wsimport生成本地调用代码
- bzoj3467: Crash和陶陶的游戏
- Mac原生Terminal快速登录ssh