吉司机课件题。

区间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 线段树的更多相关文章

  1. 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 ...

  2. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  6. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  7. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. hdu 1542 线段树扫描(面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

随机推荐

  1. Spring入门学习笔记(3)——事件处理类

    目录 Spring中的事件处理 Spring内建事件 监听Context事件 Example 自定义Spring事件 Spring中的事件处理 ApplicationContext 是Spring的核 ...

  2. Docker入门与实践之 Dockerfile 语法详解

    一.Dockerfile 概述 Dockerfile是docker程序的解释脚本文件,Dockerfile 是一条一条的指令,Docker程序将dockerfile中的一条条指令编译成Linux可执行 ...

  3. Shader做剪影效果

    某渣渣甩了一个需求给我,并且说我不会写.我明知是激将法,但是想想这需求也太简单了,我好像也不怎么会QAQ.为了表示我对shader的热爱,写就写. 需求是这样的: 这是一个漂亮的MM,但是渣渣不想让人 ...

  4. R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲

    这两天,由于要做一个文本分析的内容,所以搜索了一天R语言中的可以做文本分析的加载包,但是在安装包的过程,真是被虐千百遍,总是安装不成功.特此专门写一篇博文,把整个心塞史畅快的释放一下. ------- ...

  5. Scrum立会报告+燃尽图(十二月十日总第四十一次):用户推广

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2484 项目地址:https://git.coding.net/zhang ...

  6. 20145214 《网络对抗技术》 MSF基础应用

    20145214 <网络对抗技术> MSF基础应用 1.实验后回答问题--用自己的话解释什么是exploit,payload,encode 如果把MSF比作一把枪的话,payload应该是 ...

  7. CentOS中Intel i350T4驱动安装

    2015.3.31 在linux*中直接按解决方法中安装i350驱动即可 *************************************************************** ...

  8. 第二阶段Sprint冲刺会议6

    进展:将“录制”及“保存”整合到一起,修复出现的Bug,使之能够正常运行.

  9. 猫咪记单词——NABCD模型分析

    N ——Need 需求:学习英语是一件非常重要的事.面对各种各样的考试,学习英语,最重要的就是词汇量,背单词是提高词汇量的最直接的方法,但是单纯的背单词太单调.寻找一些合适的,更易于接受的背单词学习英 ...

  10. ORACLE_SQL

    --建立学生表create table Student (       Sno char(9) primary key,       Sname char(20)unique,       Sex  ...