题意:

  给定一个长度为 N序列,编号从1 到 N。要求支持下面几种操作:

  1.给一个区间[L,R] 加上一个数x 
  2.把一个区间[L,R] 里小于x 的数变成x 
  3.把一个区间[L,R] 里大于x 的数变成x 
  4.求区间[L,R] 的和
  5.求区间[L,R] 的最大值
  6.求区间[L,R] 的最小值
 

分析:

  你听说过Segment Tree Beats么?

  快去看一看吧。这题居然才只有六个操作,真的是重口难调啊。

  思想还是不难的,这里就不粘课件了。

  由于这题拥有着比较玄学的空间限制和比较玄学的数据范围,所以可能需要试探很多遍才能不MLE。

  (如果你是指针线段树我也没啥可说的)

  代码是我修改抄袭一位大神的,予以美化(好像更难读了),以便于非指针用户食用。

代码:

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3.7e5+,inf=1e9;
struct node{
int l,r,ls,rs,mnc,mxc;//标号为1代表最值
ll mn1,mn2,mx1,mx2;//,为2代表次值
ll lmn,lmx,lad,s;//c代表的是count数量,不是次
}t[N<<];int cnt=,rt,n,m,x;
char readchar(){
static char buf[],*l=buf,*r=buf;
if(l==r) r=(l=buf)+fread(buf,,,stdin);
if(l==r) return EOF;return *l++;}
int read(){
int x=,f=;char ch=readchar();
while(ch<''||ch>''){if(ch=='-') f=-f;ch=readchar();}
while(ch<=''&&ch>=''){x=(x<<)+(x<<)+ch-'';ch=readchar();};
return x*f;
} void pushup(int cur){
int ls=t[cur].ls,rs=t[cur].rs;
t[cur].s=t[ls].s+t[rs].s;
if(t[ls].mn1<t[rs].mn1)
t[cur].mn1=t[ls].mn1,
t[cur].mnc=t[ls].mnc,
t[cur].mn2=min(t[ls].mn2,t[rs].mn1);
else if(t[ls].mn1>t[rs].mn1)
t[cur].mn1=t[rs].mn1,
t[cur].mnc=t[rs].mnc,
t[cur].mn2=min(t[rs].mn2,t[ls].mn1);
else t[cur].mn1=t[ls].mn1,
t[cur].mnc=t[ls].mnc+t[rs].mnc,
t[cur].mn2=min(t[ls].mn2,t[rs].mn2);
if(t[ls].mx1>t[rs].mx1)
t[cur].mx1=t[ls].mx1,
t[cur].mxc=t[ls].mxc,
t[cur].mx2=max(t[ls].mx2,t[rs].mx1);
else if(t[ls].mx1<t[rs].mx1)
t[cur].mx1=t[rs].mx1,
t[cur].mxc=t[rs].mxc,
t[cur].mx2=max(t[rs].mx2,t[ls].mx1);
else t[cur].mx1=t[ls].mx1,
t[cur].mxc=t[ls].mxc+t[rs].mxc,
t[cur].mx2=max(t[ls].mx2,t[rs].mx2);
} void adsm(int cur,ll x){
t[cur].mn1+=x;t[cur].mx1+=x;
if(t[cur].mn2!= inf) t[cur].mn2+=x;
if(t[cur].mx2!=-inf) t[cur].mx2+=x;
t[cur].s+=x*(t[cur].r-t[cur].l+);
t[cur].lad+=x;return ;
} void admn(int cur,ll x){
if(t[cur].mn1==t[cur].mx1) t[cur].mx1+=x;
if(t[cur].mn1==t[cur].mx2) t[cur].mx2+=x;
t[cur].lmn+=x;t[cur].mn1+=x;
t[cur].s+=x*t[cur].mnc;return ;
} void admx(int cur,ll x){
if(t[cur].mn1==t[cur].mx1) t[cur].mn1+=x;
if(t[cur].mx1==t[cur].mn2) t[cur].mn2+=x;
t[cur].mx1+=x;t[cur].lmx+=x;
t[cur].s+=x*t[cur].mxc;return ;
} void pushdown(int cur){
int ls=t[cur].ls,rs=t[cur].rs;
if(t[cur].lad) adsm(ls,t[cur].lad),
adsm(rs,t[cur].lad),t[cur].lad=;
if(t[cur].lmn){
if(t[ls].mn1<=t[rs].mn1)
admn(ls,t[cur].lmn);
if(t[ls].mn1>=t[rs].mn1)
admn(rs,t[cur].lmn);t[cur].lmn=;
} if(t[cur].lmx){
if(t[ls].mx1>=t[rs].mx1)
admx(ls,t[cur].lmx);
if(t[ls].mx1<=t[rs].mx1)
admx(rs,t[cur].lmx);t[cur].lmx=;
} return ;
} void build(int l,int r,int cur){
t[cur].l=l,t[cur].r=r;
if(l==r){ t[cur].mxc=;
t[cur].ls=t[cur].rs=-;t[cur].mnc=;
t[cur].lmn=t[cur].lmx=t[cur].lad=;
t[cur].s=t[cur].mx1=t[cur].mn1=read();
t[cur].mn2=inf;t[cur].mx2=-inf;return ;
} int mid=l+r>>;
t[cur].ls=cnt++;t[cur].rs=cnt++;
build(l,mid,t[cur].ls);
build(mid+,r,t[cur].rs);
pushup(cur);return ;
}
#define sum(x,y) x+y;
#define upd(fun,lm,req,tag) \
void fun(int l,int r,int cur){ \
if(lm) return ; \
if(l<=t[cur].l&&t[cur].r<=r&&req) \
{tag;return ;} pushdown(cur); \
int mid=t[cur].l+t[cur].r>>; \
if(l<=mid) fun(l,r,t[cur].ls); \
if(mid<r) fun(l,r,t[cur].rs); \
pushup(cur);return ; \
}
#define qry(fun,typ,ret,op) \
typ fun(int l,int r,int cur){ \
int ls=t[cur].ls,rs=t[cur].rs; \
if(l<=t[cur].l&&t[cur].r<=r) return ret;\
pushdown(cur); \
int mid=t[cur].l+t[cur].r>>; \
if(r<=mid) return fun(l,r,ls); \
if(mid<l) return fun(l,r,rs); \
return op(fun(l,r,ls),fun(l,r,rs)); \
}
upd(uad,,,adsm(cur,x))
upd(umn,t[cur].mn1>=x,t[cur].mn2>x,
admn(cur,x-t[cur].mn1))
upd(umx,t[cur].mx1<=x,t[cur].mx2<x,
admx(cur,x-t[cur].mx1))
qry(qsm,ll,t[cur].s,sum)
qry(qmx,ll,t[cur].mx1,max)
qry(qmn,ll,t[cur].mn1,min)
signed main(){
rt=cnt++;n=read();
build(,n,rt);m=read();
for(int l,r,op;m--;){
op=read();l=read();r=read();
if(op<=) x=read();
if(op==) uad(l,r,rt);
if(op==) umn(l,r,rt);
if(op==) umx(l,r,rt);
if(op==) printf("%lld\n",qsm(l,r,rt));
if(op==) printf("%lld\n",qmx(l,r,rt));
if(op==) printf("%lld\n",qmn(l,r,rt));
} return ;
}

