来自ppq的毒瘤线段树

Sneakers
 

Description

有一天喜欢买鞋的ppq和小伙伴来到了某一家球鞋店,球鞋店有n种球鞋,价格分别为ai,ppq在鞋店兜兜转转,发现鞋店老板会偶尔将某段区间内球鞋的价格增加或减少,或者将某双球鞋的价格由价格A修改至价格B,机智的ppq将这些信息记录下来,可是ppq不会数数,所以他向机智的ACMer们求助,请帮助ppq完成以下m次操作,并得到ppq询问的结果。

有以下6种操作:

操作1:鞋店老板将下标位于【L,R】区间的球鞋的价格增加k。(无良老板)

操作2:鞋店老板将下标位于【L,R】区间的球鞋的价格减少k。(良心老板)

操作3: 鞋店老板将下标为pos的球鞋的价格修改为bi

操作4:ppq想买下标位于【L,R】区间内最贵的球鞋,询问他需要花费多少钱

操作5:ppq想买下标位于【L,R】区间内最便宜的球鞋,询问他需要花费多少钱

操作6:ppq想买下标位于【L,R】区间内所有的球鞋,询问他需要花费多少钱

Input

第一行输入n和q(n∈[1,300000],q∈[1,300000])

接下来一行n个数ai,表示第i种球鞋的价格,(ai∈[0,100000]) (因为可能是限量球鞋所以特别贵,滑稽)

接下来q行操作:

q1 L R k 表示将区间[L,R] 内的球鞋价格增加k元 (k∈[0,100000],1<=L<R<=n)

q2 L R k 表示将区间[L,R]内的球鞋价格减少k元 (k∈[0,100000],1<=L<R<=n)

q3 pos b表示将第pos双鞋的价格修改为b (pos∈[1,n],b∈[0,1000000],1<=pos<=n)

q4 L R 表示询问区间[L,R]内最贵的球鞋(1<=L<R<=n)

q5 L R 表示询问区间[L,R]内最便宜的球鞋(1<=L<R<=n)

q6 L R表示询问区间[L,R]内球鞋的价格之和(1<=L<R<=n)

Output

