ZOJ 1610 Count the Colors(线段树lazy+暴力统计)
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.
Each of the following n lines consists of exactly 3 nonnegative integers separated by single spaces: 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.
If some color can't be seen,you shouldn't print it. Print a blank line after every dataset.
1 1 0 2
具体做法就是区间更新的时候lazy操作,端点统计的时候暴力,。 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
#include<bitset>
using namespace std;
#define REPF( i,a,b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i,n ) for ( int i = 0 ; i < n ; ++ i )
#define CLEAR( a,x ) memset ( a,x,sizeof a )
typedef long long LL;
typedef pair<int,int>pil;
const int maxn=8000+10;
int sum[maxn<<2];
int cnt,n;
int col[maxn],ans[maxn];
void pushdown(int rs)
{
if(sum[rs]!=⑴)
{
sum[rs<<1]=sum[rs<<1|1]=sum[rs];
sum[rs]=⑴;
}
}
void update(int x,int y,int c,int l,int r,int rs)
{
if(l>=x&&r<=y)
{
sum[rs]=c;
return ;
}
pushdown(rs);
int mid=(l+r)>>1;
if(x<=mid) update(x,y,c,l,mid,rs<<1);
if(y>mid) update(x,mid+1,r,rs<<1|1);
}
void solve(int l,int rs)
{
if(l==r)
{
col[cnt++]=sum[rs];
return ;
}
pushdown(rs);
int mid=(l+r)>>1;
solve(l,rs<<1);
solve(mid+1,rs<<1|1);
}
int main()
{
int l,x;
while(~scanf("%d",&n))
{
cnt=0;
CLEAR(sum,⑴);
CLEAR(ans,0);
int m=8000;
REP(i,n)
{
scanf("%d%d%d",&l,&r,&x);
update(l,r⑴,m,1);
}
solve(0,1);
REP(i,cnt)
{
int j=i+1;
if(col[i]!=⑴) ans[col[i]]++;
while(col[j]==col[i]&&j<cnt)
j++;
i=j⑴;
}
for(int i=0;i<=maxn;i++)//for色彩种类
if(ans[i]) printf("%d %d
",i,ans[i]);
puts("");
}
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |