Count the Colors

原创 2015年07月08日 20:24:46
B - Count the Colors
Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu

Description

Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent ones.

Your task is counting the segments of different colors you can see at last.


Input



The first line of each data set contains exactly one integer n, 1 <= n <= 8000, equal to the number of colored segments.

Each of the following n lines consists of exactly 3 nonnegative integers separated by single spaces:

x1 x2 c

x1 and x2 indicate the left endpoint and right endpoint of the segment, c indicates the color of the segment.

All the numbers are in the range [0, 8000], and they are all integers.

Input may contain several data set, process to the end of file.


Output



Each line of the output should contain a color index that can be seen from the top, following the count of the segments of this color, they should be printed according to the color index.

If some color can't be seen, you shouldn't print it.

Print a blank line after every dataset.


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


/*
Author: 2486
Memory: 232 KB		Time: 110 MS
Language: C++ (g++ 4.7.2)		Result: Accepted
*/
//暴力可过,或者是线段树
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long ll;
using namespace std;
const int maxn=8000+5;
int n,a,b,c,ans[maxn],col[maxn];
int main() {
    while(~scanf("%d",&n)) {
        memset(ans,0,sizeof(ans));
        memset(col,0,sizeof(col));
        int Max=0;
        for(int i=0; i<n; i++) {
            scanf("%d%d%d",&a,&b,&c);
            for(int j=a; j<b; j++) {
                col[j]=c+1;
            }
            Max=max(Max,b);
        }
        for(int i=0; i<=Max; i++) {
            while(i!=0&&col[i]&&col[i]==col[i-1]) {
                i++;
            }
            if(col[i]) {
                ans[col[i]-1]++;
            }
        }
        for(int i=0; i<=8001; i++) {
            if(ans[i]) {
                printf("%d %d\n",i,ans[i]);
            }
        }
        printf("\n");
    }
}
/*
Author: 2486
Memory: 356 KB		Time: 20 MS
Language: C++ (g++ 4.7.2)		Result: Accepted
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=8000+5;
int sum[maxn],col[maxn<<2],res[maxn];
int n,x1,x2,c;
void pushup(int rt) {}
void pushdown(int rt,int l,int r) {
    if(col[rt]!=-1) {
        col[rt<<1]=col[rt<<1|1]=col[rt];//直接往下递归就可以了,不用管其他
        col[rt]=-1;
    }
}
void build(int rt,int l,int r) {
    col[rt]=-1;
    if(l==r)return;
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
}
void update(int L,int R,int c,int rt,int l,int r) {
    if(L<=l&&r<=R) {
        col[rt]=c;
        return;
    }
    pushdown(rt,l,r);
    int mid=(l+r)>>1;
    if(L<=mid)update(L,R,c,rt<<1,l,mid);
    if(mid<R)update(L,R,c,rt<<1|1,mid+1,r);
    pushup(rt);
}
void query(int L,int R,int rt,int l,int  r) {
    if(l==r) {
        sum[l]=col[rt];//赋值,放回区间的位子颜色
        return;
    }
    pushdown(rt,l,r);
    int mid=(l+r)>>1;
    if(L<=mid)query(L,R,rt<<1,l,mid);
    if(mid<R)query(L,R,rt<<1|1,mid+1,r);
    pushup(rt);
}
int main() {
    while(~scanf("%d",&n)) {
        memset(sum,-1,sizeof(sum));
        memset(res,0,sizeof(res));
        build(1,0,maxn-1);
        for(int i=0; i<n; i++) {
            scanf("%d%d%d",&x1,&x2,&c);
            if(x1==x2)continue;
            update(x1,x2-1,c,1,0,maxn-1);
        }
        query(0,maxn-1,1,0,maxn-1);//将所有数据都更新到底部
        for(int i=0; i<maxn; i++) {
            while(i!=0&&sum[i]!=-1&&sum[i]==sum[i-1])//如果没有颜色就加一,如果与之前相等那么也是加一
                i++;
            res[sum[i]]++;
        }
        for(int i=0; i<maxn; i++)if(res[i])printf("%d %d\n",i,res[i]);
        printf("\n");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Gym 100935F A Poet Computer (字典树)

F - A Poet Computer Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d &am...

X-NUCA(牛咖)联赛9月pwn专题赛赛前--ROP

解题基本思路 构造栈溢出,然后通过printfprintf函数泄露地址,通过libc−databaselibc-database确定libclibc的版本,找出相应的偏移地址,确定"bin/sh""b...

SOJ 4438 Censor(KMP匹配)

C - Censor Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit&#...

各种排序算法的稳定性和时间复杂度小结

None

Period UVALive - 3026(KMP)

Period(传送门) 题意 给定字符串,找到每个前缀的最大循环节的个数,即循环周期,如果大于1的话就输出下标和周期数(循环节) 解题思路 KMP就可以非常轻松的解决问题,首先提到一个next...

小白天堂之编写词法语法分析器何其简单(一)

写小白天堂系列的文章算是从这一篇开始吧,但是写这个词法语法分析器实在是因为编译原理老师扣啊,哎,没办法,只能直接写代码,当时正好将Javascript的语法基本撸了一边,所以就决定写一个JS的词法语法...

Opera应用基础知识

关于 Opera 软件公司Opera 开始于 1994 年, 最初作为挪威最大电信公司 Telenor 的一个研究项目。不到一年时间, 它发展成为独立的开发公司,称为 Opera Software A...

[Virtual Judge]ZOJ1610:Count the Colors

===========================================题目大意=========================================== 在一条直线上给...

ZOJ 1610 Count the Colors

看完线段树本来打算找这道基础题练手,但是悲惨的砸进去2个半小时。 本来打算写个线段树的总结,看来也没时间了。 改了七次才AC,ZOJ又狂抽风。泪奔。 最BT的是最后一次犯错的代码竟然是TLE掉,...

Count the Colors(线段树之区间成段更新)

萌萌哒的传送门 这道题目是线段树区间成段更新的应用,我们只需在建立线段树时从原来的左右儿子不相连,改为相连即可以解决此类问题. 如从原来的[l,mid] , [mid + 1,r] 改为 [l...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)