题意:

  给定一个长度为 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. 关于eclipse部署项目后,在tomcat中的webapps文件夹下没有项目

    转自:https://blog.csdn.net/yang505581644/article/details/78802316 一.发现问题 在eclipse中新建Dynamic Web Projec ...

  2. ExtJS Form

    form表单中多选框和复选框 Ext.require([ 'Ext.form.*', 'Ext.layout.container.Column', 'Ext.window.MessageBox', ' ...

  3. The Power of Android Action Bars(转载)

    转自:http://www.informit.com/articles/article.aspx?p=1743642

  4. 莫比乌斯反演总结——Chemist

    懵逼乌斯反演果然名不虚传,自闭了两天的我打算学习一下这一块比较实用的数论内容. (注:1.为了区分狄尼克雷卷积与乘法,本篇文章中乘号全部省略,卷积全部用" * "表示.2.用gcd ...

  5. 打开CAD时出现“acvmtools.arx ARX命令中发生异常

    打开CAD时出现“acvmtools.arx ARX命令中发生异常     解决办法1: 试试进入CAD安装的目录,删掉它acvmtools.arx,重新打开cad.(注:acvmtools.arx一 ...

  6. AutoCAD2012启动错误 1308 源文件未找到

    启动AutoCAD2012时,弹出错误1308,如图所示: 是何原因? 对CAD的运行有何影响?

  7. SIFT特征点检测与匹配

    SIFT的步骤如下: (1) 尺度空间极值检测(Scale-space Extrema Detection) 也就是在多尺度高斯差分(Difference of Gauss)空间中检测极值点(3x3x ...

  8. bitset优化背包问题

    https://blog.csdn.net/HowardEmily/article/details/77340566 留坑待填

  9. Linux磁盘分区、格式化和挂载

    一.查看磁盘使用 [root@iZ88rvassw1Z ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G .3G 3 ...

  10. synchronized(3)修饰语句块之:synchronized(一般对象)

    synchronized(一般对象) 一次只有一个线程进入该代码块.此时,线程获得的是成员锁.例如: public class Thread7 { private Object xlock = new ...