1、给了每条线段的颜色,存在颜色覆盖,求表面上能够看到的颜色种类以及每种颜色的段数。

2、线段树区间更新,单点查询。

但是有点细节,比如:

输入:

2

0 1 1

2 3 1

输出:

1 2

这种情况如果不处理,那么由于是检查点的颜色,会检查到0,1,2,3的颜色都为1,认为是一段连续的,就会输出 1 1

需要处理一下,代码中把所有的左端点都+1,避免了这种情况,比较巧妙。

3、

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; #define L(root) ((root) << 1)
#define R(root) (((root) << 1) + 1) const int MAXN = ; struct st
{
// 区间范围
int left, right;
int flag;//-1没有颜色
} st[MAXN * ];
int color[MAXN];//每种颜色看到的段数
// 建树代码基本不变
void build(int root, int l, int r)
{
st[root].left = l, st[root].right = r, st[root].flag = -;
if (l == r)
{
return;
} int m = l + ((r - l) >> );
build(L(root), l, m);
build(R(root), m + , r);
} int query(int root, int x)//单点查询
{
if (st[root].left == st[root].right)
{
return st[root].flag;
} // 否则需将当前区间的“缓冲”值更新下去并修正各节点区间的总和
if (st[root].flag!=-)
{
st[L(root)].flag = st[root].flag;
st[R(root)].flag = st[root].flag;
st[root].flag = -;
} int m = st[root].left + ((st[root].right - st[root].left) >> );
if (x <= m)
{
return query(L(root), x);
}
else
{
return query(R(root), x);
}
} void update(int root, int l, int r, int v)//区间更新
{
// 如变更区间恰等于节点区间,只修正当前节点区间即可
if (st[root].left == l && st[root].right == r)
{
st[root].flag = v;
return;
} // 否则需向下修正相关节点区间
if (st[root].flag!=-)
{
st[L(root)].flag = st[root].flag;
st[R(root)].flag = st[root].flag;
st[root].flag = -;
} int m = st[root].left + ((st[root].right - st[root].left) >> );
if (r <= m)
{
update(L(root), l, r, v);
}
else if (l > m)
{
update(R(root), l, r, v);
}
else
{
update(L(root), l, m, v);
update(R(root), m + , r, v);
}
} int main()
{
int n,i;
int x1,x2,c;
int lastColor;//记录上一个颜色
int nowColor;//当前颜色
while(~scanf("%d",&n)){
build(,,);
for(i=;i<=n;++i){
scanf("%d%d%d",&x1,&x2,&c);
update(,++x1,x2,c);//++x1表示缩掉前面一点,处理了0 1 1,2 3 1这种情况,而且还符合了左端点从1开始
}
memset(color,,sizeof(color));
lastColor=-;
for(i=;i<=;++i){
nowColor=query(,i);
if(nowColor==lastColor)
continue;
else if(nowColor!=-)
++color[nowColor];
lastColor=nowColor;
}
for(i=;i<=;++i)//颜色标号是0~8000
if(color[i])
printf("%d %d\n",i,color[i]);
printf("\n");
}
return ;
}

c2.这个没有用上面的左端点+1,但是在建树的时候是用的[0,1],[1,2],[2,3],类似这样的建树,比较刁

