Zju1610 Count the Colors题解

Background

Special for beginners, ^_^

Description

画一些颜色段在一行上,一些较早的颜色就会被后来的颜色覆盖了。 你的任务就是要数出你随后能看到的不同颜色的段的数目。

Format

Input

每组测试数据第一行只有一个整数n, 1 <= n <= 8000,等于填色的次数

接下来的n行每行有三个非负整数,他们之间用一个空格分开。

x1 x2 c

x1和x2表示填色段最左边的点和最右边的点, c表示填进的颜色。

所有数字都是在[0..8000]这个范围里的整数。

输入有多组测试数据,最后以文件结束符为结束。

Output

输出的每一行都是最后能看到的颜色的数字,还有这种颜色的段数。

如果这种颜色最后不能见到,就不要打印出来。

每组数据后面跟一个空行。

Samples

输入数据 1

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 

输出数据 1

1 1 
2 1 
3 1 

1 1 

0 2 
1 1

Limitation

1s, 1024KiB for each test case.

思路

线段树。

代码见下

#include <bits/stdc++.h>
using namespace std;
long long n,x,y,c,f[10000005],f2[10000005],jk=0,jc=0;
int main(){
	while(cin>>n){
		for(int i=0;i<=80000;i++){
			f[i]=f2[i]=0;
		}		
		jk=0;
		jc=0;
		for(int i=1;i<=n;i++){
			cin>>x>>y>>c;
			x+=2;
			y++;
			c++;
			jk=max(jk,y);
			jc=max(jc,y);
			for(int j=x;j<=y;j++){
				f[j]=c;
			}
		}
		for(int i=1;i<=80000;i++){
			//cout<<f[i]<<" ";
			if(f[i]!=f[i-1]){
				f2[f[i]]++;
			}
		}
		for(int i=1;i<=80000;i++){
			if(f2[i]>=1){
				cout<<i-1<<" "<<f2[i]<<endl;
			}
		}
		cout<<endl;
	}
	return 0;
}

posted @ 2025-10-25 21:37  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源