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. Linux中设置vim自动在运算符号两边加上空格

    vim中设置自动在=+-之类的运算符号左右两边加上空格.原版的vim不带这个功能,写出的代码例如z=x+y,不美观,很多编译器(如VS)能够自动在符号两边加上空格,如z = x + y,看起来比较美观 ...

  2. 『转』Writing Well

    这是前辈Julie Zhuo的最新关于写作的文章,昨天写下-进行总结和阅读思考 这是一篇关于提笔写作的文章,首发在The looking glass...前辈每周都会回答一个读者的问题耶--This ...

  3. Android琐碎知识点集合

    1.最近发现android studio更新之后用的v7包,每次创建Activity的时候自动继承的是AppCompatActivity,很不舒服,还是习惯Activity.没什么大的毛病,毕竟goo ...

  4. jtable的用法

    一.创建表格控件的各种方式:1)  调用无参构造函数.JTable table = new JTable();2)  以表头和表数据创建表格.Object[][] cellData = {{" ...

  5. unity 模型 材质 贴图 关系;着色器属性

    模型包含 材质(Material),包括 [核心]着色器(Shader) 贴图和其他参数,贴图也算是一种参数 其他,如网格渲染器(Mesh Renderer).动画.坐标 一个材质可以看做为一个Sha ...

  6. Eclipse中切换GIT分支

    切换GIT分支: 右击项目——Team——Switch To——选择你要切换的分支.

  7. Pyhton学习——Day27

    # hasattr(obj,'name')-->obj.name# getattr(obj,'name',default = 'xxx')--->obj.name# setattr(obj ...

  8. CSS——背景图像区域

    background-clip属性 background-clip属性指定背景绘制区域 语法 background-clip:border-box|padding-box|content-box; b ...

  9. redis 篇 - set

    set 无序集合 sadd key value 127.0.0.1:6379[7]> sadd s 3 (integer) 1 127.0.0.1:6379[7]> smembers s ...

  10. LAMP 环境搭建备忘 -- Linux的安装(一)

    LAMP指的是 Linux + Apatch + MySQL / MariaDB + PHP/Perl/Python 一套搭建网站服务器的开源软件组合.工作原理图如下: 下面开始环境搭建 1 Linu ...