题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698
线段树,整段更新,有些细节注意
贴代码
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100005;
int tree[maxn*10];
int Q,n,m;
void build(int root,int L,int R){
if (L==R)tree[root]=1;
else {
int mid=(L+R)/2;
build(root*2,L,mid);
build(root*2+1,mid+1,R);
tree[root]=1;
}
}
int query(int root,int L,int R,int l,int r){
if((R<l)||(r<L))return 0;
if((l<=L)&&(R<=r)){
if (tree[root]!=0)return tree[root]*(R-L+1);
else{
int mid=(L+R)>>1;
if (tree[root]!=0)tree[root*2]=tree[root*2+1]=tree[root];
return query(root*2,L,mid,l,r)+query(root*2+1,mid+1,R,l,r);
}
}
int mid=(L+R)>>1;
if (tree[root]!=0)tree[root*2]=tree[root*2+1]=tree[root];
return query(root*2,L,mid,l,r)+query(root*2+1,mid+1,R,l,r);
}
void add(int root,int L,int R,int l,int r,int delta){
if((R<l)||(r<L))return;
if((l<=L)&&(R<=r)){
tree[root]=delta;
return;
}
int mid=(L+R)>>1;
if (tree[root]!=0)tree[root*2]=tree[root*2+1]=tree[root];
add(root*2,L,mid,l,r,delta);
add(root*2+1,mid+1,R,l,r,delta);
if (tree[root*2]==tree[root*2+1])tree[root]=tree[root*2+1];
else tree[root]=0;
}
int main(){
// freopen("1968.in","r",stdin);
// freopen("1968.out","w",stdout);
scanf("%d",&Q);
int tt=0;
while (Q--){
tt++;
scanf("%d",&n);
build(1,1,n);
scanf("%d",&m);
while (m--){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if (tree[1]!=0)tree[2]=tree[3]=tree[1];
add(1,1,n,x,y,z);
}//for (int i=1;i<=n;i++)printf("%d\n",query(1,1,n,i,i));
printf("Case %d: The total value of the hook is %d.\n",tt,query(1,1,n,1,n));
}
return 0;
}
【写的有漏洞的,欢迎路过大神吐槽】
2017/07/12 20:31:29
Ending.