BZOJ 4695 最假女选手 线段树
题意:
给定一个长度为 N序列,编号从1 到 N。要求支持下面几种操作:
分析:
你听说过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 最假女选手 线段树的更多相关文章
- BZOJ.4695.最假女选手(线段树 Segment tree Beats!)
题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时 ...
- bzoj 4695 最假女选手 吉利线段树
最假女选手 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 480 Solved: 118[Submit][Status][Discuss] Desc ...
- bzoj 4695: 最假女选手 && Gorgeous Sequence HDU - 5306 && (bzoj5312 冒险 || 小B的序列) && bzoj4355: Play with sequence
算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的 ...
- bzoj 4695: 最假女选手
……一道丧病线段树膜板题…… 被常数卡的死去活来……QAQ 学到了些奇技淫巧:把取min标记 和 区间最小值 合并 可以快很多…… #include <bits/stdc++.h> #de ...
- 【bzoj4695】最假女选手 线段树区间最值操作
题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作:1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] 里大于 ...
- BZOJ4695 最假女选手(势能线段树)
BZOJ题目传送门 终于体会到初步掌握势能分析思想的重要性了. 一开始看题,感觉套路还是很一般啊qwq.直接在线段树上维护最大值和最小值,每次递归更新的时候,如果不能完全覆盖就暴力递归下去.挺好写的欸 ...
- 2018.07.27 bzoj4695: 最假女选手(线段树)
传送门 线段树好题 支持区间加,区间取min" role="presentation" style="position: relative;"> ...
- bzoj4695 最假女选手(势能线段树/吉司机线段树)题解
题意: 已知\(n\)个数字,进行以下操作: \(1.\)给一个区间\([L,R]\) 加上一个数\(x\) \(2.\)把一个区间\([L,R]\) 里小于\(x\) 的数变成\(x\) \(3.\ ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
随机推荐
- 学习笔记::AC自动机
最先开始以为和自动刷题机是一个东西... 其实就是kmp的一个拓展.学完kmp再学这个就会发现其实不难 1.kmp是一个串匹配一个串,但是当我们想用多个串匹配一个文本的时候,kmp就不行了,因此我们有 ...
- bzoj 2005: [Noi2010]能量采集【莫比乌斯反演】
注意到k=gcd(x,y)-1,所以答案是 \[ 2*(\sum_{i=1}^{n}\sum_{i=1}^{m}gcd(i,j))-n*m \] 去掉前面的乘和后面的减,用莫比乌斯反演来推,设n< ...
- poj 2391 Ombrophobic Bovines【最大流】
我%--&(¥--,调了一下午,最后发现P赋值1e5能过,赋值1e6就会TLE致死.改了一下午加一晚上然而这是为什么??? 一种常见的建图套路,首先二分答案,注意上界要取大一点,1e9是不行的 ...
- ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第二天(非原创)
文章大纲 一.课程介绍二.整合淘淘商城ssm项目三.Mybatis分页插件PageHelper使用四.整合测试五.项目源码与资料下载六.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业 ...
- 使用VirtualBox的时候虚拟机无法ping通windows主机,但是主机可以ping通虚拟机
问题原因是windows开启了防火墙导致的,将windows的防火墙关闭即可. 关闭windows防火墙后会有警告的信息出现,直接无视即可.
- iOS-UI控件之UIImageView
contentMode属性 带有scale单词的:图片有可能会拉伸 UIViewContentModeScaleToFill 将图片拉伸至填充整个imageView 图片显示的尺寸跟imageView ...
- 字符串(String)几个常用方法的详解
String:(字符串) indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. stringObject.indexOf(searchvalue,fromindex) searc ...
- windows echo命令
ECHO命令是大家都熟悉的DOS批处理命令的一条子命令,但它的一些功能和用法也许你并不是全都知道,不信你瞧: 1. 作为控制批处理命令在执行时是否显示命令行自身的开关 格式:ECHO [ON|OFF ...
- mac webstrom 安装less
1.检验电脑是否安装less lessc -v 2.如果没有执行全局安装命令 npm install -g less 3.webstrom -> Preferencs-> File Wat ...
- WEB下的excel批量导入功能
新手学习中,记录一下excel导出功能实现的整个流程.使用框架ssm. control层 importExcel+parseDataItem: @RequestMapping("import ...