/*
zoj_1610 模拟
线段树的典型题,不过好久没碰线段树了。发现数据才8000试了下模拟,果然
没有TLE。
*/
#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#include <algorithm>
#define N 8010
using namespace std;
struct segment
{
int l,r,v;
segment( int a,int b,int c ):l(a),r(b),v(c) {}
};
vector <segment>s;
int num[N];
bool cmp( segment a,segment b )
{
if( a.v==b.v ) return a.l<b.l;
return a.v<b.v;
}
int main()
{
int n,i,j,a,b,v;
while( ~scanf( "%d",&n ) )
{
memset( num,0,sizeof(num) );
for( i=0;i<n;i++ )
{
scanf( "%d%d%d",&a,&b,&v );
for( j=0;j<s.size();j++ )
{
if( s[j].v==-1 ) continue;
if( b<=s[j].l || a>=s[j].r )
continue;
if( a<=s[j].l && b>=s[j].r )
s[j].v=-1;
else if( a<=s[j].l && b<s[j].r )
s[j].l=b;
else if( b>=s[j].r && a>s[j].l )
s[j].r=a;
else if( a>s[j].l && b<s[j].r )
{
s.push_back( segment(b,s[j].r,s[j].v) );
s[j].r=a;
}
}
s.push_back( segment(a,b,v) );
}
sort( s.begin(),s.end(),cmp );
for( i=0;i<s.size()-1;i++ ) //合并相同颜色线段
if( s[i].r==s[i+1].l && s[i].v==s[i+1].v )
s[i].v=-1;
for( i=0;i<s.size();i++ )
if( s[i].v!=-1 )
num[ s[i].v ]++;
for( i=0;i<N;i++ )
if( num[i]>=1 )
printf( "%d %d\n",i,num[i] );
printf( "\n" );
s.clear();
}
return 0;
}
zoj 1610 Count the Colors
最新推荐文章于 2020-04-22 09:17:04 发布