码迷,mamicode.com
首页 > 其他好文 > 详细

【线段树】【HUD1166】【模板题】敌兵布阵

时间:2018-04-17 20:50:35      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:fine   技术   png   return   start   别人   node   std   +=   

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

技术分享图片

技术分享图片

 

线段树模板题(然而模板题也阻挡不住我不会的脚步···)

寒假的时候也只是简单入门,现在又给忘光了,一点都不会了,没办法,只能找一道模板题来参考别人代码写,然后改代码。(这个不是好习惯,只是我这也学更快一些,不适用所有人)

只有最简单的区间增减与区间查询

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 #define N 100001
 9 #define INF 0x7fffffff
10 
11 int num[N];
12 struct node 
13 {
14     int l,r;
15     int sum;
16     int mid()
17     {
18         return (l+r)/2;
19     }
20 }tree[N*4];
21 
22 void BuildTree(int root,int l,int r)
23 {
24     tree[root].l = l;
25     tree[root].r = r;
26     if(l == r)
27     {
28         tree[root].sum = num[l];
29         return ;
30     }
31     BuildTree(root*2,l,(l+r)/2);
32     BuildTree(root*2+1,(l+r)/2+1,r);
33     tree[root].sum = tree[root*2].sum+tree[root*2+1].sum;
34 }
35 
36 // root:根节点   i:修改的点   t:改变的值(正为增负为减)
37 void add(int root,int i,int t)
38 {
39     tree[root].sum += t;
40     if(tree[root].l == i && tree[root].r == i)
41         return ;
42     if(i <= tree[root].mid())
43         add(root*2,i,t);
44     else
45         add(root*2+1,i,t);
46 }
47 
48 // root:根节点    s:start    e:end
49 int query(int root,int s,int e)
50 {
51     if(tree[root].l == s && tree[root].r == e)
52         return tree[root].sum;
53     if(e <= tree[root].mid())
54         return query(root*2,s,e);
55     else
56         if(s > tree[root].mid())
57             return query(root*2+1,s,e);
58         else
59             return query(root*2,s,tree[root].mid())+query(root*2+1,tree[root].mid()+1,e);
60 }
61 
62 int main()
63 {
64     int ca = 1;
65     int T,n,i,k,t;
66     string s;
67     cin >>  T;
68     while(T--)
69     {
70         printf("Case %d:\n",ca++);
71         cin >> n;
72         for(i = 1;i <= n;i++)
73             scanf("%d",&num[i]);
74         BuildTree(1,1,n);
75         while(cin >> s)
76         {
77             if(s == "End")
78                 break;
79             scanf("%d %d",&k,&t);
80             if(s == "Add")
81                 add(1,k,t);
82             else
83             {
84                 if(s == "Sub")
85                     add(1,k,-t);
86                 else
87                     cout << query(1,k,t) << endl;
88             }
89         }
90     } 
91     return 0;
92 }

 

【线段树】【HUD1166】【模板题】敌兵布阵

标签:fine   技术   png   return   start   别人   node   std   +=   

原文地址:https://www.cnblogs.com/duny31030/p/8869709.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!