闲着无聊,写两个线段树发现类似点。
来源:互联网 发布:js中怎么获取name属性 编辑:程序博客网 时间:2024/05/29 15:28
Hdu 1166 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
Hdu 1754 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
线段树:1分为2,2分为4,4分为8,区间更新。
一个求和,一个求最大值。差不多吧。
#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>#include <queue>#include <map>#include <stack>#include <list>#include <vector>using namespace std;struct node{int s,l,r;}a[500010];void bulit(int n,int l,int r){a[n].s=0;a[n].l=l;a[n].r=r;if (l==r) return; int m=(l+r)/2;bulit(n*2,l,m);bulit(n*2+1,m+1,r);}void insert(int n,int x,int y){a[n].s+=y;if (a[n].l==a[n].r)return;int m=(a[n].l+a[n].r)/2;if (x<=m)insert(n*2,x,y);elseinsert(n*2+1,x,y);}void change(int n,int x,int y){if (a[n].l==a[n].r){a[n].s+=y;return;}int m=(a[n].l+a[n].r)/2;if (x<=m)change(n*2,x,y);else change(n*2+1,x,y);a[n].s=a[2*n].s+a[2*n+1].s;}long long qsum(int n,int l,int r){if (a[n].l==l && a[n].r==r)return a[n].s;int m=(a[n].l+a[n].r)/2;if (r<=m)return qsum(n*2,l,r);else if (l>m)return qsum(n*2+1,l,r);elsereturn qsum(n*2,l,m)+qsum(n*2+1,m+1,r);}int main(){int T,n,i,j,k;char c[10];scanf("%d",&T);for (int cas=1;cas<=T;cas++){printf("Case %d:\n",cas);scanf("%d",&n);bulit(1,1,n);for (i=1;i<=n;i++){scanf("%d",&k);insert(1,i,k);}while (~scanf("%s",&c)){if (c[0]=='E') break;scanf("%d%d",&i,&j);if (c[0]=='A') change(1,i,j);if (c[0]=='S') change(1,i,-j);if (c[0]=='Q') printf("%lld\n",qsum(1,i,j));}}return 0;}
#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>#include <queue>#include <map>#include <stack>#include <list>#include <vector>using namespace std;struct node{int max,l,r;}a[2000005];int s;void bulit(int n,int l,int r){a[n].max=0;a[n].l=l;a[n].r=r;if (l==r) return;int mid=(l+r)/2;bulit(n*2,l,mid);bulit(n*2+1,mid+1,r);}void insert(int n,int x,int y){if (a[n].max<y)a[n].max=y;if (a[n].l==a[n].r)return;int mid=(a[n].l+a[n].r)/2;if (x<=mid)insert(n*2,x,y);elseinsert(n*2+1,x,y);a[n].max=max(a[n*2].max,a[n*2+1].max);}int qmax(int n,int l,int r){if (a[n].l==l && a[n].r==r){if (s<a[n].max)s=a[n].max;return s;}int mid=(a[n].l+a[n].r)/2;if (r<=mid)return qmax(n*2,l,r);else if (l>mid) return qmax(n*2+1,l,r);elsereturn max(qmax(n*2,l,mid),qmax(n*2+1,mid+1,r));}int main(){int n,m,i,k;while (~scanf("%d%d",&n,&m)){bulit(1,1,n);for (i=1;i<=n;i++){scanf("%d",&k);insert(1,i,k);}for (i=1;i<=m;i++){getchar();char c;int q,w;s=0;scanf("%c%d%d",&c,&q,&w);if (c=='U') insert(1,q,w);if (c=='Q') printf("%d\n",qmax(1,q,w));}}return 0;}
0 0
- 闲着无聊,写两个线段树发现类似点。
- 闲着无聊刷道题
- 闲着无聊刷道题
- 无聊的写点东西
- 刚刚闲着无聊,随便写了一个抓取博客园的py
- hdu 4893 线段树 --- 也是两个变 类似双标记
- 无聊,写点基础的东西。
- 周末闲着无聊分享一个自己写的带呼吸效果的android水波纹自定义view
- 闲着无聊,看《武林外传》ing
- 闲着无聊-AC一个水题
- 闲着无聊学习git操作1
- 线段树-洛谷P1438 无聊的数列
- 最近闲着无聊,做个里网站,http://yzkzoo.freehoxt.com
- 无聊写的无聊东西
- 闲着没事,弄两个面试题答案
- 闲着没事,学点CSS吧
- 闲着没事写了个 双色球生成
- 闲着没事,写了个Java计算器
- Virgo Tomcat Server 指南-Hello World
- HDOJ 3544 Alice's Game 博弈
- 禁用滚动视图ListView、ViewPager、ScrollView、HorizontalScrollView、WebView边界颜色渐变
- uva 11898 - Killer Problem
- 突破IIS的客户端连接限制
- 闲着无聊,写两个线段树发现类似点。
- std::cerr
- Rose图发布为网页版
- 学习Hadoop生态系统最值得一读的书籍
- sphinx的coreseek4.0中文分词的安装
- javacc学习总结
- mini小框架BeanUtils基本使用
- 可奈何
- C# List<>.Add一个细节