poj 2777
线段树题。
代码:
#include<iostream> #include<fstream> using namespace std; struct e{ int l,r; int color; } tree[800001]; int n,m,t; int v[31]; void build(int s,int t,int p){ tree[p].l=s; tree[p].r=t; tree[p].color=1; if(t>s) { int mid=(s+t)>>1; build(s,mid,p*2); build(mid+1,t,p*2+1); } } void insert(int l,int r,int color,int p){ if(l==tree[p].l&&r==tree[p].r) { tree[p].color=color; return; } else { if(tree[p].color>0) { tree[2*p].color=tree[p].color; tree[2*p+1].color=tree[p].color; tree[p].color=0; } int mid=(tree[p].l+tree[p].r)>>1; if(r<=mid) insert(l,r,color,2*p); else if(l>mid) insert(l,r,color,2*p+1); else { insert(l,mid,color,2*p); insert(mid+1,r,color,2*p+1); } } } void find(int l,int r,int p){ int i,j,k; if(tree[p].color>0) { v[tree[p].color]=1; return; } int mid=(tree[p].l+tree[p].r)>>1; if(r<=mid) find(l,r,2*p); else if(l>mid) find(l,r,2*p+1); else { find(l,mid,2*p); find(mid+1,r,2*p+1); } } void read(){ // ifstream cin("in.txt"); int i,j,k,s,tmp; // cin>>n>>t>>m; scanf("%d%d%d",&n,&t,&m); build(1,n,1); char c; for(i=1;i<=m;i++) { cin>>c; // scanf("%c",&c); if(c=='C') { // cin>>j>>k>>s; scanf("%d%d%d",&j,&k,&s); if(j>k) { tmp=k; k=j; j=tmp; } insert(j,k,s,1); } else { // cin>>j>>k; scanf("%d%d",&j,&k); if(j>k) { tmp=k; k=j; j=tmp; } memset(v,0,sizeof(v)); find(j,k,1); j=0; for(k=1;k<=t;k++) if(v[k]) j++; cout<<j<<endl; } } } int main(){ read(); return 0; }