题目地址 : http://acm.hdu.edu.cn/showproblem.php?pid=1698
线段树入门题。。。
近期重新写了一遍,就放了上来。
#include<iostream>
#include<cstdio>
#define ll (v<<1)
#define rr (v<<1|1)
#define mmid ((r+l)>>1)
using namespace std;
const int maxn=100001;
int num[maxn<<2];
int n;
int x,y,z;
void make_tree(int l,int r,int v){
num[v]=1;
if(l==r) return ;
make_tree(l,mmid,ll);
make_tree(mmid+1,r,rr);
}
void update(int l,int r,int v){
if(x>r || y<l) return;
if(x<=l && r<=y){
num[v]=z;
return ;
}
if(num[v]!=-1){
num[ll]=num[rr]=num[v];
num[v]=-1;
}
update(mmid+1,r,rr);
update(l,mmid,ll);
}
int query(int l,int r,int v){
if(num[v]!=-1){
return num[v]*(r-l+1);
}
return query(l,mmid,ll)+query(mmid+1,r,rr);
}
int main(){
int t,tt,i,m;
scanf("%d",&t);
for(tt=1;tt<=t;tt++){
scanf("%d",&n);
scanf("%d",&m);
make_tree(1,n,1);
while(m--){
scanf("%d%d%d",&x,&y,&z);
update(1,n,1);
}
printf("Case %d: The total value of the hook is %d.\n",tt,query(1,n,1));
}
return 0;
}