poj 3468 A Simple Problem with Integers 基础线段树
这个题我之前做过,我在有做一下,wa,re了一下午,我无语了,各种小毛病,我都标记出来了!!!!!!!!!!!!!
#include<iostream>
using namespace std;
struct node
{
long long left;
long long right;
long long sum;
long long d;
}t[600009];
__int64 a[100005];
char com;
void build(int l,int r,int n)
{
t[n].left=l;
t[n].right=r;
if(l==r)
{
t[n].sum=a[l];
return ;
}
long long mid=(l+r)>>1;
build(l,mid,n*2);
build(mid+1,r,n*2+1);
t[n].sum=t[n*2].sum+t[n*2+1].sum;
}
void updata(int l,int r,int n,int v)
{
if(t[n].left==l&&t[n].right==r)
{
t[n].d+=v;
return ;
}
long long mid=(t[n].left+t[n].right)>>1;
if(mid>=r)
updata(l,r,n*2,v);//这才是主要移动
else if(mid<l)//注意不能大于等于有r,l相等情概况
updata(l,r,n*2+1,v);//这才是主要移动
else
{
updata(l,mid,n*2,v);//用来纠正方向
updata(mid+1,r,n*2+1,v);
}
t[n].sum=t[n*2].sum+(t[n*2].right-t[n*2].left+1)*t[n*2].d;//用来把增加数的线段以上的线段sum值更新,别忘了加一
t[n].sum+=t[n*2+1].sum+(t[n*2+1].right-t[n*2+1].left+1)*t[n*2+1].d;
}
__int64 query(int l,int r,int n,long long p)
{
p+=t[n].d;//将寻找线段以上的线段的增加值加在一起
if(t[n].left==l&&t[n].right==r)
{
return t[n].sum+(t[n].right-t[n].left+1)*p;
}
long long mid=(t[n].left+t[n].right)>>1;//这一个寻找的过程
if(mid>=r)
{
return query(l,r,2*n,p);//system("pause");
}
else if(mid<l)
{
return query(l,r,n*2+1,p);
}
else
{
__int64 s1=query(l,mid,n*2,p);//纠正方向
__int64 s2=query(mid+1,r,n*2+1,p);
return s1+s2;
}
return 0;
}
int main()
{
int n,q;
int a1,b;
long long c;
while(cin>>n>>q)
{
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);//范围
build(1,n,1);
while(q--)
{
cin>>com;
if(com=='Q')
{
scanf("%d%d",&a1,&b);
__int64 t=query(a1,b,1,0);
printf("%I64d\n",t);
}
else
{
scanf("%d%d%I64d",&a1,&b,&c);
updata(a1,b,1,c);
}
}
}
return 0;
}
poj 3468 A Simple Problem with Integers 基础线段树相关推荐
- POJ 3468 A Simple Problem with Integers(线段树:区间更新)
http://poj.org/problem?id=3468 题意: 给出一串数,每次在一个区间内增加c,查询[a,b]时输出a.b之间的总和. 思路: 总结一下懒惰标记的用法吧. 比如要对一个区间范 ...
- 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)
[线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...
- poj 3468 A Simple Problem with Integers(线段树区区)
题目链接: http://poj.org/problem?id=3468 题目大意: 给出N个数,和M次查询 C a b c 区间[a,b]的值都加上c Q a b 查询区间[a,b]值 ...
- POJ 3468 A Simple Problem with Integers
分析:这题wa了好多次(看了下discuss好多人也是这样,好题~).一处是sum值会超int32,要用int64.还有一处是toadd要累加,我不知道是受上一题影响还是怎的..pushdown的时候 ...
- 【POJ - 3468 】 A Simple Problem with Integers (线段树模板 区间更新 + 区间和查询)(不能树状数组或差分数组)
题干: You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type o ...
- POJ 3468 A Simple Problem with Integers (1)
POJ_3468(1) 在消化了PPT上思想之后,又重新做了一下这个题目. 不妨将原数组的元素记作a[i],然后我们用堆建立两棵线段树,一棵的原数组为x[i](x[i]=a[i]-a[i-1],即原数 ...
- POJ - 3468 A Simple Problem with Integers(分块)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列,再给出 m 次操作,每次操作分为两种情况: C l r d:区间 [ l , r ] 内的数字都加上 d Q l r :查询 [ l , r ...
- POJ 3468 A Simple Problem with Integers(线段树区间更新)
题目链接 这个真费劲...其实我也不懂 为什么...大体思想是,如果把区间更新了,开始的时候只把用懒惰标记标记那个区间,而不更新底层元素,而如果查询的时候顺带着把lz标记给消除...多敲几遍,多调试一 ...
- POJ3468 A Simple Problem with Integers【线段树 成段更新+求和 lazy标志】
用longlong替换__int64也成. #define LL long long 输入输出用%lld Problem: 3468 User: qq1203456195 Memory: 4284 ...
- POJ3468-A Simple Problem with Integers【线段树,树状数组,分块】
正题 题目链接:我是链接 其实洛谷线段树模板也是一样的:三种方法AC评测链接 题目大意 要求支持区间修改,区间求和. 线段树 直接用一个lazy标记,在之前的博客里有说 code1 #include& ...
最新文章
- 收集程序员的几幅对联
- 问题 seata_架构设计 | 基于Seata中间件,微服务模式下事务管理
- sql 获取第10到20个记录
- thinkphp5.0连接mysql_thinkphp5.0数据库操作
- 使用openlayers投影阿伯斯(Albers)
- PPC手机(WM5)Wifi和GPRS同时使用设置指南
- lisp 设计盘形齿轮铣刀_用AutoLISP设计盘形齿轮铣刀渐开线齿形
- erp java源代码_erp java
- reducer在react使用
- vue 网络异常提示
- 爬虫到底违法吗?这位爬虫工程师给出了答案
- 有15个数按从小到大的顺序存放在一个数组中。(折半查找)
- uCLinux简介--
- php的原子操作,原子操作 · 国外PHP框架Nette官网教程 · 看云
- norflash芯片分区
- java计算机毕业设计东理咨询交流论坛源码+数据库+系统+lw文档+部署
- Git(用在IDEA中)
- iOS获取文件夹下所有的文件
- 安卓镜像刻录软件_Android烧录工具-安卓烧录工具下载v6.0.43 官方最新版-西西软件下载...
- JSR 303 以及 拦截器