到notonlysuccess.com刷线段树博客.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
#define SF scanf
#define PF printf
#define N 400009
using namespace std;
int tree[N];
int wat[N];
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
void pushup(int rt){
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void pushdn(int rt,int len){
if(wat[rt]){
wat[rt<<1] = wat[rt<<1|1] = wat[rt];
tree[rt<<1] = wat[rt]*(len-(len>>1));
tree[rt<<1|1] = wat[rt]*(len>>1);
wat[rt] = 0;
}
}
void build(int l,int r,int rt){
wat[rt] = 0;
if(l==r){
tree[rt] = 1;
return ;
}
int m = (l+r)>>1;
build(lson);build(rson);
pushup(rt);
}
void update(int L,int R,int val,int l,int r,int rt){
if(L<=l&&r<=R){
wat[rt] = val;
tree[rt] = val*(r-l+1);
return ;
}
pushdn(rt,r-l+1);
int m = (l+r)>>1;
if(L<=m) update(L,R,val,lson);
if(R>m) update(L,R,val,rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R) return tree[rt];
pushdn(rt,r-l+1);
int m = (l+r)>>1,ret = 0 ;
if(L<=m) ret+=query(L,R,lson);
if(R>m) ret+=query(L,R,rson);
return ret;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int q,cas,n,T=1;SF("%d",&cas);
while(cas--){
SF("%d",&n);
build(1,n,1);
SF("%d",&q);
int a,b,c;
while(q--){
SF("%d%d%d",&a,&b,&c);
update(a,b,c,1,n,1);
}
//for(int i=1;i<11;i++) cout<<query(i,i,1,n,1)<<" ";cout<<endl;
PF("Case %d: The total value of the hook is %d.\n",T++,query(1,n,1,n,1));
}
return 0;
}