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 ...
随机推荐
- Kafka科普系列 | Kafka中的事务是什么样子的?
事务,对于大家来说可能并不陌生,比如数据库事务.分布式事务,那么Kafka中的事务是什么样子的呢? 在说Kafka的事务之前,先要说一下Kafka中幂等的实现.幂等和事务是Kafka 0.11.0.0 ...
- asp.net core如何修改程序监听的端口
asp.net core 默认监听的5000和5001端口,要修改为其他端口有几种方法. 1.硬编码.优点是直观,缺点是每次修改端口都得重新编译程序. public class Program { p ...
- shell--read命令
read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...
- 安装macOS Sierra后怎么找回“任何来源”选项
安装macOS Sierra后,会发现系统偏好设置的“安全与隐私”中默认已经去除了允许“任何来源”App的选项,无法运行一些第三方应用(提示xx.app已经损坏).如果需要恢复允许“任何来源”的选项, ...
- maven实战读书笔记(三)
maven将一系列的步骤都封装为一系列的插件,运行命令后一系列的插件运行
- jdbc连接获取表名称
1,Class.forName可以替换为mysql之类其他的数据库驱动 public Connection connect(String url,String username,String pw, ...
- binding(转)
1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...
- 四则运算<C++>
代码: #include<iostream> #define N 30 using namespace std; void main() { cout<<"***** ...
- DPDK L3fwd 源码阅读
代码部分 整个L3fwd有三千多行代码,但总体思想就是在L2fwd的基础上,增加网络层的根据 IP 地址进行路由查找的内容. main.c 文件 int main(int argc, char **a ...
- ubuntu安装php-curl拓展
首先输入apt-cache search curl | grep php查询curl的php支持名字可能会返回如下内容:php5-curl - CURL module for php5安装:sudo ...