上面的建树是[0,1],[2,3],类似这样的,还是有点区别的。具体看代码吧。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=;
struct Node
{
int l,r;
int color;
}segTree[MAXN*];
int color[MAXN];
int temp;
void Build(int i,int l,int r)
{
segTree[i].l=l;
segTree[i].r=r;
segTree[i].color=-;//-1表示没有颜色
if(l+==r)return;
int mid=((l+r)>>);
Build(i<<,l,mid);
Build((i<<)|,mid,r);
}
void insert(int i,int l,int r,int c)
{
if(l==r)return;
if(segTree[i].color==c)return;
if(l<=segTree[i].l&&r>=segTree[i].r)
{
segTree[i].color=c;
return;
}
if(segTree[i].color>=)//存在颜色,往下更新
{
segTree[i<<].color=segTree[i].color;
segTree[(i<<)|].color=segTree[i].color;
segTree[i].color=-;//表示有多种颜色
}
int mid=((segTree[i].l+segTree[i].r)>>);
if(r<=mid) insert(i<<,l,r,c);
else if(l>=mid) insert((i<<)|,l,r,c);
else
{
insert(i<<,l,mid,c);
insert((i<<)|,mid,r,c);
}
segTree[i].color=-;
}
void Count(int i)//统计各颜色的段数
{
if(segTree[i].color==-)
{
temp=-;
return;
}
if(segTree[i].color!=-)
{
if(segTree[i].color!=temp)//temp存的是前一段的颜色
{
color[segTree[i].color]++;
temp=segTree[i].color;
}
return;
}
if(segTree[i].l+!=segTree[i].r)
{
Count(i<<);
Count((i<<)|);
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,a,b,c;
int Max;
while(scanf("%d",&n)!=EOF)
{
Build(,,);
Max=;
while(n--)
{
scanf("%d%d%d",&a,&b,&c);
insert(,a,b,c);
if(c>Max)Max=c;
}
temp=-;
memset(color,,sizeof(color));
Count();
for(int i=;i<=Max;i++)
{
if(color[i])printf("%d %d\n",i,color[i]);
}
printf("\n");
}
return ;
}

ZOJ - 1610 Count the Colors(线段树区间更新,单点查询)的更多相关文章

  1. ZOJ 1610 Count the Colors(线段树,区间覆盖,单点查询)

    Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting some colored segments on ...

  2. zoj 1610 Count the Colors 线段树区间更新/暴力

    Count the Colors Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...

  3. ZOJ 1610 Count the Color(线段树区间更新)

    描述Painting some colored segments on a line, some previously painted segments may be covered by some ...

  4. 【POJ 2777】 Count Color(线段树区间更新与查询)

    [POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4094 ...

  5. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  6. ZOJ 1610 Count the Colors【题意+线段树区间更新&&单点查询】

    任意门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Count the Colors Time Limit: 2 ...

  7. ZOJ 1610 Count the Colors (线段树成段更新)

    题意 : 给出 n 个染色操作,问你到最后区间上能看见的各个颜色所拥有的区间块有多少个 分析 : 使用线段树成段更新然后再暴力查询总区间的颜色信息即可,这里需要注意的是给区间染色,而不是给点染色,所以 ...

  8. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  9. ZOJ 1610.Count the Colors-线段树(区间染色、区间更新、单点查询)-有点小坑(染色片段)

    ZOJ Problem Set - 1610 Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting s ...

  10. ZOJ 5638——Prime Query——————【线段树区间更新,区间查询,单点更新】

    Prime Query Time Limit: 1 Second      Memory Limit: 196608 KB You are given a simple task. Given a s ...

随机推荐

  1. 一个可以获取知乎timeline的爬虫

    # -*- coding: utf-8 -*- import requests import lxml import os,time from bs4 import BeautifulSoup as ...

  2. css装饰文本框input

    在web程序前端页面中,<input>恐怕是用的最多的html元素了,各个需要录入信息的场合都会用到它,一般都会用css来修饰一下使得它更好看. 原始的不加修饰的文本框像下面,有些单调,页 ...

  3. [APIO2012] 派遣 dispatching

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4580  Solved: 2348 Description 在一个忍者的帮派里,一些忍者们被选中派遣给 ...

  4. Bootstrap3 为何无法显示Glyphicons 图标

    Bootstrap3 为何无法显示Glyphicons 图标 在CSS引入字体即可解决 @font-face { font-family: 'Glyphicons Halflings'; src: u ...

  5. python学习之-- RabbitMQ 消息队列

    记录:异步网络框架:twisted学习参考:www.cnblogs.com/alex3714/articles/5248247.html RabbitMQ 模块 <消息队列> 先说明:py ...

  6. 从零开始写STL - 智能指针

    从零开始写STL - 智能指针 智能指针的分类及其特点: scoped_ptr:初始化获得资源控制权,在作用域结束释放资源 shared_ptr: 引用计数来控制共享资源,最后一个资源的引用被释放的时 ...

  7. python 爬虫(转,我使用的python3)

      原文地址:http://blog.csdn.net/pi9nc/article/details/9734437 [Python]网络爬虫(一):抓取网页的含义和URL基本构成 分类: 爬虫 Pyt ...

  8. css三大布局

    标准流: 从左到右,从上到下块级元素独占一行,行内元素碰到父盒子边缘换行 浮动: 特点 1 元素浮动之后不占据原来的位置(脱标),变成立体,下面可以有东西,只影响下面的 2 浮动的盒子在一行上显示 3 ...

  9. Go和HTTPS(TLS)

    原文链接: http://studygolang.com/wr?u=http%3a%2f%2ftonybai.com%2f2015%2f04%2f30%2fgo-and-https%2f 近期在构思一 ...

  10. HNU 12834 Thread Tree

    递归输出即可了 #include<bits/stdc++.h> using namespace std; struct tree{     int dot;     string s; } ...