给0-8000区间染色,最后有多少个颜色区间,并且出现了多少次
线段树成段更新
注意点:
就是
1-2 1
3-4 1
并不是连接在一起的是两段
所以我们可以在更新的时候使 l=l+1
这样就是两段了
代码 还是很简单的
/* **********************************************
Auther: 请叫我acm渣渣
Created Time: 2015-7-29 20:01:25
File Name : color.cpp
*********************************************** */
#include <iostream>
#include <fstream>
#include <cstring>
#include <climits>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <utility>
#include <sstream>
#include <complex>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <bitset>
#include <functional>
#include <algorithm>
using namespace std;
#define lson L,m,rt<<1
#define rson m+1,R,rt<<1|1
#define ll long long
#define N 11111
int color[N<<2];
int vis[N<<2];
int ans[N<<2];
void pushdown(int rt){
if(color[rt]!=-1){
color[rt<<1]=color[rt<<1|1]=color[rt];
color[rt]=-1;
}
}
void update(int L,int R,int rt,int l,int r, int c){
if(l<=L&&r>=R){
color[rt]=c;
return;
}
pushdown(rt);
int m = (L+R)>>1;
if(l<=m) update(lson,l,r,c);
if(r>m) update(rson,l,r,c);
}
void query(int L,int R,int rt){
if(color[rt]!=-1){
for(int i = L;i<=R;i++){
vis[i]=color[rt];
}
return ;
}
if(L==R) return;
int m = (L+R)>>1;
query(lson);
query(rson);
}
int main(){
int n;
int o = 8000;
while(scanf("%d",&n)==1){
memset(vis,-1,sizeof(vis));
memset(color,-1,sizeof(color));
memset(ans,0,sizeof(ans));
int mx = -1;
for(int i=1;i<=n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a>=b) continue;
mx = max(c,mx);
update(1,o,1,a+1,b,c);
}
query(1,o,1);
for(int i=1;i<=o;i++){
if(vis[i]==-1) continue;
int h = i;
int c = vis[i];
while(vis[h]==c) h++;
ans[c]++;
i=h-1;
}
for(int i=0;i<=mx;i++){
if(ans[i]){
printf("%d %d\n",i,ans[i]);
}
}
puts("");
}
}
版权声明:都是兄弟,请随意转载,请注明兄弟是谁
原文地址:http://blog.csdn.net/u013076044/article/details/47133435