【bzoj4695】最假女选手
zcy的励志故事.jpg
傻逼zcy突然想立一个flag,写一个segment-tree-beats的题娱乐一下
于是他就想起了这道题。
他打算今晚写完
然后光是写他就写的头昏脑涨,还犯了询问写反这种傻逼错误
后来他发现调不出来了
然后调了快2h,写个暴力对拍才发现pushup写的是萎的。
这题其实就是很恶心的吧操作扔在一起
但是还是维护最大值,最大值出现次数,次大值能解决的问题。
标记合并的时候注意讨论下,细节有点多,样例比较彩笔
建议提交之前先测试所有操作或者跟暴力对拍。
#include<bits/stdc++.h>
#define N 600005
#define lson (o<<1)
#define rson (o<<1|1)
#define inf 1<<30
using namespace std;
typedef long long ll;
int n;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
//Segment-Tree-Beats!
int maxv[N<<],seca[N<<],cnta[N<<],minv[N<<],seci[N<<],cnti[N<<],tagv[N<<];
ll sumv[N<<];
inline void pushup(int o){
int l=o<<,r=o<<|;sumv[o]=sumv[l]+sumv[r];
if(maxv[l]==maxv[r])maxv[o]=maxv[l],cnta[o]=cnta[l]+cnta[r],seca[o]=max(seca[l],seca[r]);
else{
if(maxv[l]>maxv[r]) swap(l,r);maxv[o]=maxv[r]; cnta[o]=cnta[r];seca[o]=max(seca[r],maxv[l]);
}
if(minv[l]==minv[r])
minv[o]=minv[l],cnti[o]=cnti[l]+cnti[r],seci[o]=min(seci[l],seci[r]);
else{
if(minv[l]<minv[r]) swap(l,r);minv[o]=minv[r]; cnti[o]=cnti[r];seci[o]=min(seci[r],minv[l]);
}
}
inline void puttag(int o,int l,int r,int v){
tagv[o]+=v;sumv[o]+=(ll)(r-l+)*v;
minv[o]+=v;maxv[o]+=v;seca[o]+=v;seci[o]+=v;
}
inline void tmax(int o,int l,int r,int v){
sumv[o]+=(ll)(cnti[o])*(v-minv[o]);
minv[o]=v;maxv[o]=max(v,maxv[o]);
if(minv[o]==maxv[o]){
sumv[o]=1LL*(r-l+)*v;cnta[o]=cnti[o]=r-l+;seca[o]=-inf;seci[o]=inf;
}else seca[o]=max(v,seca[o]);
}
inline void tmin(int o,int l,int r,int v){
sumv[o]-=(ll)(cnta[o])*(maxv[o]-v);
maxv[o]=v;minv[o]=min(v,minv[o]);
if(maxv[o]==minv[o]){
sumv[o]=(ll)(r-l+)*v;cnta[o]=cnti[o]=r-l+;seca[o]=-inf;seci[o]=inf;
}else seci[o]=min(v,seci[o]);
}
inline void pushdown(int o,int l,int r){
int mid=(l+r)>>;
if(tagv[o]){
puttag(lson,l,mid,tagv[o]);puttag(rson,mid+,r,tagv[o]);
tagv[o]=;
}
if(maxv[lson]>maxv[o]&&seca[lson]<maxv[o])tmin(lson,l,mid,maxv[o]);
if(maxv[rson]>maxv[o]&&seca[rson]<maxv[o])tmin(rson,mid+,r,maxv[o]);
if(minv[lson]<minv[o]&&seci[lson]>minv[o])tmax(lson,l,mid,minv[o]);
if(minv[rson]<minv[o]&&seci[rson]>minv[o])tmax(rson,mid+,r,minv[o]);
}
void build(int o,int l,int r){
tagv[o]=;
if(l==r){
int x=read();
sumv[o]=maxv[o]=minv[o]=x;cnta[o]=cnti[o]=;seca[o]=-inf;seci[o]=inf;tagv[o]=;return;
}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
pushup(o);
}
void changemax(int o,int l,int r,int ql,int qr,int v){
if(minv[o]>=v)return;
if(ql<=l&&r<=qr&&v<seci[o]){tmax(o,l,r,v);return;}
pushdown(o,l,r);int mid=(l+r)>>;
if(ql<=mid)changemax(lson,l,mid,ql,qr,v);
if(qr>mid)changemax(rson,mid+,r,ql,qr,v);
pushup(o);
}
void changemin(int o,int l,int r,int ql,int qr,int v){
if(maxv[o]<=v)return;
if(ql<=l&&r<=qr&&v>seca[o]){tmin(o,l,r,v);return;}
pushdown(o,l,r);int mid=(l+r)>>;
if(ql<=mid)changemin(lson,l,mid,ql,qr,v);
if(qr>mid)changemin(rson,mid+,r,ql,qr,v);
pushup(o);
}
void add(int o,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){puttag(o,l,r,v);return;}
pushdown(o,l,r);int mid=(l+r)>>;
if(ql<=mid)add(lson,l,mid,ql,qr,v);
if(qr>mid)add(rson,mid+,r,ql,qr,v);
pushup(o);
}
int querymax(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return maxv[o];
pushdown(o,l,r);int mid=(l+r)>>,ans=-inf;
if(ql<=mid)ans=max(ans,querymax(lson,l,mid,ql,qr));
if(qr>mid)ans=max(ans,querymax(rson,mid+,r,ql,qr));
return ans;
}
int querymin(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return minv[o];
pushdown(o,l,r);int mid=(l+r)>>,ans=inf;
if(ql<=mid)ans=min(ans,querymin(lson,l,mid,ql,qr));
if(qr>mid)ans=min(ans,querymin(rson,mid+,r,ql,qr));
return ans;
}
ll querysum(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return sumv[o];
pushdown(o,l,r);int mid=(l+r)>>;ll ans=;
if(ql<=mid)ans+=querysum(lson,l,mid,ql,qr);
if(qr>mid)ans+=querysum(rson,mid+,r,ql,qr);
return ans;
}
//End of Segment Tree
int main(){
n=read();build(,,n);
int T=read();
while(T--){
int opt=read(),l=read(),r=read(),v;
if(opt==)v=read(),add(,,n,l,r,v);
if(opt==)v=read(),changemax(,,n,l,r,v);
if(opt==)v=read(),changemin(,,n,l,r,v);
if(opt==)printf("%lld\n",querysum(,,n,l,r));
if(opt==)printf("%d\n",querymax(,,n,l,r));
if(opt==)printf("%d\n",querymin(,,n,l,r));
}
}
这个代码可读性挺不错的,而且只有120行
【bzoj4695】最假女选手的更多相关文章
- BZOJ4695 最假女选手(势能线段树)
BZOJ题目传送门 终于体会到初步掌握势能分析思想的重要性了. 一开始看题,感觉套路还是很一般啊qwq.直接在线段树上维护最大值和最小值,每次递归更新的时候,如果不能完全覆盖就暴力递归下去.挺好写的欸 ...
- 2018.07.27 bzoj4695: 最假女选手(线段树)
传送门 线段树好题 支持区间加,区间取min" role="presentation" style="position: relative;"> ...
- bzoj4695 最假女选手
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4695 [题解] SegmentTree beats!(见jiry_2论文/营员交流) 考虑只 ...
- [BZOJ4695]最假女选手:segment tree beats!
分析 segment tree beats!模板题. 看了gxz的博客突然发现自己写的mxbt和mnbt两个标记没用诶. 代码 #include <bits/stdc++.h> #defi ...
- bzoj4695 最假女选手(势能线段树/吉司机线段树)题解
题意: 已知\(n\)个数字,进行以下操作: \(1.\)给一个区间\([L,R]\) 加上一个数\(x\) \(2.\)把一个区间\([L,R]\) 里小于\(x\) 的数变成\(x\) \(3.\ ...
- bzoj 4695 最假女选手 吉利线段树
最假女选手 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 480 Solved: 118[Submit][Status][Discuss] Desc ...
- 【bzoj4695】最假女选手 线段树区间最值操作
题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作:1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] 里大于 ...
- BZOJ4695:最假女选手
浅谈区间最值操作和历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:https://lydsy.com/JudgeOnline/pr ...
- (WC2016模拟十一)【BZOJ4695】最假女选手
ps:好久没更博啦……这几天连着有模拟赛,等初赛前后休息的时候来疯狂补坑吧……顺便补一下前面的数论啥的? 题解: mdzz我场上写了个15分暴力长度跟标算差不多... 线段树大法好啊!这题听说很多人做 ...
随机推荐
- IOI 98 (POJ 1179)Polygon(区间DP)
很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值. 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少. 但是状态不好转移,因为操 ...
- BZOJ 1057 棋盘制作(最大01相间子矩阵)
求最大01相间子矩阵可以转换为求最大全0子矩阵.只需把棋盘(x+y)为奇数的取反,而该问题可以用经典的悬线法O(n^2)的求解. 悬线法呢. 首先定义b[i][j],为a[i][j]向上的最大连续0的 ...
- 关于 [lambda x: x*i for i in range(4)] 理解
题目: lst = [lambda x: x*i for i in range(4)] res = [m(2) for m in lst] print res 实际输出:[6, 6, 6, 6] 想要 ...
- 20165218 2017-2018-1 《Java程序设计》第一周学习总结
20165218 2017-2018-1 <Java程序设计>第一周学习总结 教材学习内容总结 第一章.Java入门 1. Java特点 Java具有简单.面向对象.平台无关.多线程.动态 ...
- React ref的用法
React的ref有3种用法: 1. 字符串(已废弃)2. 回调函数3. React.createRef() (React16.3提供) 1. 字符串 最早的ref用法. 1.dom节点上使用,通过t ...
- 使用 Intel HAXM 为eclipse安卓模拟器加速
一.下载haxm安装 https://software.intel.com/zh-cn/android/articles/intel-hardware-accelerated-execution-ma ...
- Linux之SSL安全套接字20160704
使用SSL前,先有 基本的TCP套接字连接.见demo代码 SSL_library_init();//在使用OpenSSL 之前,必须进行相应的协议初始化工作 OpenSSL_add_all_algo ...
- sql中按in中的ID进行排序输出
builder.OrderBy("charindex(','+convert(varchar,ID)+',',',"+chufenOrder+"') ");
- 单例 ------ JAVA实现
单例:只能实例化一个对象,使用场景比如打印机. 最推荐的是采用饿汉式:双重校验锁用到了大量的语法,不能保证这些语法在所用场合一定没问题,所以不是很推荐:总之简单的才是最好的,就饿汉式!!! C++ 创 ...
- Sqlserver中如何创建链接服务器
链接服务器在跨数据库/跨服务器查询时非常有用(比如分布式数据库系统中),我将以图文方式详细说明如何利用SQL Server Management Studio在图形界面下创建链接服务器 方法/步骤 ...