博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树(单点更新)/树状数组 HDOJ 1166 敌兵布阵
阅读量:5152 次
发布时间:2019-06-13

本文共 3821 字,大约阅读时间需要 12 分钟。

 

1 /* 2     线段树基本功能:区间值的和,修改某个值 3 */ 4 #include 
5 #include
6 #define lson l, m, rt << 1 7 #define rson m+1, r, rt << 1|1 8 9 const int MAX_N = 50000 + 10;10 int sum[MAX_N<<2];11 12 void pushup(int rt) //杭电大牛:notOnlySuccess 版本13 {14 sum[rt] = sum[rt<<1] + sum[rt<<1|1];15 }16 17 void build(int l, int r, int rt)18 {19 if (l == r)20 {21 scanf ("%d", &sum[rt]);22 return ;23 }24 int m = (l + r) >> 1;25 build (lson);26 build (rson);27 pushup (rt);28 }29 30 void update(int p, int add, int l, int r, int rt)31 {32 if (l == r)33 {34 sum[rt] += add;35 return ;36 }37 int m = (l + r) >> 1;38 if (p <= m) update (p, add, lson);39 else update (p, add, rson);40 pushup (rt);41 }42 43 int query(int ql, int qr, int l, int r, int rt)44 {45 if (ql <= l && r <= qr)46 {47 return sum[rt];48 }49 int m = (l + r) >> 1;50 int ans = 0;51 if (ql <= m) ans += query (ql, qr, lson);52 if (qr > m) ans += query (ql, qr, rson);53 54 return ans;55 }56 57 int main(void) //HDOJ 1166 敌兵布阵58 {59 //freopen ("inA.txt", "r", stdin);60 int t, n, cas, ans;61 int b, c;62 char s[10];63 64 while (~scanf ("%d", &t))65 {66 cas = 0;67 while (t--)68 {69 scanf ("%d", &n);70 build (1, n, 1);71 printf ("Case %d:\n", ++cas);72 while (~scanf ("%s", &s))73 {74 if (strcmp (s, "End") == 0) break;75 scanf ("%d%d", &b, &c);76 if (strcmp (s, "Query") == 0)77 {78 ans = query (b, c, 1, n, 1);79 printf ("%d\n", ans);80 }81 else if (strcmp (s, "Add") == 0)82 {83 update (b, c, 1, n, 1);84 }85 else if (strcmp (s, "Sub") == 0)86 {87 update (b, -c, 1, n, 1);88 }89 }90 } 91 }92 93 return 0;94 }
1 /* 2     树状数组 3 */ 4 #include 
5 #include
6 7 const int MAX_N = 50000 + 10; 8 int a[MAX_N]; 9 int n, num;10 11 int lowbit(int t) //求 2^k12 {13 //return t & (t ^ (t - 1));14 return t & (-t);15 }16 17 void plus(int num, int x) //第i个增加num个人18 {19 while (x <= n)20 {21 a[x] += num;22 x += lowbit (x);23 }24 }25 26 int sum(int x) //求前x项的和27 {28 int sum = 0;29 while (x > 0)30 {31 sum += a[x];32 x -= lowbit(x);33 }34 return sum;35 }36 37 int main(void)38 {39 //freopen ("inA.txt", "r", stdin);40 41 int t;42 char op[100];43 44 scanf ("%d", &t);45 int k = t;46 47 while (k--)48 {49 memset (a, 0, sizeof (a));50 scanf ("%d", &n);51 for (int i=1; i<=n; ++i)52 {53 scanf ("%d", &num);54 plus (num, i);55 }56 int r = 1;57 while (scanf ("%s", &op), op[0] != 'E')58 {59 int a, b;60 scanf ("%d%d", &a, &b);61 switch (op[0])62 {63 case 'A':64 plus (b, a);65 break;66 case 'S':67 plus (-b, a);68 break;69 case 'Q':70 if (r)71 printf ("Case %d:\n", t - k);72 r = 0;73 printf ("%d\n", sum (b) - sum (a-1));74 break;75 }76 }77 }78 79 return 0;80 }
树状数组

 

转载于:https://www.cnblogs.com/Running-Time/p/4506401.html

你可能感兴趣的文章
confluence安装
查看>>
node之cpu监控
查看>>
并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)...
查看>>
简单的Windows应用程序命名规则
查看>>
java接收数据接口
查看>>
将.csv文件用Excel 2016打开
查看>>
Period[HDU1358]
查看>>
[Offer收割]编程练习赛37
查看>>
对齐方式
查看>>
Mybatis plus中一个框多条件查询 SQL拼接
查看>>
WPF Uri
查看>>
android 获取IMEI号
查看>>
【设计模式】—— 外观模式Facade
查看>>
Log4j官方文档翻译(六、日志的级别)
查看>>
JSON定义
查看>>
你不知道的JavaScript之类型
查看>>
工作流,sharepoint 开发流程
查看>>
[转]Android推送方案分析(MQTT/XMPP/GCM)
查看>>
使用方向变换(directional transform)图像分块压缩感知
查看>>
朴素贝叶斯法
查看>>