A Simple Problem with Integers (基础线段树)
来源:互联网 发布:淘宝产品附件拆开卖 编辑:程序博客网 时间:2024/05/23 12:39
题意
给出了一个序列,你需要处理如下两种询问
“C a b c”表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。
“Q a b” 询问[a, b]区间中所有值的和。
本题很简单注意数据范围就可以了 (他是很直白的区域更新)lazy 标记要用 long long 在这错了很多次。
以下是AC代码
#include <iostream>#include <stdio.h>using namespace std;const int maxn=100005;struct node{ int l,r; long long lazy; long long sum;} tree[maxn*4];int a[maxn+5];void pushdown(int id){ if(tree[id].lazy!=0) { tree[id*2].lazy+=tree[id].lazy; tree[id*2+1].lazy+=tree[id].lazy; tree[id*2].sum+=(tree[id].lazy*(tree[id*2].r-tree[id*2].l+1)); tree[id*2+1].sum+=(tree[id].lazy*(tree[id*2+1].r-tree[id*2+1].l+1)); tree[id].lazy=0;//注意把lazy标记计零 }}//建树void build (int left,int right,int id) { tree[id].l=left; tree[id].r=right; tree[id].lazy=0; int mid=(left+right)/2; if(tree[id].l==tree[id].r) { tree[id].sum=a[tree[id].l]; return ; } else { build(left,mid,id*2); build(mid+1,right,id*2+1); } tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;}//给给定区间加上一个数void add(int left,int right,int val,int id){ int mid=(tree[id].l+tree[id].r)/2; if(left<=tree[id].l&&tree[id].r<=right) { tree[id].lazy+=val; tree[id].sum+=(val*(tree[id].r-tree[id].l+1)); return ; } //增加的时候也要把lazy标记往下传 pushdown(id); if(right<=mid) { add(left,right,val,id*2); } else if(left>=mid+1) { add(left,right,val,id*2+1); } else { add(left,mid,val,id*2); add(mid+1,right,val,id*2+1); } tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;}//查询 long long inquiry(int left,int right,int id){ int mid=(tree[id].l+tree[id].r)/2; if(left<=tree[id].l&&tree[id].r<=right) { return tree[id].sum; }//注意把lazy标记往下传 pushdown(id); long long ans=0; if(right<=mid) { ans+=inquiry(left,right,id*2); } else if(left>=mid+1) { ans+=inquiry(left,right,id*2+1); } else { ans+=inquiry(left,mid,id*2); ans+=inquiry(mid+1,right,id*2+1); } return ans;}int main (){ int n,m,i; scanf ("%d %d",&n,&m); for (i=1; i<=n; i++) scanf ("%d",&a[i]); build(1,n,1); while (m--) { char type[2]; int x,y,val; scanf ("%s",&type); if(type[0]=='Q') { scanf ("%d %d",&x,&y); long long ans=inquiry(x,y,1); cout<<ans<<endl; } if(type[0]=='C') { scanf ("%d %d %d",&x,&y,&val); add(x,y,val,1); } } return 0;}
0 0
- A Simple Problem with Integers (基础线段树)
- poj 3468 A Simple Problem with Integers 基础线段树
- A Simple Problem with Integers(线段树)
- A Simple Problem with Integers----线段树
- 线段树 A Simple Problem with Integers
- 线段树 A Simple Problem with Integers
- POJ 3468 A SIMPLE PROBLEM WITH INTEGERS(线段树)
- Poj A Simple Problem with Integers(lazy线段树)
- 【hdu】A Simple Problem with Integers (线段树)
- hdu 4267 A Simple Problem with Integers(线段树)
- pku 3468 A Simple Problem with Integers(线段树)
- poj3468 A Simple Problem with Integers(spaly&&线段树)
- poj 3468 A Simple Problem with Integers ( 线段树 )
- POJ 3468 A Simple Problem with Integers (线段树)
- POJ 3468 A Simple Problem with Integers(线段树)
- poj3511--A Simple Problem with Integers(线段树求和)
- poj3468 A Simple Problem with Integers(线段树)
- A Simple Problem with Integers(线段树)
- NOI2016同步赛总结
- python thread模块
- POJ 1094-Sorting It All Out(元素大小关系-拓扑排序)
- 无尽走廊(C语言)
- web框架学习前复习——xml(2)
- A Simple Problem with Integers (基础线段树)
- 进程讲座总结。
- Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式
- 数组定义及遍历
- 修改seting里面的休眠时间列表
- redis 对基本数据类型的处理接口
- 【LEETCODE】328. Odd Even Linked List
- 认识Gson解析Json
- HDU2087剪花布条