1. 程式人生 > >ZOJ--1610-Count the Colors

ZOJ--1610-Count the Colors

 

題目連結:ZOJ--1610-Count the Colors

要注意 更新區間的時候 如果是

1 3 1

1 2 2

3 4 3

這種情況的時候應該是三種顏色

要注意 0

 

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 80000
int a[maxn],b[maxn],c[maxn],mx;
int ll[maxn],rr[maxn],zz[maxn];
void init(){ memset(a,-1,sizeof(a)); memset(b,-1,sizeof(b)); memset(c,0,sizeof(c)); } void lazy(int in){ if(a[in]>=0){ a[in*2]=a[in]; a[in*2+1]=a[in]; a[in]=-1; } } void updata(int l,int r,int x,int y,int va,int in){ if(x<l||r<y) return ; if(l==x&&r==y){ a[
in]=va; return ; } lazy(in); int mid=(l+r)/2; if(x>mid){ updata(mid+1,r,x,y,va,in*2+1); }else if(y<=mid){ updata(l,mid,x,y,va,in*2); }else{ updata(l,mid,x,mid,va,in*2); updata(mid+1,r,mid+1,y,va,in*2+1); } //cout<<l<<endl; } int query(int
l,int r,int x,int in){ //cout<<"1222"<<endl; if(l==r){ return a[in]; } lazy(in); int mid=(l+r)/2; if(x>mid){ return query(mid+1,r,x,in*2+1); }else return query(l,mid,x,in*2); } int main(){ int n; while(cin>>n&&n){ init(); mx=-1; for(int j=0;j<n;j++){ cin>>ll[j]>>rr[j]>>zz[j]; mx=max(mx,rr[j]); if(mx>8000) mx=8000; rr[j]=min(8000,rr[j]); if(ll[j]+1>rr[j]){ rr[j]++; } //updata(1,mx,x+1,y+1,z,1); } mx=8000; for(int j=0;j<n;j++){ updata(1,mx,ll[j]+1,rr[j],zz[j],1); } //cout<<query(1,mx,434+1,1)<<endl; for(int j=1;j<=mx;j++){ b[j]=query(1,mx,j,1); //if(b[j]==0)cout<<j<<endl; } int l=1; while(l<=mx){ int z=b[l]; int j; if(z==-1){ l++; continue; } for(j=l;j<=mx;j++){ if(b[j]!=z) break; } l=j; c[z]++; } // cout<<c[1]<<endl; for(int j=0;j<=mx;j++){ if(c[j]){ cout<<j<<" "<<c[j]<<endl; } } cout<<endl; } return 0; }