输出每次询问的答案(请注意答案可能为负数

记得push_down ! ! !

ACODE:

//
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<utility>
#include<vector>
#define lson l , m , rt << 1
#define rson m+1 , r , rt << 1 | 1
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const double pi = 3.1415926535;
const double eps = 1e-;
const int MX = 1e6 + ;
const int maxbit = ;
const double val = pi/180.0;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
ll n,m;
struct node
{
ll sum;
ll max;
ll min;
}t[MX<<];
ll a[MX<<];
ll tag[MX<<];
inline ll ls(ll p){return p << ;}
inline ll rs(ll p){return p << |;}
void push_up(ll p)
{
t[p].min = min(t[ls(p)].min,t[rs(p)].min);
t[p].sum = t[ls(p)].sum + t[rs(p)].sum;
t[p].max = max(t[ls(p)].max,t[rs(p)].max);
}
void build(ll p,ll l,ll r)
{
if(l == r)
{
t[p].max = a[l];
t[p].min = a[l];
t[p].sum = a[l];
return;
}
ll mid = (l+r) >> ;
build(ls(p),l,mid);
build(rs(p),mid+,r);
push_up(p);
}
inline void f(ll p,ll l,ll r,ll k)
{
tag[p] = tag[p] + k;
t[p].sum = t[p].sum + (r - l + )*k;
t[p].min =t[p].min+k;
t[p].max =t[p].max+k;
}
inline void push_down(ll p,ll l,ll r)
{
ll mid = (l+r) >> ;
f(ls(p),l,mid,tag[p]);
f(rs(p),mid+,r,tag[p]);
tag[p] = ;
}
inline void update1(ll L,ll R,ll l,ll r,ll p,ll k)
{
//printf("***\n");
if(L<=l&&r <= R)
{
t[p].sum+=k*(r - l + );
t[p].max +=k;
t[p].min +=k;
tag[p]+=k;
return;
}
push_down(p,l,r);
ll mid = (l + r) >> ;
if(L <= mid ) update1(L,R,l,mid,ls(p),k);
if(R > mid) update1(L,R,mid+,r,rs(p),k);
push_up(p);
}
inline void update2(ll p,ll l,ll r,ll k,ll tar)
{
if(r == l)
{
t[p].min = k;
t[p].max = k;
t[p].sum = k;
return;
}
ll mid = (l + r) >> ;
push_down(p,l,r);
if(tar > mid ) update2(rs(p),mid + ,r,k,tar);
else update2(ls(p),l,mid,k,tar);
push_up(p);
}
ll query1(ll L,ll R,ll l,ll r,ll p)
{
ll ans = ;
if(L <= l&& r <= R)
return t[p].sum;
ll mid = (l + r) >> ;
push_down(p,l,r);
if(L <= mid) ans +=query1(L,R,l,mid,ls(p));
if(R > mid) ans +=query1(L,R,mid+,r,rs(p));
return ans;
}
ll query2(ll L,ll R,ll l,ll r,ll p)
{
if(L <= l && r <= R)
{
return t[p].max;
}
push_down(p,l,r);
ll ans = - LINF;
ll mid = (l + r) >> ;
if(L <= mid)
{
ans = max(ans,query2(L,R,l,mid,ls(p)));
}
if(R > mid)
{
ans = max(ans,query2(L,R,mid + ,r,rs(p)));
}
return ans;
}
ll query3(ll L,ll R,ll l,ll r,ll p)
{
if(L <= l && r <= R)
return t[p].min;
push_down(p,l,r);
ll ans = LINF;
ll mid = (l + r) >> ;
if(L <= mid)
ans = min(ans,query3(L,R,l,mid,ls(p)));
if(R > mid)
ans = min(ans,query3(L,R,mid+,r,rs(p)));
return ans;
}
int main(int argc, char const *argv[])
{
scanf("%lld%lld",&n,&m);
for(int i = ;i <= n;++i)
scanf("%lld",&a[i]);
char op[];
ll L,R,k,pos;
build(,,n);
while(m--)
{
scanf(" %s",op);
if(op[] == '')
{
scanf("%lld%lld%lld",&L,&R,&k);
update1(L,R,,n,,k);
}
else if(op[] == '')
{
scanf("%lld%lld%lld",&L,&R,&k);
k = -k;
update1(L,R,,n,,k);
}
else if(op[] == '')
{
scanf("%lld%lld",&pos,&k);
update2(,,n,k,pos);
}
else if(op[] == '')
{
scanf("%lld%lld",&L,&R);
printf("%lld\n",query2(L,R,,n,));
}
else if(op[] == '')
{
scanf("%lld%lld",&L,&R);
printf("%lld\n",query3(L,R,,n,));
}
else{
scanf("%lld%lld",&L,&R);
printf("%lld\n",query1(L,R,,n,));
}
}
return ;
}

以后千万不能带个错误的线段树板子了

2019CSUST集训队选拔赛题解(一)的更多相关文章

  1. 2019CSUST集训队选拔赛题解(二)

    凛冬将至 Description 维斯特洛大陆的原住民是森林之子,他们长得如孩童一般,善于使用石器,威力值35,用树叶树枝作为衣物,在森林里繁衍生息,与万物和平相处.他们会使用古老的魔法(比如绿之视野 ...

  2. 2019CSUST集训队选拔赛题解(三)

    PY学长的放毒题 Description 下面开始PY的香港之行,PY有n个要去的小吃店,这n个小吃店被m条路径联通起来. PY有1个传送石和n−1个传送石碎片. PY可以用传送石标记一个小吃店作为根 ...

  3. CSUST 集训队选拔赛题解

    选拔赛的题解,~~~ 题目链接:请点击 A题 素数筛 + 线段树(树状数组) 先用素数筛打表,然后线段树更新,遍历求出值,O(1)查询即可 AC代码: /*num数组 是把记录 数是否存在 存在即为1 ...

  4. 2015苏州大学ACM-ICPC集训队选拔赛(3)题解

    第三次校赛链接:快戳我 1001 考虑前半组数,我们只需要标记每个数出现的次数,再加上这个数之前的数出现的次数,即为这个数在m次操作中总共需要翻转的次数(即求前缀和),再根据翻转的奇偶性判断最后这个位 ...

  5. CSUST选拔赛题解

    本鶸鸡于本月10号参加了蔽校的选拔赛,成绩差的死,大部分的题都是赛后花了好长时间才补出来的,其中有些题还是靠QAQorz大佬帮忙才能解决,感谢Qls对我的帮助~接下来就附带上我的暴力题解,大佬们有更好 ...

  6. 江西理工大学南昌校区acm选拔赛题解

    第一题略 第二题 #include<stdio.h> int main() { int a1,a2,a3,b1,b3,b2,c1,c2,c3,n,sum,d1,d2,d3,i; scanf ...

  7. hdu 2155 小黑的镇魂曲(dp) 2008信息工程学院集训队——选拔赛

    感觉蛮坑的一道题. 题意很像一个叫“是男人下100层”的游戏.不过多了个时间限制,要求在限定时间内从某一点下落到地面.还多了个最大下落高度,一次最多下落这么高,要不然会摔死. 一开始想dp的,然后想了 ...

  8. 2019年华南理工大学软件学院ACM集训队选拔赛 Round1

    TIps: 1.所有代码中博主使用了scanf和printf作为输入输出  2.代码中使用了define LL long long 所以在声明变量的时候 LL其实就等价于long long 希望这两点 ...

  9. ypACM社团年终赛暨实验室选拔赛题解

    记得补题,题目两小时半还是挺困难ak的,毕竟我验题也验了几天的时间,题目基本没有锅.题目基本属于简单题 我的三道题都是很基本的题目,希望大家补题 这些题解都是我写的,如果有疑问可以qq问我 所有的核心 ...

随机推荐

  1. ./redis-trib.rb 报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 0 is already busy (Redis::CommandError)

    错误提示是 slot插槽被占用了(这是 搭建集群前时,以前redis的旧数据和配置信息没有清理干净.) 解决方案是 用redis-cli 登录到每个节点执行  flushall  和 cluster ...

  2. Python基础 条件判断和循环

    pyhton if 语句 if 语句后接表达式,然后用: 表示代码块. age = 20 if age >= 18: print 'your age is', age print 'adult' ...

  3. 基于 HTML5 Canvas 的机房温度云图展示

    前言 在物联网的大趋势下,机房的设备信息以及一些环境信息变成了数据摆在了人们面前.在这个大数据的时代,数据的可视化不仅体现在数据值本身,更应该通过数据的变化来获取一些信息.我们今天的主题,机房温度云图 ...

  4. 解决vscode换行光标跳转行首

    这个问题是由于设置自动保存而造成的. 解决方法1:取消自动保存. 解决方法2:在首选项的设置里加上"files.autoSaveDelay": 10000,延迟一小会自动保存的时间 ...

  5. 写 5 个你知道的 HTML5 标签,说明他们的意义

    1:<canvas>标签   定义图形.图像,是基于javascript的绘图API 2:<video>标签   定义视频 3:<audio>标签  定义音频内容 ...

  6. 百度地图热力图--批量地址转换应用(基于百度api)

    需求:把外卖订餐地址做个用户分布热力图 思路分析:第一步去百度地图api开放平台找例子 http://lbsyun.baidu.com/jsdemo.htm#c1_15 首先从百度API的demo例子 ...

  7. stm32按键FIFO的实现

    学习目标: 1.理解FIFO的基本概念和设计按键FIFO的意义   2.写出实现按键FIFO的代码 1.设计按键FIFO的优点 要介绍实现按键FIFO的优点,首先要了解FIFO的一些基本概念.FIFO ...

  8. python学习笔记(二):基础知识点

    python基本元素 7 // 2 3 7 % 3 1 # 取商以及余数 divmod(7,3) (2, 1) 1j*1j (-1+0j) 10/3 3.3333333333333335 '3,''1 ...

  9. SWT_之Table篇

    package edu.ch4; import org.eclipse.swt.SWT;import org.eclipse.swt.events.SelectionAdapter;import or ...

  10. 20155212 ch02 课下作业

    20155212 ch02 课下作业 T1 题目 参考附图代码,编写一个程序 "week0601学号.c",判断一下你的电脑是大端还是小端 相关知识 小端法:最低有效字节在最前面 ...