有一块很长的画布,现在想在这块画布上画一些颜色,不过后面画的颜色会把前面画的颜色覆盖掉,现在想知道画完后这块画布的颜色分布,比如 1号颜色有几块,2号颜色有几块。。。。
***********************************************************************
分析:基本上跟帖海报是一样的,不过最后要求输出的是这种颜色的画有几块,可以按照贴海报的方式先做出来,然后对每个点进行查询,不晓得复杂度会不会太高。不过还是先试一下吧。
注意:如果出现 
Segmentation Fault
可以看看是不是树建的小了,不能拿N建树
#include<stdio.h>
#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(区间覆盖)相关推荐

  1. Count the Colors ZOJ - 1610

    GO 题意:给一个区间,有n次染色操作,每次将[x1, x2]染为c,求最后每种颜色各有多少线段可以看到. #include<cstdio> #include<iostream> ...

  2. ZOJ 1610 Count the Colors (线段树区间更新)

    题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...

  3. ZOJ 1610 Count the Colors

    段树:延迟标志+暴力更新 我记得刚学段树做的时候这个话题WA一个版本.....如今,每分钟获得.... Count the Colors Time Limit: 2 Seconds      Memo ...

  4. *【UVA - 10382】Watering Grass(贪心,区间覆盖问题,思维)

    题干: 题目大意: 有一块草坪,长为l,宽为w,在它的水平中心线上有n个位置可以安装喷水装置,各个位置上的喷水装置的覆盖范围为以它们自己的半径ri为圆.求出最少需要的喷水装置个数,如果无论如何都不能覆 ...

  5. 区间覆盖全部类型及部分精选习题汇总详解(贪心策略)

    内容如下: 1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2, ...

  6. BZOJ2298: [HAOI2011]problem a(带权区间覆盖DP)

    Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1747  Solved: 876 [Submit][Status][Discuss] Descrip ...

  7. HDU - 3974 Assign the task (DFS建树+区间覆盖+单点查询)

    题意:一共有n名员工, n-1条关系, 每次给一个人分配任务的时候,(如果他有)给他的所有下属也分配这个任务, 下属的下属也算自己的下属, 每次查询的时候都输出这个人最新的任务(如果他有), 没有就输 ...

  8. UVA10020(最小区间覆盖)

    题意:       给你一个区间[0,m]和一些小的区间[l,r]让你选择最少的小区间个数去把整个区间覆盖起来. 思路:       算是比较经典的贪心题目吧(经典于难度没什么对应关系),大体思路可以 ...

  9. 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...

    HDU 5861 题意 在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放.现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道 ...

最新文章

  1. R语言构建logistic回归模型并评估模型:模型预测结果抽样、可视化模型分类预测的概率分布情况、使用WVPlots包绘制ROC曲线并计算AUC值
  2. Hadoop系列之六:分布式文件系统HDFS
  3. Spring boot自动配置使用
  4. 软件项目管理0724:见供应商的体会
  5. redis入门demo
  6. 关于NavigateUrl中绑定Eval()方法时出现服务器标记的格式不正确的解决方法
  7. java实现商品的分类_Spring 商品分类
  8. win10专业版安装后没有wifi
  9. docker安装zabbix怎样修改图标和登录页文字
  10. cad墙线打断lisp_cad相切命令(cad相交线自动打断)
  11. 转:firefox os 框架解析
  12. 统计假设测验------(四)方差分析(F测验、多重比较原理与方法)
  13. windows的注册表有什么用?
  14. C语言 -指针 与解引用*
  15. c# 实现WebSocket
  16. SpringBoot获取微信openid(java)
  17. 今日科技联播:蚂蚁金服回应支付宝法人变更,子弹短信总激活用户超过400万...
  18. QQ音乐PB级ClickHouse实时数据平台架构演进之路
  19. AI(1)认知 人工智能、机器学习、神经网络、深度学习。
  20. wi-fi_Google语音正在测试Wi-Fi呼叫,无需呼叫转移

热门文章

  1. Python基础15-函数闭包与装饰器
  2. node.js是开源的吗_为开源做贡献并不难:我为Node.js项目做贡献的旅程
  3. Python多进程与进程锁的基本使用
  4. CSS:当子元素皆浮动,撑开父元素的3种方式
  5. java 接口工程_Java工程师(15)抽象类与接口
  6. java培训有哪些收费标准
  7. 中国研制量子计算机成功,中国宣布研发量子计算机,这次很可能真的要领先世界!速度太快!...
  8. 使用wsimport生成本地调用代码
  9. bzoj3467: Crash和陶陶的游戏
  10. Mac原生Terminal快速登录ssh