poj2777(线段树)

来源:互联网 发布:java中的集合框架 编辑:程序博客网 时间:2024/05/15 17:42
#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#define For(i,j,k) for(i=j;i<=k;++i)struct node{int l,r,s;}a[500000];int len,n,m,l,r,col,flag[40],sum;char c;void build(int t,int ll,int rr){a[t].l=ll;a[t].r=rr;a[t].s=1;if (ll==rr) return ;build(t*2,ll,(ll+rr)/2);build(t*2+1,(ll+rr)/2+1,rr);}int xg(int t){int mid;if (a[t].r<l||a[t].l>r) return a[t].s;if (a[t].l>=l&&a[t].r<=r) {a[t].s=col;return col;}mid=(l+r)/2;int x1=-2,x2=-2,tt;if (a[t].s!=-1) {a[t*2].s=a[t].s;a[t*2+1].s=a[t].s;}/*if (a[t].l<=mid&&a[t].mid>=l)*/x1=xg(t*2);/*if (a[t].(mid+1)<=r&&a[t].r>=(mid+1))*/x2=xg(t*2+1);if (x1==x2&&x1!=-1) {a[t].s=x1;return x1;}a[t].s=-1;return -1;}void cx(int t){if (a[t].r<l||a[t].l>r) return ;if (a[t].s==-1) {cx(t*2);cx(t*2+1);} else {flag[a[t].s]=1;}}int main(){//freopen("in.txt","r",stdin);int i,j;while (scanf("%d%d%d",&len,&n,&m)!=EOF) {build(1,1,len);For(i,1,m) {c=getchar();c=getchar();//For(j,1,17) printf("%d %d %d\n",a[j].l,a[j].r,a[j].s);//puts("");if (c=='C') {scanf("%d%d%d",&l,&r,&col);xg(1);} else {scanf("%d%d",&l,&r);memset(flag,0,sizeof(flag));cx(1);sum=0;For(j,0,n) sum+=flag[j];printf("%d\n",sum);}}}return 0;}

1 0
原创粉丝点击