ZOJ 1610 线段树区间染色

来源:互联网 发布:数据处理作图软件 编辑:程序博客网 时间:2024/05/18 12:39

给长度8000米的板,对其中区间染色,问最后能看到的颜色,和该颜色一共出现了几段

线段覆盖法


数据比较水   也可以暴力水过

线段树:

#include "stdio.h"#include "string.h"struct node{    int l,r,c;}data[40010];int color[8011];void build(int l,int r,int k){    int mid;    data[k].l=l;    data[k].r=r;    data[k].c=-1;    if (l==r) return ;    mid=(l+r)/2;    build(l,mid,k*2);    build(mid+1,r,k*2+1);}void updata(int l,int r,int k,int op){    int mid;    if (data[k].c==op) return ;    if (data[k].l==l && data[k].r==r)    {        data[k].c=op;        return ;    }    if (data[k].c!=-1)    {        data[k*2].c=data[k*2+1].c=data[k].c;        data[k].c=-1;    }    mid=(data[k].l+data[k].r)/2;    if (r<=mid) updata(l,r,k*2,op);    else        if (l>mid) updata(l,r,k*2+1,op);    else    {        updata(l,mid,k*2,op);        updata(mid+1,r,k*2+1,op);    }    if (data[k*2].c==data[k*2+1].c) data[k].c=data[k*2].c;    else data[k].c=-1;}void query(int k){    if (data[k].l==data[k].r)    {        color[data[k].l]=data[k].c;        return ;    }    if (data[k].c!=-1)        data[k*2].c=data[k*2+1].c=data[k].c;    query(k*2);    query(k*2+1);}int main(){    int n,l,r,c,m,now,i;    int sum[8011];    m=8010;    while (scanf("%d",&n)!=EOF)    {        build(0,m,1);        while (n--)        {            scanf("%d%d%d",&l,&r,&c);            r--;            updata(l,r,1,c);        }        memset(color,-1,sizeof(color));        query(1);        memset(sum,0,sizeof(sum));        now=color[0];        sum[now]++;        for (i=1;i<=m;i++)        if (color[i]!=now)        {            now=color[i];            sum[now]++;        }        for (i=0;i<=m;i++)            if (sum[i]!=0) printf("%d %d\n",i,sum[i]);        printf("\n");    }    return 0;}




0 0
原创粉丝点击