(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 ...
随机推荐
- GCC中的强符号和弱符号及强引用和弱引用
1. 强符号和弱符号 1.1 u-boot和kernel中的__weak指令 u-boot和kernel比较普遍地使用了__weak来定义函数. 在include\linux\compiler-gcc ...
- 页面定制CSS代码初探(五):给每篇文章最后加上'<完>'
前言 我刚写博客的时候,有几篇是手动在最后加了个<完> 今天在看别人CSS布局时,发现很多::before和::after标签,因为没学过CSS,从名字看大概是前边/后边 加上某个东西的意 ...
- 哪里获取ZBrush简体中文版?
ZBrush®精简版(ZBrush简体中文版)ZBrushCore发布已经有一段日子了,相信不少人早已迫不及待地开始尝试了,不知道你们的体验如何?毋庸置疑的是,ZBrushCore专为刚接触3D并希望 ...
- ZBrush中Local模式的旋转
刚接触ZBrush®的小伙伴可能对Local(局部)有了简单的了解,但是大多数人对它的认识还是比较模糊的,那么在本文中小编将对local命令做详细说明.此工具可以控制视图的旋转轴心点的位置,默认情况下 ...
- AC Codeforces Round #499 (Div. 2) E. Border 扩展欧几里得
没想出来QAQ....QAQ....QAQ.... 对于一般情况,我们知道 ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b) 时方程是一定有解的. 如果改成 ax+ ...
- 9、Collaborative Metric Learning Recommendation System: Application to Theatrical Movie Releases------CML推荐系统(电影院放映的应用)
一.摘要: 主要是做一个基于协作(深度)度量学习(CML)的系统来预测新剧场版本的购买概率.即测量产品的空间距离来预测购买概率. 二.模型 该图分为两部分,先计算右边,右边通过深度度量学习(DDML) ...
- pytorch 7 optimizer 优化器 加速训练
import torch import torch.utils.data as Data import torch.nn.functional as F import matplotlib.pyplo ...
- node 内存消息队列
var net = require('net') var clients = [] ,msgs = {} function unWrapMsg(data){ data = data.toString( ...
- 深入浅出Struts2
Struts2简单介绍 Struts 2框架作为Struts 1.X框架的替代技术,相对Struts 1.X来说,有着本质上的改变. Struts 2框架是从WebWork框架发展而来的.Apache ...
- SVG 贝塞尔曲线控制【方便设置】:贝塞尔曲线
http://dayu.pw/svgcontrol/