POJ 4047: Garden
来源:互联网 发布:万德数据库 怎么用 编辑:程序博客网 时间:2024/05/22 05:25
线段树模板题
哎,好久没写线段树了,吃力。
题目链接:http://poj.org/ProblemDescriptions/jinghua.pdf
题意:
对某个区间进行以下三种操作:
0、改变某个位置的值
1、交换某两个位置的值
2、查询某个区间内连续k个数和最大值
算法:
由于k的值是确定的,
所以直接用每个叶子节点保存它之前的k个元素的值即可。
#include<cstdio>#include<iostream>#include<sstream>#include<cstdlib>#include<cstring>#include<string>#include<climits>#include<cmath>#include<algorithm>#include<queue>#include<vector>#include<stack>#include<set>#include<map>#define INF 0x3f3f3f3f#define eps 1e-8using namespace std;const int MAXN=210000;int a[MAXN],sum[MAXN];int tr[MAXN<<2],ret[MAXN<<2];void pushup(int rt) { tr[rt]=max(tr[rt<<1],tr[rt<<1|1]);}void pushdown(int rt) { if(ret[rt]) { tr[rt<<1]+=ret[rt]; tr[rt<<1|1]+=ret[rt]; ret[rt<<1]+=ret[rt]; ret[rt<<1|1]+=ret[rt]; ret[rt]=0; }}void build(int l, int r, int rt) { ret[rt]=0; if(l==r) { tr[rt]=sum[l]; return; } int mid=(l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); pushup(rt);}void update(int l, int r, int L, int R, int c, int rt) { if(L<=l&&r<=R) { tr[rt]+=c; ret[rt]+=c; return; } pushdown(rt); int mid=(l+r)>>1; if(L<=mid) { update(l,mid,L,R,c,rt<<1); } if(R>mid) { update(mid+1,r,L,R,c,rt<<1|1); } pushup(rt);}int query(int l, int r, int L, int R, int rt) { if(L<=l&&r<=R) { return tr[rt]; } pushdown(rt); int mid=(l+r)>>1; int tmp=INT_MIN; if(L<=mid) { tmp=max(tmp,query(l,mid,L,R,rt<<1)); } if(R>mid) { tmp=max(tmp,query(mid+1,r,L,R,rt<<1|1)); } return tmp;}int main() { int cas; scanf("%d",&cas); while(cas--) { int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=0; i<n; i++) { scanf("%d",&a[i]); sum[i]=a[i]; if(i) { sum[i]+=sum[i-1]; } if(i>=k) { sum[i]-=a[i-k]; } } build(0,n-1,1); while(m--) { int p,x,y; scanf("%d%d%d",&p,&x,&y); if(p==0) { x--; update(0,n-1,x,x+k-1,y-a[x],1); a[x]=y; } else if(p==1) { x--; y--; int tmp=a[x]; update(0,n-1,x,x+k-1,a[y]-a[x],1); a[x]=a[y]; update(0,n-1,y,y+k-1,tmp-a[y],1); a[y]=tmp; } else { x--; y--; printf("%d\n",query(0,n-1,x+k-1,y,1)); } } } return 0;}
- poj 4047 Garden
- POJ 4047 Garden
- POJ 4047: Garden
- POJ 4047 Garden
- POJ 4047 Garden 线段树
- POJ 4047 Garden 解题报告
- POJ 4047 Garden (线段树)
- Poj 4047 Garden /2012金华邀请赛D题(线段树)
- poj 4047 Garden 2012金华邀请赛 线段树
- POJ - 4047 Garden(线段树成段更新,查询最值)
- POJ【4047】——Problem D. Garden 线段树
- POJ 3102 Bee Garden 笔记
- Garden
- poj 4047 Garden 2012金华赛区 (成段更新+区间最值)
- poj 4047 Garden(线段树,伤!12年金华邀请赛D题)
- poj 4047 Garden 线段树lazy标记与成段更新
- POJ 4047 Garden (线段树 - 区间增减、区间查询) -- 解题报告
- PKU 4047 - Garden(线段树 + 区间修改)
- 【五一呈献】通用高性能 Windows Socket 组件 HP-Socket v2.1.1 正式发布
- SDRAM讲解
- VS2008 在h与cpp文件间切换快捷键
- bind delegate live的区别。在jquery中
- 求sn=a+aa+aaa+aaa......+aa...a(n个a)之值,其中a是一个数字,例如:2+22+222+2222+22222(此时n=5),n由键盘输入
- POJ 4047: Garden
- hdu1863-畅通工程
- javaSE 4.3 99乘法表
- eclipse 查看原始类出现The jar file rt.jar has no source attachment解决方法
- ubuntu 13.04 重置unity及compiz
- Application failed codesign verification。。。
- UTC 转换为Date
- 2440SDRAM讲解
- hive一些参数