码迷,mamicode.com
首页 > 其他好文 > 详细

zoj 1610 Count the Colors

时间:2015-07-29 21:22:34      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:zoj   线段树   

题意

给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("");
    }
}

版权声明:都是兄弟,请随意转载,请注明兄弟是谁

zoj 1610 Count the Colors

标签:zoj   线段树   

原文地址:http://blog.csdn.net/u013076044/article/details/47133435

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!