hdu 1698 线段树 一段更新染色
其中的标志s用的很妙,非常精髓,标记是否是纯色,单色,是否往下递归,计算单色数据
#include <iostream> #include <cstdio> using namespace std; const int MAXN=2000000; int n,m,a[MAXN+5],ans; struct tree { int l,r; int s; }trees[MAXN*2]; int max(int k,int l) { return k>l?k:l; } void buildtree(int rs,int l,int r) { //printf("%d %d %d\n",rs,l,r); trees[rs].l=l; trees[rs].r=r; trees[rs].s=1; if(r==l) return; int mid=(l+r)/2; buildtree(rs*2,l,mid); buildtree(rs*2+1,mid+1,r); } void update(int rs,int l,int r,int u) { if(trees[rs].l>r||trees[rs].r<l) return ; //printf("%d %d %d %d %d\n",rs,k,l,trees[rs].l,trees[rs].r); if(trees[rs].l>=l&&trees[rs].r<=r) { trees[rs].s=u; return ; } if(trees[rs].s!=-1) { trees[2*rs].s=trees[rs].s; trees[2*rs+1].s=trees[rs].s; trees[rs].s=-1; } update(rs*2,l,r,u); update(rs*2+1,l,r,u); } void querry(int rs) { if(trees[rs].s!=-1) { ans+=(trees[rs].r-trees[rs].l+1)*trees[rs].s; return ; } if(trees[rs].l==trees[rs].r) return ; querry(2*rs); querry(2*rs+1); } int main() { int i,ac,bc,t,p; int c; scanf("%d",&t); p=1; while(t--) { scanf("%d%d",&n,&m); buildtree(1,1,n); for(i=1;i<=m;i++) { scanf("%d%d%d",&c,&ac,&bc); update(1,c,ac,bc); } ans=0; querry(1); printf("Case %d: The total value of the hook is %d.\n",p++,ans); } return 0; }