(WC2016模拟十一)【BZOJ4695】最假女选手
ps:好久没更博啦……这几天连着有模拟赛,等初赛前后休息的时候来疯狂补坑吧……顺便补一下前面的数论啥的?
题解:
mdzz我场上写了个15分暴力长度跟标算差不多。。。
线段树大法好啊!这题听说很多人做过,是吉利线段树的模板题。
为什么要叫吉利线段树呢?当然是因为大名鼎鼎的吉老(si)师(ji)啦~~Orzjry
感兴趣的同学可以搜吉老师的2016年国家集训队论文——《区间最值操作与历史最值问题》
当然吉老师有个通(jiu)俗(tiao)易(ke)懂(lian)的课件--->Segment tree Beats!
随手一打就是200行5K+
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 1000000000
#define eps 1e-9
using namespace std;
typedef long long ll;
struct node{
ll v;
int mx,mn,mmx,mmn,mxn,mnn,laz;
}t[];
int n,m,op,l,r,x;
ll num[];
void pushup(int u){
int ls=u*,rs=u*+;
t[u].v=t[ls].v+t[rs].v;
if(t[ls].mx>t[rs].mx){
t[u].mx=t[ls].mx;
t[u].mxn=t[ls].mxn;
t[u].mmx=max(t[ls].mmx,t[rs].mx);
}
if(t[ls].mx<t[rs].mx){
t[u].mx=t[rs].mx;
t[u].mxn=t[rs].mxn;
t[u].mmx=max(t[rs].mmx,t[ls].mx);
}
if(t[ls].mx==t[rs].mx){
t[u].mx=t[ls].mx;
t[u].mxn=t[ls].mxn+t[rs].mxn;
t[u].mmx=max(t[ls].mmx,t[rs].mmx);
}
if(t[ls].mn<t[rs].mn){
t[u].mn=t[ls].mn;
t[u].mnn=t[ls].mnn;
t[u].mmn=min(t[ls].mmn,t[rs].mn);
}
if(t[ls].mn>t[rs].mn){
t[u].mn=t[rs].mn;
t[u].mnn=t[rs].mnn;
t[u].mmn=min(t[rs].mmn,t[ls].mn);
}
if(t[ls].mn==t[rs].mn){
t[u].mn=t[ls].mn;
t[u].mnn=t[ls].mnn+t[rs].mnn;
t[u].mmn=min(t[ls].mmn,t[rs].mmn);
}
}
void pd(int u,int l,int r){
int ls=u*,rs=u*+;
if(t[u].laz){
int mid=(l+r)/;
t[ls].v+=t[u].laz*(mid-l+);
t[ls].laz+=t[u].laz;
t[ls].mx+=t[u].laz;
t[ls].mmx+=t[u].laz;
t[ls].mn+=t[u].laz;
t[ls].mmn+=t[u].laz;
t[rs].v+=t[u].laz*(r-mid);
t[rs].laz+=t[u].laz;
t[rs].mx+=t[u].laz;
t[rs].mmx+=t[u].laz;
t[rs].mn+=t[u].laz;
t[rs].mmn+=t[u].laz;
t[u].laz=;
}
if(t[ls].mx>t[u].mx){
if(t[ls].mn==t[ls].mx)t[ls].mn=t[u].mx;
if(t[ls].mmn==t[ls].mx)t[ls].mmn=t[u].mx;
t[ls].v+=1ll*(t[u].mx-t[ls].mx)*t[ls].mxn;
t[ls].mx=t[u].mx;
}
if(t[rs].mx>t[u].mx){
if(t[rs].mn==t[rs].mx)t[rs].mn=t[u].mx;
if(t[rs].mmn==t[rs].mx)t[rs].mmn=t[u].mx;
t[rs].v+=1ll*(t[u].mx-t[rs].mx)*t[rs].mxn;
t[rs].mx=t[u].mx;
}
if(t[ls].mn<t[u].mn){
if(t[ls].mx==t[ls].mn)t[ls].mx=t[u].mn;
if(t[ls].mmx==t[ls].mn)t[ls].mmx=t[u].mn;
t[ls].v+=1ll*(t[u].mn-t[ls].mn)*t[ls].mnn;
t[ls].mn=t[u].mn;
}
if(t[rs].mn<t[u].mn){
if(t[rs].mx==t[rs].mn)t[rs].mx=t[u].mn;
if(t[rs].mmx==t[rs].mn)t[rs].mmx=t[u].mn;
t[rs].v+=1ll*(t[u].mn-t[rs].mn)*t[rs].mnn;
t[rs].mn=t[u].mn;
}
}
void build(int l,int r,int u){
if(l==r){
t[u].v=t[u].mx=t[u].mn=num[l];
t[u].mxn=t[u].mnn=;
t[u].mmx=-inf;
t[u].mmn=inf;
return;
}
int mid=(l+r)/;
build(l,mid,u*);
build(mid+,r,u*+);
pushup(u);
}
void updata1(int l,int r,int u,int L,int R,int x){
if(L<=l&&r<=R){
t[u].v+=1ll*x*(r-l+);
t[u].mx+=x;
t[u].mmx+=x;
t[u].mn+=x;
t[u].mmn+=x;
t[u].laz+=x;
return;
}
int mid=(l+r)/;
pd(u,l,r);
if(L<=mid)updata1(l,mid,u*,L,R,x);
if(mid<R)updata1(mid+,r,u*+,L,R,x);
pushup(u);
}
void updata2(int l,int r,int u,int L,int R,int x){
if(t[u].mn>=x)return;
if(L<=l&&r<=R&&t[u].mmn>x){
if(t[u].mx==t[u].mn)t[u].mx=x;
if(t[u].mmx==t[u].mn)t[u].mmx=x;
t[u].v+=1ll*(x-t[u].mn)*t[u].mnn;
t[u].mn=x;
return;
}
int mid=(l+r)/;
pd(u,l,r);
if(L<=mid)updata2(l,mid,u*,L,R,x);
if(mid<R)updata2(mid+,r,u*+,L,R,x);
pushup(u);
}
void updata3(int l,int r,int u,int L,int R,int x){
if(t[u].mx<=x)return;
if(L<=l&&r<=R&&t[u].mmx<x){
if(t[u].mn==t[u].mx)t[u].mn=x;
if(t[u].mmn==t[u].mx)t[u].mmn=x;
t[u].v+=1ll*(x-t[u].mx)*t[u].mxn;
t[u].mx=x;
return;
}
int mid=(l+r)/;
pd(u,l,r);
if(L<=mid)updata3(l,mid,u*,L,R,x);
if(mid<R)updata3(mid+,r,u*+,L,R,x);
pushup(u);
}
ll query1(int l,int r,int u,int L,int R){
if(L<=l&&r<=R){
return t[u].v;
}
int mid=(l+r)/;
ll ret=;
pd(u,l,r);
if(L<=mid)ret+=query1(l,mid,u*,L,R);
if(mid<R)ret+=query1(mid+,r,u*+,L,R);
//pushup(u);
return ret;
}
int query2(int l,int r,int u,int L,int R){
if(L<=l&&r<=R){
return t[u].mx;
}
int mid=(l+r)/,ret=-inf;
pd(u,l,r);
if(L<=mid)ret=max(ret,query2(l,mid,u*,L,R));
if(mid<R)ret=max(ret,query2(mid+,r,u*+,L,R));
//pushup(u);
return ret;
}
int query3(int l,int r,int u,int L,int R){
if(L<=l&&r<=R){
return t[u].mn;
}
int mid=(l+r)/,ret=inf;
pd(u,l,r);
if(L<=mid)ret=min(ret,query3(l,mid,u*,L,R));
if(mid<R)ret=min(ret,query3(mid+,r,u*+,L,R));
//pushup(u);
return ret;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lld",&num[i]);
}
build(,n,);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d%d",&op,&l,&r);
if(op<=)scanf("%d",&x);
if(op==)updata1(,n,,l,r,x);
if(op==)updata2(,n,,l,r,x);
if(op==)updata3(,n,,l,r,x);
if(op==)printf("%lld\n",query1(,n,,l,r));
if(op==)printf("%d\n",query2(,n,,l,r));
if(op==)printf("%d\n",query3(,n,,l,r));
}
return ;
}
(WC2016模拟十一)【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】最假女选手
zcy的励志故事.jpg 傻逼zcy突然想立一个flag,写一个segment-tree-beats的题娱乐一下 于是他就想起了这道题. 他打算今晚写完 然后光是写他就写的头昏脑涨,还犯了询问写反这种 ...
- BZOJ4695:最假女选手
浅谈区间最值操作和历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:https://lydsy.com/JudgeOnline/pr ...
随机推荐
- zabbix监控自身为监控机(server)
Zabbix 监控主机 添加自身为被监控机 这里我的环境已经部署完毕(没有经验的小伙伴可以看我上一篇文章) 等待一会刷新如下页面 字体出现以下亮度就成功了
- 高级聚合函数rollup(),cube(),grouping sets()
rollup(),cube(),grouping sets() 上面这几个函数,是对group by分组功能做的功能扩展. a.rollup() 功能:在原结果基础上追加一行总合计记录 ...
- 重启rsyslog服务时出现问题(误删/var/log/messages解决方案)
今天修改了/etc/rsyslog.conf中的内容后,想着要通过systemctl restart rsyslog重启服务,但是执行完命令后,总感觉/etc/rsyslog.conf中修改的内容没有 ...
- WinServer-IIS-woff字体不显示问题
ASP.NET mvc发布到IIS之后,访问网站的时候,发现woff字体没有加载 百度发现很多博客上的教程是这样的,在IIS管理器中的MIME选项中添加类型 但是重新使用IIS发布后,新添加的字体就会 ...
- Struts2学习(四)利用ajax异步上传
上一篇说到怎样在struts2中进行上传下载.我们使用了struts的标签通过表单提交的方式,但大家知道表单提交会造成页面总体的刷新,这样的方式很不友好,那我们今天就来说说怎样结合ajax方式进行异步 ...
- glove入门实战
前两天怒刷微博,突然发现了刘知远老师分享的微博,顿时眼前一惊.原Po例如以下: http://weibo.com/1464484735/BhbLD70wa 因为我眼下的研究方向是word2vec.暗自 ...
- codeforces Looksery Cup 2015 H Degenerate Matrix 二分 注意浮点数陷阱
#include <cstdio> #include <cstring> #include <algorithm> #include <string> ...
- 屌丝也能开发安卓版2048(App Inventor)
想编写安卓游戏.java太难.来试试App Inventor.尽管有人觉得他是中学生的玩具,可是也能编写2048这种火爆游戏,不须要太复杂的算法. 整个游戏有几个模块: 一.游戏初始化 数列转化为图形 ...
- MainWndProc运行观察(有待研究)
MainWndProc运行观察 把MainWndProc改写成如下代码,便于观察:procedure TWinControl.MainWndProc(var Message: TMessage);be ...
- iOS声明变量详解
内容概述: 本文主要讲述了ios中多种声明变量方式的区别与联系,以及@interface声明的成员变量与@property属性的差异.最后介绍了推荐的声明方式. atany原创,转载请注明博主与博文链 ...