博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codves 4927 线段树练习5
阅读量:6478 次
发布时间:2019-06-23

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

有n个数和5种操作

add a b c:把区间[a,b]内的所有数都增加c

set a b c:把区间[a,b]内的所有数都设为c

sum a b:查询区间[a,b]的区间和

max a b:查询区间[a,b]的最大值

min a b:查询区间[a,b]的最小值

输入描述 
Input Description

第一行两个整数n,m,第二行n个整数表示这n个数的初始值

接下来m行操作,同题目描述

输出描述 
Output Description

对于所有的sum、max、min询问,一行输出一个答案

样例输入 
Sample Input

10 6

3 9 2 8 1 7 5 0 4 6

add 4 9 4

set 2 6 2

add 3 8 2

sum 2 10

max 1 7

min 3 6

 

样例输出 
Sample Output

49

11

4

#include
#include
#include
#define ll long longusing namespace std;const int N=100010;const int inf=0x3f3f3f3f;struct node{ ll a_la,s_la,sum,minx,maxx; int l,r,flag;}e[N*8];int read(){ int ans=0,f=1;char c=getchar(); while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();} return ans*f;}inline void pushup(int ro){ e[ro].sum=e[ro<<1].sum+e[ro<<1|1].sum; e[ro].minx=min(e[ro<<1].minx,e[ro<<1|1].minx); e[ro].maxx=max(e[ro<<1].maxx,e[ro<<1|1].maxx);}void build(int ro,int l,int r){ e[ro].l=l,e[ro].r=r; if(l==r) {
int t=read();e[ro].minx=t,e[ro].maxx=t,e[ro].sum=t;} else { int mid=(l+r)>>1; build(ro<<1,l,mid);build(ro<<1|1,mid+1,r);pushup(ro); } return;}inline void down(int ro){ if(e[ro].flag) { e[ro<<1].flag=e[ro<<1|1].flag=1; e[ro].flag=0; int mid=(e[ro].l+e[ro].r)>>1; e[ro<<1].sum=e[ro].s_la*(mid-e[ro].l+1); e[ro<<1|1].sum=e[ro].s_la*(e[ro].r-mid); e[ro<<1].maxx=e[ro<<1].minx=e[ro<<1|1].maxx=e[ro<<1|1].minx=e[ro].s_la; e[ro<<1].s_la=e[ro<<1|1].s_la=e[ro].s_la; e[ro<<1].a_la=e[ro<<1|1].a_la=e[ro].s_la=0; } if(e[ro].a_la) { e[ro<<1].a_la+=e[ro].a_la; e[ro<<1|1].a_la+=e[ro].a_la; e[ro<<1].sum+=e[ro].a_la*(e[ro<<1].r-e[ro<<1].l+1); e[ro<<1].minx+=e[ro].a_la; e[ro<<1].maxx+=e[ro].a_la; e[ro<<1|1].sum+=e[ro].a_la*(e[ro<<1|1].r-e[ro<<1|1].l+1); e[ro<<1|1].minx+=e[ro].a_la; e[ro<<1|1].maxx+=e[ro].a_la; e[ro].a_la=0; } }void add(int ro,int l,int r,int x){ down(ro); if(l<=e[ro].l&&e[ro].r<=r) { if(e[ro].s_la) e[ro].s_la+=x; else e[ro].a_la+=x; e[ro].sum+=x*(e[ro].r-e[ro].l+1); e[ro].maxx+=x; e[ro].minx+=x; return; } int mid=(e[ro].l+e[ro].r)>>1; if(l<=mid) add(ro<<1,l,r,x); if(r>mid) add(ro<<1|1,l,r,x); pushup(ro); return;}void set(int ro,int l,int r,int x){ down(ro); if(l<=e[ro].l&&e[ro].r<=r) { e[ro].sum=x*(e[ro].r-e[ro].l+1); e[ro].minx=x; e[ro].maxx=x; e[ro].a_la=0; e[ro].s_la=x; e[ro].flag=1; return; } int mid=(e[ro].l+e[ro].r)>>1; if(l<=mid) set(ro<<1,l,r,x); if(r>mid) set(ro<<1|1,l,r,x); pushup(ro); return;}ll asum(int ro,int l,int r){ down(ro); if(l<=e[ro].l&&e[ro].r<=r) return e[ro].sum; int mid=(e[ro].l+e[ro].r)>>1; ll ans=0; if(l<=mid) ans+=asum(ro<<1,l,r); if(mid
>1; ll answer=inf; if(l<=mid) answer=min(answer,amin(ro<<1,l,r)); if(mid
>1; ll answer=-inf; if(l<=mid) answer=max(answer,amax(ro<<1,l,r)); if(mid
View Code

模板!!!

调了好久。

转载于:https://www.cnblogs.com/12fs/p/7457452.html

你可能感兴趣的文章
在properties.xml中定义变量,在application.xml中取值问题
查看>>
js 数组
查看>>
Linux scp命令详解
查看>>
struct和typedef struct
查看>>
cell reuse & disposebag
查看>>
【故障处理】ORA-12545: Connect failed because target host or object does not exist
查看>>
云时代,程序员将面临的分化
查看>>
js判断移动端是否安装某款app的多种方法
查看>>
学习angularjs的内置API函数
查看>>
4、输出名称 Exported names
查看>>
paste工具
查看>>
Pre-echo(预回声),瞬态信号检测与TNS
查看>>
【转载】如何发送和接收 Windows Phone 的 Raw 通知
查看>>
poj2378
查看>>
Java文件清单列表
查看>>
js url传值中文乱码之解决之道
查看>>
Atitit.获取某个服务 网络邻居列表 解决方案
查看>>
Trusty TEE
查看>>
[LeetCode] Reverse String 翻转字符串
查看>>
学习iOS【3】数组、词典和集合
查看>>