poj3468
来源:互联网 发布:windows编译php 编辑:程序博客网 时间:2024/05/29 09:40
这是我敲的第一道线段树的题目,第一次就让我做这么难的题目还让不让我活了,==。。。泪奔
题目的大意就通过一些操作变换,成段更新,问一段的和。
线段树操作其实蛮麻烦的额。。。
总用有几个
1.pushup()将子节点加到父亲节点上去;
2.pushdown()将父亲的节点的lazy标记下传到子节点中;
3.build()建树;
4.modify()成段跟新;
5.query()询问一段的和;
贴上一段代码:
#include <iostream>#include <stdio.h>#include <string.h>#define ls (p<<1)#define rs ((ls)+1)#define mid ((t[p].l+t[p].r)>>1)using namespace std;const int maxn=200010;struct Tree{ int l; int r; long long sum; long long lazy;}t[maxn<<2];int v[maxn];void pushdown(int p){ if(t[p].lazy) { t[ls].lazy+=t[p].lazy; t[rs].lazy+=t[p].lazy; t[ls].sum+=t[p].lazy*(t[ls].r-t[ls].l+1); t[rs].sum+=t[p].lazy*(t[rs].r-t[rs].l+1); t[p].lazy=0; }}void pushup(int p){ t[p].sum=t[ls].sum+t[rs].sum;}void build(int p,int l,int r){ t[p].l=l;t[p].r=r; t[p].lazy=0; if(l==r) { t[p].sum=v[l]; return ; }else{ build(ls,l,mid); build(rs,mid+1,r); pushup(p);}}void modify(int p,int l,int r,int val){ if(t[p].l==l&&t[p].r==r) { t[p].lazy+=val; t[p].sum+=val*(t[p].r-t[p].l+1); return ; } pushdown(p); if(r<=mid) { modify(ls,l,r,val); } else if(l>mid) { modify(rs,l,r,val); } else { modify(ls,l,mid,val); modify(rs,mid+1,r,val); } pushup(p);}long long query(int p,int l,int r){ if(t[p].l==l&&t[p].r==r) { return t[p].sum; } pushdown(p); if(mid>=r) return query(ls,l,r); else if(mid<l) return query(rs,l,r); else return query(ls,l,mid)+query(rs,mid+1,r);}int main(){ freopen("in.txt","r",stdin); int n,q,i; scanf("%d%d",&n,&q); char str[2]; for(i=1;i<=n;i++) { scanf("%d",&v[i]); } build(1,1,n); int x,y,c; for(i=1;i<=q;i++) { scanf("%s%d%d",str,&x,&y); if(str[0]=='Q') { printf("%I64d\n",query(1,x,y)); } else { scanf("%d",&c); modify(1,x,y,c); } } return 0;}
0 0
- POJ3468
- POJ3468
- poj3468
- poj3468
- poj3468
- poj3468
- poj3468
- POJ3468
- poj3468
- POJ3468
- poj3468
- poj3468
- poj3468
- poj3468
- poj3468
- POJ3468
- poj3468
- poj3468
- 使用shell脚本获取虚拟机中cpu使用率(读/proc/stat)
- uboot nfs引导内核
- POJ 3067 Japan 线段树
- 马虎的算式: ab * cde = adb * ce 这样的算式一共有多少种呢
- 虚拟网卡 TUN/TAP 驱动程序设计原理
- poj3468
- BDI模型
- Windows 驱动中的IO堆栈
- 折半(对半)搜索算法
- 判断一个二叉树是否为满二叉树
- java的URLConnection失败
- MATALB生成随机数函数
- 开启一种新的人生
- 一步一步学习C++(类)之虚函数和纯虚数