bzoj 4695 最假女选手 吉利线段树
最假女选手
Time Limit: 50 Sec Memory Limit: 128 MB
Submit: 480 Solved: 118
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2
2
2 1 2 2
4 1 2
Sample Output
HINT
题解:吉利线段树的模板题
https://pan.baidu.com/s/1o7xSSQ2
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<map> #define ll long long
#define inf 1000000007
#define N 500007
#define ls p<<1
#define rs p<<1|1
using namespace std;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m;
int mx[N<<],cx[N<<],sx[N<<];//区间最大值,最大值个数 ,区间严格次大值
int mn[N<<],cn[N<<],sn[N<<];//区间最小值,最小值个数 ,区间严格次小值
int add[N<<];//区间tag标记
ll sum[N<<];//区间和 inline void push_up(int p)
{
sum[p]=sum[ls]+sum[rs]; if (mx[ls]>mx[rs]) mx[p]=mx[ls],cx[p]=cx[ls],sx[p]=max(sx[ls],mx[rs]);
if (mx[ls]<mx[rs]) mx[p]=mx[rs],cx[p]=cx[rs],sx[p]=max(mx[ls],sx[rs]);
if (mx[ls]==mx[rs]) mx[p]=mx[ls],cx[p]=cx[ls]+cx[rs],sx[p]=max(sx[ls],sx[rs]); if (mn[ls]<mn[rs]) mn[p]=mn[ls],cn[p]=cn[ls],sn[p]=min(sn[ls],mn[rs]);
if (mn[ls]>mn[rs]) mn[p]=mn[rs],cn[p]=cn[rs],sn[p]=min(mn[ls],sn[rs]);
if (mn[ls]==mn[rs]) mn[p]=mn[ls],cn[p]=cn[ls]+cn[rs],sn[p]=min(sn[ls],sn[rs]);
// cout<<sum[p]<<endl;
}
inline void push_down(int p,int l,int r)
{
if (add[p])
{
int mid=(l+r)>>;
mx[ls]+=add[p],sx[ls]+=add[p],mn[ls]+=add[p],sn[ls]+=add[p],sum[ls]+=(mid-l+)*add[p],add[ls]+=add[p];
mx[rs]+=add[p],sx[rs]+=add[p],mn[rs]+=add[p],sn[rs]+=add[p],sum[rs]+=(r-mid)*add[p],add[rs]+=add[p];
add[p]=;
}
if (mx[ls]>mx[p])
{
if (mn[ls]==mx[ls]) mn[ls]=mx[p];
if (sn[ls]==mx[ls]) sn[ls]=mx[p];
sum[ls]+=1ll*(mx[p]-mx[ls])*cx[ls],mx[ls]=mx[p];
}
if (mx[rs]>mx[p])
{
if (mn[rs]==mx[rs]) mn[rs]=mx[p];
if (sn[rs]==mx[rs]) sn[rs]=mx[p];
sum[rs]+=1ll*(mx[p]-mx[rs])*cx[rs],mx[rs]=mx[p];
}
if (mn[ls]<mn[p])
{
if (mx[ls]==mn[ls]) mx[ls]=mn[p];
if (sx[ls]==mn[ls]) sx[ls]=mn[p];
sum[ls]+=1ll*(mn[p]-mn[ls])*cn[ls],mn[ls]=mn[p];
}
if (mn[rs]<mn[p])
{
if (mx[rs]==mn[rs]) mx[rs]=mn[p];
if (sx[rs]==mn[rs]) sx[rs]=mn[p];
sum[rs]+=1ll*(mn[p]-mn[rs])*cn[rs],mn[rs]=mn[p];
}
}
void build(int p,int l,int r)
{
if (l==r)
{
mx[p]=mn[p]=sum[p]=read();
cx[p]=cn[p]=;
sx[p]=-inf,sn[p]=inf;
return;
}
int mid=(l+r)>>;
build(ls,l,mid),build(rs,mid+,r);
push_up(p);
}
void vadd(int p,int l,int r,int x,int y,int z)
{
if (l==x&&y==r)
{
mx[p]+=z,sx[p]+=z,mn[p]+=z,sn[p]+=z;
sum[p]+=1ll*(r-l+)*z,add[p]+=z;
return;
}
push_down(p,l,r);
int mid=(l+r)>>;
if (y<=mid) vadd(ls,l,mid,x,y,z);
else if (x>mid) vadd(rs,mid+,r,x,y,z);
else vadd(ls,l,mid,x,mid,z),vadd(rs,mid+,r,mid+,y,z);
push_up(p);
}
void vmax(int p,int l,int r,int x,int y,int z)
{
//cout<<p<<" "<<l<<" "<<r<<" "<<x<<" "<<y<<" "<<z<<endl;
if (mn[p]>=z) return;
if (l==x&&y==r&&sn[p]>z)
{
//cout<<p<<" "<<l<<" "<<r<<endl;
if (mx[p]==mn[p]) mx[p]=z;
if (sx[p]==mn[p]) sx[p]=z;
sum[p]+=1ll*(z-mn[p])*cn[p],mn[p]=z;
return;
}
push_down(p,l,r);
int mid=(l+r)>>;
if (y<=mid) vmax(ls,l,mid,x,y,z);
else if (x>mid) vmax(rs,mid+,r,x,y,z);
else vmax(ls,l,mid,x,mid,z),vmax(rs,mid+,r,mid+,y,z);
push_up(p);
}
void vmin(int p,int l,int r,int x,int y,int z)
{
if (mx[p]<=z) return;
if (l==x&&y==r&&sx[p]<z)
{
//cout<<l<<" "<<r<<" "<<p<<endl;
if (mn[p]==mx[p]) mn[p]=z;
if (sn[p]==mx[p]) sn[p]=z;
sum[p]+=1ll*(z-mx[p])*cx[p],mx[p]=z;
// cout<<sum[p]<<" "<<l<<" "<<r<<" "<<p<<endl;
return;
}
push_down(p,l,r);
int mid=(l+r)>>;
if (y<=mid) vmin(ls,l,mid,x,y,z);
else if (x>mid) vmin(rs,mid+,r,x,y,z);
else vmin(ls,l,mid,x,mid,z),vmin(rs,mid+,r,mid+,y,z);
// cout<<l<<" "<<r<<" "<<sum[p]<<endl;
push_up(p);
// cout<<p<<" "<<l<<" "<<r<<" "<<sum[p]<<" "<<sum[ls]<<" "<<sum[rs]<<endl;
}
ll qsum(int p,int l,int r,int x,int y)
{
//cout<<l<<" "<<r<<" "<<p<<" "<<sum[p]<<endl;
if (l==x&&y==r) return sum[p];
push_down(p,l,r);
int mid=(l+r)>>;
if (y<=mid) return qsum(ls,l,mid,x,y);
else if (x>mid) return qsum(rs,mid+,r,x,y);
else return qsum(ls,l,mid,x,mid)+qsum(rs,mid+,r,mid+,y);
}
int qmax(int p,int l,int r,int x,int y)
{
if (l==x&&y==r) return mx[p];
push_down(p,l,r);
int mid=(l+r)>>;
if (y<=mid) return qmax(ls,l,mid,x,y);
else if (x>mid) return qmax(rs,mid+,r,x,y);
else return max(qmax(ls,l,mid,x,mid),qmax(rs,mid+,r,mid+,y));
}
int qmin(int p,int l,int r,int x,int y)
{
if (l==x&&y==r) return mn[p];
push_down(p,l,r);
int mid=(l+r)>>;
if (y<=mid) return qmin(ls,l,mid,x,y);
else if (x>mid) return qmin(rs,mid+,r,x,y);
else return min(qmin(ls,l,mid,x,mid),qmin(rs,mid+,r,mid+,y));
}
int main()
{
freopen("fzy.in","r",stdin);
freopen("fzy.out","w",stdout); n=read();
build(,,n);
m=read();
while(m--)
{
int opt=read(),x=read(),y=read(),z;
if (opt==) z=read(),vadd(,,n,x,y,z);
if (opt==) z=read(),vmax(,,n,x,y,z);
if (opt==) z=read(),vmin(,,n,x,y,z);
if (opt==) printf("%lld\n",qsum(,,n,x,y));
if (opt==) printf("%d\n",qmax(,,n,x,y));
if (opt==) printf("%d\n",qmin(,,n,x,y));
}
}
bzoj 4695 最假女选手 吉利线段树的更多相关文章
- BZOJ.4695.最假女选手(线段树 Segment tree Beats!)
题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时 ...
- BZOJ 4695 最假女选手 线段树
题意: 给定一个长度为 N序列,编号从1 到 N.要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] 里大于x ...
- bzoj 4695: 最假女选手 && Gorgeous Sequence HDU - 5306 && (bzoj5312 冒险 || 小B的序列) && bzoj4355: Play with sequence
算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的 ...
- bzoj 4695: 最假女选手
……一道丧病线段树膜板题…… 被常数卡的死去活来……QAQ 学到了些奇技淫巧:把取min标记 和 区间最小值 合并 可以快很多…… #include <bits/stdc++.h> #de ...
- 2018.07.27 bzoj4695: 最假女选手(线段树)
传送门 线段树好题 支持区间加,区间取min" role="presentation" style="position: relative;"> ...
- (WC2016模拟十一)【BZOJ4695】最假女选手
ps:好久没更博啦……这几天连着有模拟赛,等初赛前后休息的时候来疯狂补坑吧……顺便补一下前面的数论啥的? 题解: mdzz我场上写了个15分暴力长度跟标算差不多... 线段树大法好啊!这题听说很多人做 ...
- [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
- BZOJ4695 最假女选手(势能线段树)
BZOJ题目传送门 终于体会到初步掌握势能分析思想的重要性了. 一开始看题,感觉套路还是很一般啊qwq.直接在线段树上维护最大值和最小值,每次递归更新的时候,如果不能完全覆盖就暴力递归下去.挺好写的欸 ...
- 【bzoj4695】最假女选手 线段树区间最值操作
题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作:1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] 里大于 ...
随机推荐
- CSP201403-2:窗口
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...
- Python基础 之 数据类型
数据类型 一.运算符 算数运算a = 10 * 10赋值运算a = a + 1 a+=1 布尔值:True 真 False 假 if True: pass while True: pass v = n ...
- 聊一聊session
最近从上家公司离职了,到了一家新公司,这几天一直在了解他们的项目,所以我自己的那个小项目也暂时搁浅了.. 今天差不多把他们的项目了解了,来院子写写我在这里边遇到的问题,影响最深刻的是seesion的. ...
- ThinkPHP - 4 - 学习笔记(2015.4.12)
ThinkPHP D方法 D方法用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用,调用格式如下:D('[项目://][分组/]模型' ...
- Java学习个人备忘录之内部类
内部类: 将一个类定义在另一个类的里面,对里面那个类就称为内部类. class Outer { private int num = 3; class Inner //它想访问Outer中的num, 如 ...
- 利用SqlServer的作业定时清除过期数据
有时候我们的数据库中可能会有那么些存放动态数据的表,比如一些每天定时发出的消息通知信息等数据.这些数据我们只需要临时保存,一些老旧的数据需要定时去清除掉,不然时间一长的话单表数据堆积非常严重.导致数据 ...
- Spring Boot(三)自动装配
@Configuration和@Bean Spring提供了注解@Configuration和@Bean注解用来配置多个Bean,在以前的Spring项目中可以通过xml的方式配置: <bean ...
- HTML页面垂直滚动条不见
<body style="overflow-y:scroll;"> </body>
- 原生js移动端字体自适应方案
自从进入新公司之后,就一直采用800的方案,也就是判断屏幕尺寸,大于800px是一种html字体处理方案,另一种方案是小于800px的html字体处理方案, 代码如下: (function(doc, ...
- 网络编程--System.Net
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...