1 10 2 1 5 2 5 9 3
Case 1: The total value of the hook is 24.
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,(rt<<1)|1
#define root 1,n,1
#define mid (l+r)>>1
#define LL long long
const int MX = 100000 + 10;
int k;
LL add[MX*4];
LL sum[MX*4];
void pushup(int rt) {
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt) {
add[rt]=0;
if(l==r) {
//scanf("%lld",&sum[rt]);
sum[rt]=1;
return ;
}
int m=mid;
build(lson);
build(rson);
pushup(rt);
}
void pushdown(int rt,int m) {
if(add[rt]) {
add[rt<<1]=add[rt];
add[rt<<1|1]=add[rt];
sum[rt<<1]=add[rt]*(m-(m>>1));
sum[rt<<1|1]=add[rt]*(m>>1);
add[rt]=0;
}
}
void update(int L,int R,LL c,int l,int r,int rt) {
if(L<=l && r<=R) {
add[rt]=c;
sum[rt]=c*(r-l+1);
return ;
}
pushdown(rt,r-l+1);
int m=mid;
if(L<=m)update(L,R,c,lson);
if(R>m) update(L,R,c,rson);
pushup(rt);
}
LL query(int L,int R,int l,int r,int rt) {
if(L<=l && r<=R)
return sum[rt];
pushdown(rt,r-l+1);
int m=mid;
LL ret=0;
if(L<=m)ret+=query(L,R,lson);
if(R>m) ret+=query(L,R,rson);
return ret;
}
int main() {
int t,n,q,x,y,z,cas=1;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&q);
build(root);
while(q--) {
scanf("%d%d%d",&x,&y,&z);
update(x,y,z,root);
}
printf("Case %d: The total value of the hook is %lld.\n",cas++,query(1,n,root));
}
return 0;
}
#include <cstdio>
const int MX = 100000+10;
int num[MX][3];
int main() {
int t,q,n,sum,val,cas=1;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&q);
for(int j=1; j<=q; j++)
scanf("%d%d%d",&num[j][0],&num[j][1],&num[j][2]);
sum=0;
for(int k=1; k<=n; k++) {
val=1;
for(int j=q; j>=1; j--)
if(num[j][0]<=k && k<=num[j][1]) { //寻找k所在的更新区间,若存在则更新,不存在v=1不变
val=num[j][2]; //若找的最后面的更新区间,则停止,因为前面的会被覆盖
break;
}
sum+=val;
}
printf("Case %d: The total value of the hook is %d.\n",cas++,sum);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/zhang_xueping/article/details/48002335