区段更新,整体求和:
View Code
Problem : 1698 ( Just a Hook ) Judge Status : Accepted
RunId : 11289995 Language : G++ Author : lihaozhuzhuxia Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta #include <iostream> #include <cstdio> #include <cstring> using namespace std; struct p { int l; int r; int c; }tree[444444]; void construct(int n,int l,int r) { int i,j,k,m; int mid=(l+r)/2; tree[n].l=l; tree[n].r=r; tree[n].c=1; if(l==r) { return ; } construct(n*2,l,mid); construct(n*2+1,mid+1,r); } void change(int n,int l,int r,int c) { int i,j,k,m; if(tree[n].l==l&&tree[n].r==r) { tree[n].c=c; return ; } int mid=(tree[n].l+tree[n].r)/2; if(tree[n].c!=-1) { tree[n*2].c=tree[2*n+1].c=tree[n].c; tree[n].c=-1; } if(r<=mid) { change(n*2,l,r,c); } else if(l>mid) { change(n*2+1,l,r,c); } else { change(n*2,l,mid,c); change(n*2+1,mid+1,r,c); } } int query(int n,int l,int r) { if(tree[n].l==l&&tree[n].r==r) { if(tree[n].c!=-1) return (r-l+1)*tree[n].c; else { int mid=(tree[n].l+tree[n].r)/2; return query(n*2,l,mid)+query(n*2+1,mid+1,r); } } int mid=(tree[n].l+tree[n].r)/2; if(r<=mid) return query(n*2,l,r); else if(l>mid) return query(n*2+1,l,r); else return query(n*2,l,mid)+query(n*2+1,mid+1,r); } int main() { int i,j,k,l,m,n,r; int t; int o=0; scanf("%d",&t); while(t--) { o++; scanf("%d%d",&n,&m); construct(1,1,n); for(i=0;i<m;i++) { scanf("%d%d%d",&l,&r,&k); change(1,l,r,k); } printf("Case %d: The total value of the hook is %d.\n",o,query(1,1,n)); } } |