标签:des style blog class code java
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
hdu 1698:Just a Hook(线段树,区间更新),布布扣,bubuko.com
hdu 1698:Just a Hook(线段树,区间更新)
标签:des style blog class code java
原文地址:http://www.cnblogs.com/yym2013/p/3704414.html