ZOJ 1610

来源:互联网 发布:nginx 多tomcat配置 编辑:程序博客网 时间:2024/06/05 17:19
#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <vector>#include <queue>#include <stack>using namespace std;const int MAXN = 8000 + 10;struct Tree{    int l, r;    int val;}tree[MAXN<<2];int color[MAXN];void build(int l, int r,int rt){    tree[rt].l = l;    tree[rt].r = r;    tree[rt].val = -1;    if(l == r) return ;    int m = (l + r) >> 1;    build(l, m, rt<<1);    build(m + 1, r, rt<<1|1);}void update(int l, int r, int c, int rt){    if(tree[rt].l == l && tree[rt].r == r)    {        tree[rt].val = c;        return ;    }    if(tree[rt].val != -1)    {        tree[rt<<1].val = tree[rt].val;        tree[rt<<1|1].val = tree[rt].val;        tree[rt].val = -1;    }    int m = (tree[rt].l + tree[rt].r) >> 1;    if(r <= m) update(l, r, c, rt<<1);    else if(l > m) update(l, r, c, rt<<1|1);    else    {        update(l, m, c, rt<<1);        update(m + 1, r, c, rt<<1|1);    }}int ans[MAXN];void Query(int rt, int l, int r){    if(tree[rt].l == tree[rt].r)    {        ans[l] = tree[rt].val;        return ;    }    int m = (l + r) >> 1;    if(tree[rt].val != -1)    {        tree[rt<<1].val = tree[rt<<1|1].val = tree[rt].val;        tree[rt].val = -1;    }    Query(rt<<1, l, m);    Query(rt<<1|1, m + 1, r);}int main(){    int N;    while(scanf("%d", &N)!=EOF)    {        int l, r, val;        int M = 0;        build(1, 8001, 1);        for(int i=1;i<=N;i++)        {            scanf("%d%d%d", &l, &r, &val);            if(l > r) swap(l, r);            update(l+1, r, val, 1);            M = max(M, val);        }        memset(color, 0, sizeof(color));        memset(ans, -1, sizeof(ans));        Query(1, 1, 8001);        for(int i=1;i<=8001;i++)        {            if(ans[i] != -1 && ans[i] != ans[i-1])                color[ans[i]]++;        }        for(int i=0;i<=8001;i++) if(color[i])            printf("%d %d\n", i, color[i]);        printf("\n");    }    return 0;}

0 0