题目链接:Problem - 1698 (hdu.edu.cn)
答题思路:
线段树区间修改的基础题,根据题意,所有初值为铜钩,价值都是1;直接将所需要的区间的价值更改为相应的钩子价值。最后求的是所有价值,所以不用再进行查询操作,直接输出根节点的值,即为所求。
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
int a[N],t,n,m,x,y,z;
struct node{
int l, r;
int sum,lazy;
}tree[N*4];
void pushup(int i){
tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
void pushdown(int i){
if(tree[i].lazy){
tree[i*2].sum=(tree[i*2].r-tree[i*2].l+1)*tree[i].lazy;
tree[i*2+1].sum=(tree[i*2+1].r-tree[i*2+1].l+1)*tree[i].lazy;
tree[i*2].lazy=tree[i].lazy;
tree[i*2+1].lazy=tree[i].lazy;
tree[i].lazy=0;
}
}
void build(int i,int l,int r){
tree[i].l=l;tree[i].r=r;
tree[i].lazy=0;
if(l==r){
tree[i].sum=a[l];
return ;
}
int mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
pushup(i);
}
void add(int i,int l,int r,int k){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].sum=(tree[i].r-tree[i].l+1)*k;
tree[i].lazy=k;
return ;
}
pushdown(i);
int mid=(tree[i].l+tree[i].r)/2;
if(l<=mid){
add(i*2,l,r,k);
}
if(r>mid){
add(i*2+1,l,r,k);
}
pushup(i);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
for(int j=1;j<=t;j++){
cin>>n;
for(int i=1;i<=n;i++){
a[i]=1;
}
build(1,1,n);
cin>>m;
while(m--){
cin>>x>>y>>z;
add(1,x,y,z);
}
cout<<"Case "<<j<<": The total value of the hook is "<<tree[1].sum<<"."<<endl;
}
return 0;
}