博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3468 A Simple Problem with Integers 【线段树-成段更新】
阅读量:6265 次
发布时间:2019-06-22

本文共 1817 字,大约阅读时间需要 6 分钟。

题目:

题意:给出n个数。两种操作

1:l -- r 上的全部值加一个值val

2:求l---r 区间上的和

分析:线段树成段更新,成段求和

树中的每一个点设两个变量sum 和 num ,分别保存区间 l--r 的和 和l---r 每一个值要加的值

对于更新操作:对于要更新到的区间上面的区间,直接进行操作 加上 (r - l +1)* val 。

以下的区间标记num += val

对于求和操作。每次进行延迟更新。把num值分别更新到两个子区间。sum值更新,然后num值变为0

注意:这个题目会超int 。

所以

AC代码:

#include 
#include
#include
#include
#include
#include
#include
using namespace std;const long long N = 110000;const long long inf = 0x3f3f3f3f;struct Node{ long long l,r; long long num,sum;};Node tree[5*N];long long a[N];long long cnt ;void build(long long o,long long l,long long r){ tree[o].l = l,tree[o].r = r; tree[o].num = 0; if(l==r) { tree[o].sum = a[cnt++]; return ; } long long mid = (l+r)/2; build(o+o,l,mid); build(o+o+1,mid+1,r); tree[o].sum = tree[o+o].sum + tree[o+o+1].sum;}void push_update(long long o){ if(tree[o].num!=0) { tree[o].sum += tree[o].num * (tree[o].r-tree[o].l+1); tree[o+o+1].num += tree[o].num; tree[o+o].num += tree[o].num; tree[o].num = 0; }}void update(long long o,long long l,long long r,long long val){ if(l==tree[o].l && r == tree[o].r) { tree[o].num += val; return ; } tree[o].sum += (val*(r-l+1)); //维护前面的 long long mid = (tree[o].l+tree[o].r) / 2; if(r<=mid) update(o+o,l,r,val); else if(l>mid) update(o+o+1,l,r,val); else { update(o+o,l,mid,val); update(o+o+1,mid+1,r,val); }}long long query(long long o,long long l,long long r){ if(tree[o].l==l && tree[o].r == r) { return tree[o].sum+(r-l+1)*tree[o].num; } push_update(o); //维护后面的 long long mid = (tree[o].l+tree[o].r)/2; if(r<=mid) return query(o+o,l,r); else if(l>mid) return query(o+o+1,l,r); else return query(o+o,l,mid) + query(o+o+1,mid+1,r);}int main(){ //freopen("Input.txt","r",stdin); long long n,m; while(~scanf("%lld%lld",&n,&m)) { cnt = 0; for(long long i=0;i

转载地址:http://lddpa.baihongyu.com/

你可能感兴趣的文章
Android 命令行编译、打包生成apk文件
查看>>
java中解决组件重叠的问题(例如鼠标移动组件时)
查看>>
使用 Navicat 8.0 管理mysql数据库(导出导入数据)
查看>>
视频会议
查看>>
EntityFramework系列:SQLite.CodeFirst自动生成数据库
查看>>
网络编码
查看>>
定时任务-在spring中配置quartz
查看>>
【springMVC 后台跳转前台】1.使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中 ----2.前后台都没有报错,不能进入ajax回调函数...
查看>>
redis+Keepalived主从热备秒级切换
查看>>
Hibernate占位符警告:use named parameters or JPA-style positional parameters instead.
查看>>
基于 IdentityServer3 实现 OAuth 2.0 授权服务数据持久化
查看>>
是什么时候开始学习gulp了
查看>>
【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识
查看>>
otl使用存储过程或是LEFT JOIN时提示输出类型未知的问题
查看>>
集群(cluster)原理(转)
查看>>
小数格式:
查看>>
【MyBatis学习06】_parameter:解决There is no getter for property named in class java.lang.String...
查看>>
Eclipse导入别人的项目报错:Unable to load annotation processor factory 'xxxxx.jar' for project...
查看>>
与孩子一起学编程10章
查看>>
【再探backbone 03】博客园单页应用实例(提供源码)
查看>>