博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hdu【线段树】基础题.cpp
阅读量:4653 次
发布时间:2019-06-09

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

[1166 敌兵布阵]

题意:

  给出一些命令..要求可以:

    随时增加或减少某个位置上的数

    随时查询某段区间上的和..

  输入:

  一个T 表示有T组样例

  每组样例一个n 表示有n个位置

  输入命令:

    Add a b 表示在 a 位置上增加 b

    Sub a b 表示在 a 位置上减少 b

    Query a b 表示求 a 到 b 的和

 

思路:

  因为数据量很大..所以无法靠暴力来遍历求和..

  所以用线段树..

 

Tips:

  更新的时候注意sum数组开到节点的4倍

 

Code:

View Code
1 #include 
2 #include
3 4 const int MAXN = 50010; 5 int a[MAXN], sum[MAXN*4]; 6 7 void creat(int l, int r, int rt) 8 { 9 if(l == r) {10 scanf("%d", &sum[rt]);11 return;12 }13 int m = (l+r)>>1;14 creat(l, m, rt<<1);15 creat(m+1, r, rt<<1|1);16 sum[rt] = sum[rt<<1]+sum[rt<<1|1];17 }18 19 void update(int p, int w, int l, int r, int rt)20 {21 if(l == r) {22 sum[rt] += w;23 return;24 }25 int m = (l+r)>>1;26 if(p <= m) update(p, w, l, m, rt<<1);27 else update(p, w, m+1, r, rt<<1|1);28 sum[rt] = sum[rt<<1]+sum[rt<<1|1];29 }30 31 int query(int l, int r, int L, int R, int rt)32 {33 if(l <= L && R <= r) {34 return sum[rt];35 }36 int m = (L+R)>>1;37 int res = 0;38 if(l <= m) res += query(l, r, L, m, rt<<1);39 if(r > m) res += query(l, r, m+1, R, rt<<1|1);40 return res;41 }42 43 int main()44 {45 int i, j, k = 0;46 int T, n;47 char opt[10];48 int a, b;49 while(scanf("%d", &T) != EOF)50 while(T--)51 {52 printf("Case %d:\n", ++k);53 scanf("%d", &n);54 creat(1, n, 1);55 while(scanf("%s", opt), opt[0] != 'E') {56 scanf("%d %d", &a, &b);57 if(opt[0] == 'A')58 update(a, b, 1, n, 1);59 else if(opt[0] == 'S')60 update(a, -1*b, 1, n, 1);61 else if(opt[0] == 'Q')62 printf("%d\n", query(a, b, 1, n, 1));63 }64 65 }66 return 0;67 }

 

题目链接:

 

[1754 i hate it]

题意:

  给出一些数值根据命令更新或查询区间最大值

思路:

  向上更新的时候找最大值

Tips:

  可以用函数实现更新操作

Code:

  

View Code
1 #include 
2 #include
3 #include
4 using namespace std; 5 6 const int MAXN = 200010; 7 int ma[MAXN<<2]; 8 9 void creat(int l, int r, int rt)10 {11 if(l == r) {12 scanf("%d", &ma[rt]);13 return;14 }15 int mid = (l+r)>>1;16 creat(l, mid, rt<<1);17 creat(mid+1, r, rt<<1|1);18 ma[rt] = max(ma[rt<<1], ma[rt<<1|1]);19 }20 21 void modify(int p, int w, int l, int r, int rt)22 {23 if(l == r) {24 ma[rt] = w;25 return;26 }27 int mid = (l+r)>>1;28 if(p <= mid) modify(p, w, l, mid, rt<<1);29 else modify(p, w, mid+1, r, rt<<1|1);30 ma[rt] = max(ma[rt<<1], ma[rt<<1|1]);31 }32 33 int query(int l, int r, int L, int R, int rt)34 {35 if(l <= L && r >= R) {36 return ma[rt];37 }38 int mid = (L+R)>>1;39 int res = 0;40 if(l <= mid) res = max(res, query(l, r, L, mid, rt<<1));41 if(r > mid) res = max(res, query(l, r, mid+1, R, rt<<1|1));42 return res;43 }44 45 int main()46 {47 int i, j, k;48 int n, m;49 char opt[2];50 int a, b;51 while(scanf("%d %d", &n, &m) != EOF)52 {53 creat(1, n, 1);54 while(m--) {55 scanf("%s", &opt);56 scanf("%d %d", &a, &b);57 if(opt[0] == 'Q')58 printf("%d\n", query(a, b, 1, n, 1));59 else if(opt[0] == 'U') modify(a, b, 1, n, 1);60 }61 }62 return 0;63 }

 

 

 

题目链接:

转载于:https://www.cnblogs.com/Griselda/archive/2012/10/09/2717363.html

你可能感兴趣的文章
transition 属性(逐渐变色)
查看>>
关于CURL的初步认识
查看>>
如何使用 JDBC 调用存储在数据库中的函数或存储过程
查看>>
Js通过原型继承创建子类
查看>>
HTML5 网页 漂浮窗广告 JavaScript逻辑 - demo
查看>>
使用一条SQL语句删除表中重复记录
查看>>
教程-Win7极速优化20项
查看>>
CF1083B The Fair Nut and String
查看>>
mac上卸载jdk 步骤
查看>>
Old Sorting(转化成单调序列的最小次数,置换群思想)
查看>>
C的|、||、&、&&、异或、~、!运算(转)
查看>>
迷宫城堡(强联通targin)
查看>>
easyUI添加修改tab页(toolbar)
查看>>
JavaScript笔试题
查看>>
Leetcode 969. Pancake Sorting
查看>>
set()集合的概念与一般操作
查看>>
winform - ComboBox_ListView2
查看>>
react中递归生成列表
查看>>
内置函数filter
查看>>
FIREDAC TFDCONNECTION连接ORACLE
查看>>