1 #include <stdio.h>
2 #define MAXSIZE 100000
3 struct Node{ 4 int left,right; 5 int n; 6 }; 7 Node a[MAXSIZE*3+1]; 8 void Init(Node a[],int L,int R,int d) //初始化线段树
9 { 10 if(L==R){ //当前节点没有儿子节点,即递归到叶子节点。递归出口
11 a[d].left = L; 12 a[d].right = R; 13 a[d].n = 1; 14 return ; 15 } 16
17 int mid = (L+R)/2; //初始化当前节点
18 a[d].left = L; 19 a[d].right = R; 20 a[d].n = 1; 21
22 Init(a,L,mid,d*2); //递归初始化当前节点的儿子节点
23 Init(a,mid+1,R,d*2+1); 24
25 } 26 void Update(Node a[],int L,int R,int d,int x) //对区间[L,R]插入值x,从节点d开始更新。
27 { 28 if(a[d].n==x) //颜色相符,直接返回
29 return ; 30 if(L==a[d].left && R==a[d].right){ //插入的区间匹配,则直接修改该区间值
31 a[d].n = x; 32 return ; 33 } 34 if(a[d].n!=-1){ //是纯色
35 a[2*d].n=a[2*d+1].n=a[d].n; 36 a[d].n=-1; 37 } 38 int mid = (a[d].left + a[d].right)/2; 39 if(R<=mid){ //中点在右边界R的右边,则应该插入到左儿子
40 Update(a,L,R,d*2,x); 41 } 42 else if(mid<L){ //中点在左边界L的左边,则应该插入到右儿子
43 Update(a,L,R,d*2+1,x); 44 } 45 else { //否则,中点在待插入区间的中间
46 Update(a,L,mid,d*2,x); 47 Update(a,mid+1,R,d*2+1,x); 48 } 49 } 50 int Query(Node a[],int L,int R,int d) //查询区间[L,R]的值,从节点d开始查询
51 { 52 if(a[d].n==-1) //杂色
53 return Query(a,L,R,2*d) + Query(a,L,R,2*d+1); 54 else
55 return (a[d].right - a[d].left + 1)*a[d].n; 56 } 57 int main() 58 { 59 int Case,i,T,n,q,A,B,x; 60 scanf("%d",&T); 61
62 for(Case=1;Case<=T;Case++){ 63 scanf("%d%d",&n,&q); 64
65 Init(a,1,n,1); //初始化 66
67 //for(i=1;i<=n;i++){ //输入 68 // Update(a,i,i,1,1); 69 //}
70
71 for(i=1;i<=q;i++){ 72 scanf("%d%d%d",&A,&B,&x); 73 Update(a,A,B,1,x); 74 } 75 printf("Case %d: The total value of the hook is %d.\n",Case,Query(a,1,n,1)); 76 } 77 return 0; 78 }
Freecode : www.cnblogs.com/yym2013