/*
Count the Colors
区间覆盖
*/
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define lson (pos<<1)
#define rson (pos<<1|1)
const int maxn = 8888;
const int maxd = 8001;
int cover[maxn << 2];
int vis[maxn];
struct Line{
int l,r;
Line(int l,int r):l(l),r(r){};
friend bool operator < (Line p,Line q){
return p.l < q.l;
}
};
vector<Line>G[maxn];
void build(int l,int r,int pos){
cover[pos] = -1;
if(l == r) return;
int mid = (l + r) >> 1;
build(l,mid,lson);
build(mid + 1,r,rson);
}
void pushdown(int pos){
if(cover[pos] != -1){
cover[lson] = cover[rson] = cover[pos];
cover[pos] = -1;
}
}
void update(int L,int R,int l,int r,int pos,int d){
if(l <= L && R <= r){
cover[pos] = d;
return;
}
pushdown(pos);
int mid = (L + R) >> 1;
if(l <= mid)
update(L,mid,l,r,lson,d);
if(r > mid)
update(mid + 1,R,l,r,rson,d);
}
void query(int l,int r,int pos){
if(cover[pos] != -1){
G[cover[pos]].push_back(Line(l,r));
return;
}
if(l == r) return;
pushdown(pos);
int mid = (l + r) >> 1;
query(l,mid,lson);
query(mid + 1,r,rson);
}
int main(){
int n;
while(scanf("%d",&n) != EOF){
memset(vis,0,sizeof(vis));
for(int i = 0; i < maxd; i++) G[i].clear();
build(0,maxd,1);
for(int i = 0; i < n; i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
y --;
update(0,maxd,x,y,1,z);
}
query(0,maxd,1);
for(int i = 0; i < maxd; i++){
if(G[i].size() != 0){
printf("%d",i);
int cnt = 1;
for(int j = 1; j < G[i].size(); j++){
if(G[i][j].l != G[i][j - 1].r + 1) cnt ++;
}
printf(" %d\n",cnt);
}
}
puts("");
}
return 0;
}
ZOJ 1610
最新推荐文章于 2020-07-30 13:04:51 发布