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] 里大于 ...
随机推荐
- 返回json数组的GET接口
Action() { web_reg_find("Search=Body", "SaveCount=find_cnt", "Text=code\&qu ...
- UVa 10082 - WERTYU 解题报告 - C语言
1.题目大意: 输入一个错位的字符串(字母全为大写),输出原本想打出的句子. 2.思路: 如果将每个输入字符所对应的应输出字符一一使用if或者switch,则过于繁琐.因此考虑使用常量数组实现. 3. ...
- opencv-学习笔记(4)-模糊
opencv-学习笔记(4)-模糊 本章要点: 4种模糊方式 2d卷积 Cv2.filter2D(‘图像对象’,‘目标图像这里直接设为-1即可’,kernal,anchor(-1,-1)) 一般后一个 ...
- 特殊符号 & 以太坊
&表示取二进制的末尾 &1表示如果末尾是奇数和偶数两种情况 0 偶数 1奇数 举例子: int a=1;int p=&a; 其中,p是指针,&a就是将a在内存中的实际地 ...
- docker最佳实践-----美团点评的分享
美团点评容器平台简介 本文介绍美团点评的Docker容器集群管理平台(以下简称“容器平台”).该平台始于2015年,是基于美团云的基础架构和组件而开发的Docker容器集群管理平台.目前该平台为美团点 ...
- Mybatis generator自动生成mybatis配置和类信息
自动生成代码方式两种: 1.命令形式生成代码,详细讲解每一个配置参数. 2.Eclipse利用插件形式生成代码. 安装插件方式: eclipse插件安装地址:http://mybatis.google ...
- Python3.5在Windows7环境下Scrapy库的安装
Python3.5在Windows7环境下Scrapy库的安装 忙活了一下午,总算是把Scrapy库给装完了,记下来给需要帮助的人 首先安装的环境:Windows7 64位 Python的版本是:3. ...
- 11.24Daily Scrum
人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.990 测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.991 测试 王宇杰 负责后台代码测 ...
- c# 调取 c++ dll____c#调用dll
1.以海康摄像头dll为例.(文章转载https://www.cnblogs.com/smartsensor/p/4343744.html) 海康SDK编程指南 目前使用的海康SDK包括IPC_SDK ...
- 201621044079 韩烨 week11-作业11-多线程
作业11-多线程 参考资料 多线程参考文件 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序 ...