(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 ...
随机推荐
- linux进程的有效用户ID
进程的有效用户ID用于文件访问时的权限检查.通常,有效用户ID等于实际用户ID(也就是你登录是的用户ID),有效组ID等于实际组ID. 我们知道每个文件针对不同的user有不同的读.写.执行权限.当执 ...
- 利用after和before伪元素在文字两边写横线
示例: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- C IO programming test code
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl ...
- SpringMVC请求@RequestParam中文乱码解决
private String encodeStr(String str) { try { return new String(str.getBytes("ISO-8859-1"), ...
- ES6特性:(阮一峰老师)学习总结
ES6(阮一峰)学习总结 1.块级作用域的引入 在ES6之前,js只有全局作用域和函数作用域,ES6中let关键字为其引入了块级作用域. { var a = 5; let b = 6; } con ...
- 前端和后台对接时对sign加密方法
前端和后台对接时对sign加密方法 /*后台php对接进行sign标签加密 1 获取向后台请求的数据data(key/value方式),可以是个对象(obj),也可以是数组(arr); 2 将数据的k ...
- Mybatis 中 foreach collection 的三种用法
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...
- ArcEngine 一些实现代码
转自原文 ArcEngine 一些实现代码 ●·● 目录: A1 …………实现:鼠标滑过显示要素 tip A2 …………实现:通过鼠标选择要素并高亮显示(ISelectionEnvironme ...
- ZOJ 3687
赤裸的带禁区的排列数,不过,难点在于如何用程序来写这个公式了.纠结了好久没想到,看了看别人的博客,用了DFS,实在妙极,比自己最初想用枚举的笨方法高明许多啊.\ http://blog.csdn.ne ...
- 百度地图 key申请以及基础地图的演示
之前做过一个拼车的项目,用到了百度地图,如今做电商项目,也遇到了要使用地图,可是刚来这公司不久项目不是自己做的,今天一个同事说定位那边有点问题,所以如今不忙,好好搞下地图,为了以后业务扩展或者出现故障 ...