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 ...
随机推荐
- Mysql数据库的隔离级别
Mysql数据库的隔离级别有四种 1.read umcommitted 读未提交(当前事务可以读取其他事务没提交的数据,会读取到脏数据) 2.read committed 读已提交(当前事务不能读 ...
- Redux和React-Redux的实现(三):中间件的原理和applyMiddleware、Thunk的实现
现在我们的Redux和React-Redux已经基本实现了,在Redux中,触发一个action,reducer立即就能算出相应的state,如果我要过一会才让reducer计算state呢怎么办?也 ...
- 2017年第八届蓝桥杯【C++省赛B组】
1.标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有 ...
- LeetCode 404. Sum of Left Leaves (C++)
题目: Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are t ...
- [东北师大软工]Week2-作业2:个人项目实战 初步测试结果
作业地址 https://edu.cnblogs.com/campus/nenu/2016SE_NENU/homework/1656 测试须知 测试机为Windows环境,所有提交到Coding.ne ...
- 20162327WJH第二次实验——树
20162327WJH第一次实验--线性结构 实 验 报 告 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验 ...
- Servet3.0于Servlet2.5比较
Servet3.0于Servlet2.5比较恢复 首先是利用注解代替配置文件 Servlet2.5利用配置文件对Servlet进行配置 例如这样 <servlet> <servlet ...
- mybatis连接数据库的几种方式
1.可以通过配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht ...
- 牛客网国庆集训派对Day5 题目 2018年
链接:https://www.nowcoder.com/acm/contest/205/L来源:牛客网参考博客:https://blog.csdn.net/HTallperson/article/de ...
- grunt入门讲解4:如何创建task(任务)
每当运行Grunt时, 你可以为其指定一个或多个任务, 这些任务用于告诉Grunt你想要它做什么事情. 如果你没有指定一个任务,并且你已经定义一个名为 "default" 的任务, ...