线段数(单点更新)
来源:互联网 发布:selfie city照相软件 编辑:程序博客网 时间:2024/06/05 20:29
在第二场比赛中的k题用到了线段树,所以昨天和今天都在学习线段树,学习了线段树的单点更新以及查询,主要就是要建树、查询、更新,今天上午做了杭电上的1754,没想到今天下午的比赛就有这一道题,果断交了就a了。
先贴一下单点更新的及查询的模板:
<pre name="code" class="cpp">//最最基础的线段树,只更新叶子节点,然后把信息用PushUP(intr)这个函数更新上来//1.bulid();//2.query(a,b)//3.update(a,b)#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn=55555;int sum[maxn<<2];int n;//根据题意做相关修改,询问时的操作int operate(int a,int b) { return a+b;}void PushUp(int rt) { sum[rt] = operate(sum[rt<<1],sum[rt<<1|1]);}void bulid(int l=1,int r=n,int rt=1) { if(l==r) { //据题意做相关修改 scanf("%d", &sum[rt]); return ; } int m = (l+r)>>1; bulid(lson); bulid(rson); PushUp(rt);}void update(int p, int add, int l = 1, int r = n, int rt=1) { if(l==r) { //据题意做相关修改 sum[rt] += add; return ; } int m = (l+r)>>1; if(p <= m) update(p, add, lson); else update(p, add, rson); PushUp(rt);}int query(int L,int R,int l = 1,int r = n, int rt=1) { if(L<=l && r<=R) { return sum[rt]; } int m = (l+r)>>1; int ret = 0; if(L <= m) ret = operate(ret, query(L,R,lson)); if(R > m) ret = operate(ret, query(L,R,rson)); return ret;}
下面就是杭电的1754,也是第三场比赛的L题:
<a target=_blank href="http://http://vjudge.net/contest/view.action?cid=50696#problem/J">点击打开链接</a>,
题目大大意就是:给定一组学生成绩,要实现能查询其中的最高分并且能够更新其中的某一学生的值。把模板改一改就能完成了。
代码实现:
<pre name="code" class="cpp">#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define lson l, m , rt<<1#define rson m+1, r, rt << 1 | 1using namespace std;int n, m;int sum[200005<<2];void build(int l, int r, int rt){ if(l == r) { scanf("%d", &sum[rt]); return ; } int m = (l+r)>>1; build(lson); build(rson); sum[rt] = max(sum[rt<<1], sum[rt<<1|1]);}void update(int p, int d, int l, int r, int rt){ if(l == r) { sum[rt] = d; return ; } int m = (l+r)>>1; if(p<=m) update(p, d, lson); else update(p, d, rson); sum[rt] = max(sum[rt<<1], sum[rt<<1|1]);}int query(int ll, int rr, int l, int r, int rt){ if(ll<=l && rr>=r) return sum[rt]; int m = (l+r)>>1; int ans = 0; if(ll<=m) ans = max(ans, query(ll, rr, lson)); if(rr>m) ans = max(ans, query(ll, rr, rson)); return ans;}int main(){ int ma, a, b; char c[2]; while(~scanf("%d%d", &n, &m)) { memset(sum, 0, sizeof(sum)); build(1, n, 1); for(int i = 0; i<m; i++) { scanf("%s%d%d", c, &a, &b); if(c[0]=='Q') { ma = query(a, b, 1, n, 1); printf("%d\n", ma); } if(c[0]=='U') { update(a, b, 1, n, 1); } } } return 0;}
0 0
- 线段数(单点更新)
- hdu1394(最小逆序数)(线段树单点更新)
- NYOJ116 士兵杀敌(二) 线段数、单点更新
- 线段数 (区间更新 区间查询 单点更新 单点查询) 模板
- 线段树求逆序数(单点更新)
- 51Nod 1287 加农炮 (线段数单点更新单点查询)
- 线段树(单点更新)
- 线段树(单点更新)
- 线段树(单点更新+区间更新)
- hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)
- HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)
- HDU 1394 Minimum Inversion Number(线段树:单点更新,求逆序数)
- HDU 1394 线段树单点更新求逆序数
- HDU1394(最小逆序数)-线段树单点更新
- HDU 1394(单点更新线段树求逆序数)
- 线段数单点更新——HDU 2795
- HDU2689 Sort it 逆序数-线段树单点更新
- Minimum Inversion Number(线段树单点更新+逆序数)
- 剑指offer04
- jQuery 常用函数
- 一个基于MEF的可拓展的WPF Host程序
- 数塔 - HDU 2084 水题dp
- ubuntu下eclipse找不到jre 安装jdk环境正常,但是不能启动eclipse
- 线段数(单点更新)
- 小米的五个决定
- Ogre导入3Dmax模型注意事项
- 使用qtcreator时出现The specified source space "/home/xxx/src" does not exist的错误
- 高并发下的 Nginx 优化方案
- Android字体Typeface设置
- 1058. A+B in Hogwarts (20)
- Ajax基础
- JDBC中Date类型数据的插入