HDU 5306 线段树
吉司机课件题。
区间min,区间最值,区间和。
如果用最大值和次大值能更新区间和那就更新打标记,否则暴力dfs。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define inf 0x3f3f3f3f
#define N 500005
#define LL long long
#define ls x<<1,l,mid
#define rs x<<1|1,mid+1,r
using namespace std;
int n,m;
int as[N];
struct node
{
LL sum;
int mx,num,se;
int lazy;
}a[N*];
inline int read()
{
int p=;char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<='')p=p*+c-'',c=getchar();
return p;
}
void push_up(int x)
{
int l=x<<,r=x<<|;
a[x].mx=a[l].mx;a[x].num=a[l].num;a[x].se=a[l].se;a[x].sum=a[l].sum+a[r].sum;
if(a[r].mx==a[x].mx)a[x].num+=a[r].num,a[x].se=max(a[x].se,a[r].se);
else if(a[r].mx<a[x].mx)a[x].se=max(a[x].se,a[r].mx);
else
{
a[x].se=max(a[x].mx,a[r].se);
a[x].mx=a[r].mx;
a[x].num=a[r].num;
}
return ;
}
void push_down(int x)
{
a[x].lazy=;
int l=x<<,r=x<<|,val=a[x].mx;
if(a[l].mx>val)
{
a[l].sum-=1LL*a[l].num*(a[l].mx-val);
a[l].lazy=;a[l].mx=val;
}
if(a[r].mx>val)
{
a[r].sum-=1LL*a[r].num*(a[r].mx-val);
a[r].lazy=;a[r].mx=val;
}
}
void build(int x,int l,int r)
{
a[x].se=-;
a[x].lazy=;
if(l==r)
{
a[x].num=;
a[x].mx=as[l];
a[x].sum=as[l];
return ;
}
int mid=(l+r)>>;
build(ls);
build(rs);
push_up(x);
}
int qurmx(int x,int l,int r,int ll,int rr)
{
if(l>=ll&&r<=rr)
{
return a[x].mx;
}
if(a[x].lazy)push_down(x);
int mid=(l+r)>>;
if(ll>mid)return qurmx(rs,ll,rr);
if(rr<=mid)return qurmx(ls,ll,rr);
return max(qurmx(ls,ll,rr),qurmx(rs,ll,rr));
}
LL qursum(int x,int l,int r,int ll,int rr)
{
if(l>=ll&&r<=rr)
{
return a[x].sum;
}
if(a[x].lazy)push_down(x);
int mid=(l+r)>>;
if(ll>mid)return qursum(rs,ll,rr);
if(rr<=mid)return qursum(ls,ll,rr);
return qursum(ls,ll,rr)+qursum(rs,ll,rr);
}
void gai(int x,int l,int r,int ll,int rr,int z)
{
if(z>=a[x].mx)return ;
if(l>=ll&&r<=rr)
{
if(z>a[x].se)
{
a[x].lazy=;
a[x].sum-=1LL*a[x].num*(a[x].mx-z);
a[x].mx=z;return ;
}
}
if(a[x].lazy)push_down(x);
int mid=(l+r)>>;
if(ll<=mid)gai(ls,ll,rr,z);
if(rr>mid)gai(rs,ll,rr,z);
push_up(x);
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)as[i]=read();
build(,,n);int op,t1,t2,t3;
for(int i=;i<=m;i++)
{
op=read();
if(op==)
{
t1=read();t2=read();t3=read();
gai(,,n,t1,t2,t3);
}
else if(op==)
{
t1=read();t2=read();
printf("%d\n",qurmx(,,n,t1,t2));
}
else
{
t1=read();t2=read();
printf("%lld\n",qursum(,,n,t1,t2));
}
}
}
return ;
}
HDU 5306 线段树的更多相关文章
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- Gaussian Models
Warming Up Before we talk about multivariate Gaussian, let's first review univariate Gaussian, which ...
- 用线性分类器实现预测鸢尾花的种类(python)
这是个人学习时跑的代码,结果就不贴了,有需要的可以自己运行,仅供参考,有不知道的可以私下交流,有问题也可以联系我.当然了我也只能提供一点建议,毕竟我也只是初学者 第一个页面 # -*- coding: ...
- Vue+webpack报错: listen EADDRINUSE: address already in use :::8080
如果本地运行多个vue+webpack项目会报错:listen EADDRINUSE: address already in use :::8080: 提示含义:地址端口已经被占用 注:8080指的是 ...
- JS进阶系列之闭包
刚刚总结完作用域链,我觉得很有必要马上对闭包总结一下,因为,之前也写过自己对闭包的理解,那时候只知道,闭包就是可以访问别的函数变量的函数,就是在函数里面的函数就叫做闭包,可是并没有深入探究,为什么,可 ...
- 实验三:跟踪分析Linux内核的启动过程
实验三:跟踪分析Linux内核的启动过程 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.16 ...
- 20172319 2018.03.27-04.05 《Java程序设计》第4周学习总结
20172319 2018.03.27-04.05 <Java程序设计>第4周学习总结 教材学习内容总结 第四章 编写类 类与对象的回顾:对象是有状态的,状态由对象的属性值确定.属性由类中 ...
- Sprint6
进展:今天更改一下我们的计划,从实现主要功能开始,及闹钟和事件提醒部分.查看了一些有关闹钟部分的资料.
- python learning Network Programming.py
Socket # 用一个 Socke t表示"打开了一个网络连接" # 打开一个 Socket 需要知道目标计算机的IP地址和端口号,再指定协议类型即可. # TCP # 主动发起 ...
- linux 无交互生成ssh rsa免秘证书
[root@xxx tmp]# man ssh-keygen NAME ssh-keygen - authentication key generation, management and conve ...
- [转帖]CPU 的缓存
缓存这个词想必大家都听过,其实缓存的意义很广泛:电脑整机最大的缓存可以体现为内存条.显卡上的显存就是显卡芯片所需要用到的缓存.硬盘上也有相对应的缓存.CPU有着最快的缓存(L1.L2.L3缓存等),缓 ...