Segment Tree Beats!

BZOJ 4695 最假女选手 线段树的更多相关文章

  1. BZOJ.4695.最假女选手(线段树 Segment tree Beats!)

    题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时 ...

  2. bzoj 4695 最假女选手 吉利线段树

    最假女选手 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 480  Solved: 118[Submit][Status][Discuss] Desc ...

  3. bzoj 4695: 最假女选手 && Gorgeous Sequence HDU - 5306 && (bzoj5312 冒险 || 小B的序列) && bzoj4355: Play with sequence

    算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的 ...

  4. bzoj 4695: 最假女选手

    ……一道丧病线段树膜板题…… 被常数卡的死去活来……QAQ 学到了些奇技淫巧:把取min标记 和 区间最小值 合并 可以快很多…… #include <bits/stdc++.h> #de ...

  5. 【bzoj4695】最假女选手 线段树区间最值操作

    题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作:1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] 里大于 ...

  6. BZOJ4695 最假女选手(势能线段树)

    BZOJ题目传送门 终于体会到初步掌握势能分析思想的重要性了. 一开始看题,感觉套路还是很一般啊qwq.直接在线段树上维护最大值和最小值,每次递归更新的时候,如果不能完全覆盖就暴力递归下去.挺好写的欸 ...

  7. 2018.07.27 bzoj4695: 最假女选手(线段树)

    传送门 线段树好题 支持区间加,区间取min" role="presentation" style="position: relative;"> ...

  8. bzoj4695 最假女选手(势能线段树/吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)给一个区间\([L,R]\) 加上一个数\(x\) \(2.\)把一个区间\([L,R]\) 里小于\(x\) 的数变成\(x\) \(3.\ ...

  9. [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】

    题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...

随机推荐

  1. WEB开发框架系列教程 (一)快速创建解决方案

    执行<华东信息辅助开发工具> 程序 打开程序界面如下图 输入用户名.密码进行登录 如果暂时还没有用户名和密码,点击注册提供机器码给管理员进行注册. 管理员QQ:93346562 下图是:点 ...

  2. Pessimistic Offline Lock悲观离线锁

    每次只允许一个业务事务来访问数据,以防止并发业务事务中的冲突. 离线并发处理通常会出现多个业务事务操作同一数据. 最简单的办法是为整个业务事务保持一个系统事务.但是事务系统不适合于处理长事务. 首选乐 ...

  3. Linux 系统管理命令 - iotop - 动态显示磁盘 I/O 统计信息

    命令详解 重要星级: ★★★★☆ 功能说明: iotop 命令是一款实时监控磁盘 I/O 的工具, 但必须以 root 用户的身份运行.使用 iotop 命令可以很方便的查看每个进程使用磁盘 I/O ...

  4. 利用jenv安装maven, tomcat,zookeeper等

    jenv有关的网站: http://jenv.io https://github.com/gcuisinier/jenv 1.  执行jenv安装 $ curl -L -s get.jenv.io | ...

  5. Quartz.NET一个开源的作业调度框架

    Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和 ...

  6. 机器学习基础算法__python实现(基于numpy等基础库)

    # 博客转自https://blog.csdn.net/weixin_39561100/article/details/80879211 主要是将<机器学习实战>中的算法实现一遍,后续会慢 ...

  7. K - KazaQ’s Socks

    Bryce1010模板 #include <bits/stdc++.h> using namespace std; #define LL long long int main() { LL ...

  8. 数论(GCD) HDOJ 4320 Arcane Numbers 1

    题目传送门 题意:有一个A进制的有限小数,问能否转换成B进制的有限小数 分析:0.123在A进制下表示成:1/A + 2/(A^2) + 3 / (A^3),转换成B进制就是不断的乘B直到为0,即(1 ...

  9. GIT配置及用法

    ssh配置 TortoiseGit配置 用法: 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓 ...

  10. 坑爹的鲁大师,VMware Workstation 报错(AsyncSocket error)一例解决

    今天准备把电脑上安装的VMware Play换成VMware Workstation,毕竟 Workstation 的快照功能还是很有必要的. 结果,VMware Workstation 安装成功后, ...