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;
}

浙公网安备 33010602011771号