UESTC-1057 秋实大哥与花 (区间修改,区间求和)
来源:互联网 发布:python求平均值函数 编辑:程序博客网 时间:2024/06/05 22:35
https://vjudge.net/problem/UESTC-1057
区间修改,一个个改复杂度是nlogn还不如暴力,这里用到线段树的lazy思想,保证复杂度为logn
#include <iostream>#include <cstdio>#include <cstring>#define lid (id << 1)#define rid (id << 1 | 1)using namespace std;const int maxn = 1e5+6;int n,a[maxn],q;struct node{ int l,r; long long sum,Max,lazy; void updata(long long x) { sum =sum+(r-l+1)*x; //增加 Max=Max+x; lazy=lazy+x; /* sum = (r-l+1)*x; //修改 Max=x; lazy=x; */ }} tr[maxn*4];void push_up(int id){ tr[id].sum=tr[lid].sum+tr[rid].sum; tr[id].Max = max(tr[lid].Max,tr[rid].Max);}void push_down(int id){ int lazyvalue=tr[id].lazy; if(lazyvalue) { tr[lid].updata(lazyvalue); tr[rid].updata(lazyvalue); tr[id].lazy=0; }}void build(int id,int l,int r){ tr[id].l=l,tr[id].r=r; tr[id].sum=0,tr[id].Max=0,tr[id].lazy=0; if(l==r) tr[id].sum=a[l],tr[id].Max=a[l]; else { int mid=(l+r)/2; build(lid,l,mid); build(rid,mid+1,r); push_up(id); }}void updata(int id,int l,int r,long long val){ if(l==tr[id].l&&tr[id].r==r) tr[id].updata(val); else { push_down(id); int mid = (tr[id].l+tr[id].r)>>1; if(r<=mid) updata(lid,l,r,val); else if (l>mid) updata(rid,l,r,val); else { updata(lid,l,mid,val); updata(rid,mid+1,r,val); } push_up(id); }}long long query_sum(int id,int l,int r){ if(l==tr[id].l&&tr[id].r==r) return tr[id].sum; else { push_down(id); int mid = (tr[id].l+tr[id].r)/2; if(r<=mid) return query_sum(lid,l,r); else if(l>mid) return query_sum(rid,l,r); else return query_sum(lid,l,mid)+query_sum(rid,mid+1,r); push_up(id); }}long long query_max(int id,int l,int r){ if(l==tr[id].l&&tr[id].r==r) return tr[id].Max; else { push_down(id); int mid = (tr[id].l+tr[id].r)/2; if(r<=mid) return query_max(lid,l,r); else if(l>mid) return query_max(rid,l,r); else return max(query_max(lid,l,mid),query_max(rid,mid+1,r)); push_up(id); }}int main(){ scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } build(1,1,n); scanf("%d",&q); for(int i=1; i<=q; i++) { int l,r,val; scanf("%d%d%d",&l,&r,&val); updata(1,l,r,val); printf("%lld\n",query_sum(1,l,r)); } return 0;}
阅读全文
0 0
- UESTC-1057 秋实大哥与花 (区间修改,区间求和)
- UESTC-1057 秋实大哥与花
- UESTC -- 1057 秋实大哥与花(线段树)
- CDOJ-1057 秋实大哥与花(线段树区间更新)
- CDOJ1073-秋实大哥与线段树 线段树单点更新+区间求和
- UESTC 1073 秋实大哥与线段树 线段树&&改值与区间和 or 树状数组
- cdoj1057 秋实大哥与花 线段树 区间加,区间查询和
- 【线段树】区间求和+区间修改(区间加)
- CDOJ1061-秋实大哥与战争 线段树区间合并问题(求最长连续区间长度)
- 线段树区间修改与查询(求和)
- 树状数组一(二)维区间修改与求和
- 线段树 (更新区间查询点)秋实大哥与小朋友
- uestc数据结构训练B - 秋实大哥与花
- 跟着卿学姐写线段树。。。 ( 秋实大哥与花 UESTC
- UESTC -- 1061 秋实大哥与战争(暴力/set)
- UESTC 1060 秋实大哥与快餐店(字典树)
- [UESTC 1060]秋实大哥与快餐店
- [UESTC 1061]秋实大哥与战争
- 希尔排序 Python实现
- 闲话云安全(1)_安全参考模型
- Java开发中的23种设计模式详解
- 适配器模式(adapter)c++版本
- kamon文档翻译(四)--trace订阅协议
- UESTC-1057 秋实大哥与花 (区间修改,区间求和)
- JMS基本概念
- PYTHON3.6对中文文本分词、去停用词以及词频统计
- 关闭防火墙后javaweb项目无法访问
- Tomcat中Java垃圾收集调优
- laravel中实现短信发送验证码
- 开通博客随笔
- 使用struts、hibernate、spring进行框架整合流程详细说明
- Topcoder SRM 721 Div.2 B. RememberWordsEasy