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】最假女选手的更多相关文章

  1. BZOJ4695 最假女选手(势能线段树)

    BZOJ题目传送门 终于体会到初步掌握势能分析思想的重要性了. 一开始看题,感觉套路还是很一般啊qwq.直接在线段树上维护最大值和最小值,每次递归更新的时候,如果不能完全覆盖就暴力递归下去.挺好写的欸 ...

  2. 2018.07.27 bzoj4695: 最假女选手(线段树)

    传送门 线段树好题 支持区间加,区间取min" role="presentation" style="position: relative;"> ...

  3. bzoj4695 最假女选手

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4695 [题解] SegmentTree beats!(见jiry_2论文/营员交流) 考虑只 ...

  4. [BZOJ4695]最假女选手:segment tree beats!

    分析 segment tree beats!模板题. 看了gxz的博客突然发现自己写的mxbt和mnbt两个标记没用诶. 代码 #include <bits/stdc++.h> #defi ...

  5. bzoj4695 最假女选手(势能线段树/吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)给一个区间\([L,R]\) 加上一个数\(x\) \(2.\)把一个区间\([L,R]\) 里小于\(x\) 的数变成\(x\) \(3.\ ...

  6. bzoj 4695 最假女选手 吉利线段树

    最假女选手 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 480  Solved: 118[Submit][Status][Discuss] Desc ...

  7. 【bzoj4695】最假女选手 线段树区间最值操作

    题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作:1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] 里大于 ...

  8. 【bzoj4695】最假女选手

    zcy的励志故事.jpg 傻逼zcy突然想立一个flag,写一个segment-tree-beats的题娱乐一下 于是他就想起了这道题. 他打算今晚写完 然后光是写他就写的头昏脑涨,还犯了询问写反这种 ...

  9. BZOJ4695:最假女选手

    浅谈区间最值操作和历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:https://lydsy.com/JudgeOnline/pr ...

随机推荐

  1. GCC中的强符号和弱符号及强引用和弱引用

    1. 强符号和弱符号 1.1 u-boot和kernel中的__weak指令 u-boot和kernel比较普遍地使用了__weak来定义函数. 在include\linux\compiler-gcc ...

  2. 页面定制CSS代码初探(五):给每篇文章最后加上'<完>'

    前言 我刚写博客的时候,有几篇是手动在最后加了个<完> 今天在看别人CSS布局时,发现很多::before和::after标签,因为没学过CSS,从名字看大概是前边/后边 加上某个东西的意 ...

  3. 哪里获取ZBrush简体中文版?

    ZBrush®精简版(ZBrush简体中文版)ZBrushCore发布已经有一段日子了,相信不少人早已迫不及待地开始尝试了,不知道你们的体验如何?毋庸置疑的是,ZBrushCore专为刚接触3D并希望 ...

  4. ZBrush中Local模式的旋转

    刚接触ZBrush®的小伙伴可能对Local(局部)有了简单的了解,但是大多数人对它的认识还是比较模糊的,那么在本文中小编将对local命令做详细说明.此工具可以控制视图的旋转轴心点的位置,默认情况下 ...

  5. 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+ ...

  6. 9、Collaborative Metric Learning Recommendation System: Application to Theatrical Movie Releases------CML推荐系统(电影院放映的应用)

    一.摘要: 主要是做一个基于协作(深度)度量学习(CML)的系统来预测新剧场版本的购买概率.即测量产品的空间距离来预测购买概率. 二.模型 该图分为两部分,先计算右边,右边通过深度度量学习(DDML) ...

  7. pytorch 7 optimizer 优化器 加速训练

    import torch import torch.utils.data as Data import torch.nn.functional as F import matplotlib.pyplo ...

  8. node 内存消息队列

    var net = require('net') var clients = [] ,msgs = {} function unWrapMsg(data){ data = data.toString( ...

  9. 深入浅出Struts2

    Struts2简单介绍 Struts 2框架作为Struts 1.X框架的替代技术,相对Struts 1.X来说,有着本质上的改变. Struts 2框架是从WebWork框架发展而来的.Apache ...

  10. SVG 贝塞尔曲线控制【方便设置】:贝塞尔曲线

    http://dayu.pw/svgcontrol/