#单调栈,树状数组#CF1635F Closest Pair
题目
设 \(f(x,y)=|a_x-a_y|*(w_x+w_y)\),其中 \(a\) 单调递增
多组询问求 \(\min_{l\leq l'<r'\leq r}\{f(l',r')\}\)
\(n,Q\leq 3*10^5,|a|,w\leq 10^9\)
分析
可以发现尽量让 \(l',r'\) 靠近最优,处理出每个数的不超过这个数的前驱和后继,
答案一定只能在这最多 \(2n\) 个点对中产生,所以直接离线按右端点排序用树状数组维护即可
代码
#include <cstdio>
#include <cctype>
#include <vector>
using namespace std;
const int N=300011; struct node{int y,next;}e[N];
int x[N],a[N],n,Q,st[N],Top,as[N]; vector<int>K[N];
typedef long long lll; lll ans[N],c[N];
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
void print(lll ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
lll min(lll a,lll b){return a<b?a:b;}
void update(int x,lll y){for (;x<=n;x+=-x&x) c[x]=min(c[x],y);}
lll query(int x){lll ans=4e18; for (;x;x-=-x&x) ans=min(ans,c[x]); return ans;}
int main(){
n=iut(),Q=iut();
for (int i=1;i<=n;++i){
x[i]=iut(),a[i]=iut(),c[i]=4e18;
while (Top&&a[st[Top]]>a[i]) --Top;
K[i].push_back(st[Top]),st[++Top]=i;
}
Top=0;
for (int i=n;i;--i){
while (Top&&a[st[Top]]>a[i]) --Top;
K[st[Top]].push_back(i),st[++Top]=i;
}
for (int i=1;i<=Q;++i){
int l=iut(),r=iut();
e[i]=(node){l,as[r]},as[r]=i;
}
for (int i=1;i<=n;++i){
int len=K[i].size();
for (int j=0;j<len;++j){
int t=K[i][j];
update(n-t+1,1ll*(x[i]-x[t])*(a[i]+a[t]));
}
for (int j=as[i];j;j=e[j].next) ans[j]=query(n-e[j].y+1);
}
for (int i=1;i<=Q;++i) print(ans[i]),putchar(10);
return 0;
}
#单调栈,树状数组#CF1635F Closest Pair的更多相关文章
- 牛客小白月赛13-H(单调栈+树状数组)
题目链接:https://ac.nowcoder.com/acm/contest/549/H 题意:给一个柱状图,包括每个矩阵的宽度和高度,求能组成的最大矩阵的面积. 思路:显然最大矩阵的高一定为n个 ...
- bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】
参考:https://www.cnblogs.com/lcf-2000/p/6789680.html 这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/ ...
- CF1556E-Equilibrium【栈,树状数组】
正题 题目连接:https://codeforces.com/contest/1556/problem/E 题目大意 两个长度为\(n\)的序列\(a,b\),\(q\)次询问一个区间\([l,r]\ ...
- 【二维偏序】【树状数组】【权值分块】【分块】poj2352 Stars
经典问题:二维偏序.给定平面中的n个点,求每个点左下方的点的个数. 因为 所有点已经以y为第一关键字,x为第二关键字排好序,所以我们按读入顺序处理,仅仅需要计算x坐标小于<=某个点的点有多少个就 ...
- BZOJ.4826.[AHOI/HNOI2017]影魔(树状数组/莫队 单调栈)
BZOJ LOJ 洛谷 之前看\(mjt\)用莫队写了,以为是一种正解,码了3h结果在LOJ T了没A= = 心态爆炸(upd:发现是用C++11(NOI)交的,用C++11交就快一倍了...) 深刻 ...
- Bzoj4237 cdq分治+树状数组+单调栈
二维平面在某区域内点的问题,要么树套树,kdtree,要么就是cdq分治了.然而这题树套树和kdtree都不是很好搞的样子,于是我们就只能cdq分治了.首先把点按照横坐标x排序,在每一层我们需要算出右 ...
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- BZOJ4237 稻草人(分治+树状数组+单调栈)
如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...
- 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 9851 Solved: 4318[Submi ...
- 【BZOJ】1047: [HAOI2007]理想的正方形(单调队列/~二维rmq+树状数组套树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 树状数组套树状数组真心没用QAQ....首先它不能修改..而不修改的可以用单调队列做掉,而且更 ...
随机推荐
- mysql分组后获取每个组排序后的第一条数据(整行)
有一个学生分数表student,数据结构是这样的 CREATE TABLE `student` ( `id` int(11) NOT NULL, `student_id` int(11) DEFAUL ...
- 正则函数及面向对象开发初识---day19
1.正则函数 # ### 正则函数 import re #search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "1+2 3*4" obj = ...
- ioutil.ReadDir读取目录下的内容
func dirents(dir string) []os.FileInfo{ entries, err := ioutil.ReadDir(dir) // 读取目录并返回排好序的文件以及子目录名 i ...
- Kotlin 协程四 —— Flow 和 Channel 的应用
目录 一. Flow 与 Channel 的相互转换 1.1 Flow 转换为 Channel 1.1.1 ChannelFlow 1.1.2 produceIn -- 将 Flow 转换为单播式 C ...
- 第一百一十六篇: JavaScript理解对象
好家伙,本篇为<JS高级程序设计>第八章"对象.类与面向对象编程"学习笔记 1.关于对象 ECMA-262将对象定义为一组属性的无序集合.严格来说,这意味着对象就是 ...
- 【Azure Developer】在Azure Storage Account的两个Blob可以同步吗?可以跨订阅拷贝吗?
问题描述 不同订阅下的Azure Storage Account中Blob资源可以同步吗? 解决方案 可以.通过Azure 官方推荐的Storage Account工具来完成 Copy/Paste 操 ...
- K6 在 Nebula Graph 上的压测实践
背景 对于数据库来说,性能测试是一个非常频繁的事情.优化查询引擎的规则,调整存储引擎的参数等,都需要通过性能测试,查看系统在不同场景下的影响. 即便是同样的代码,同样的参数配置,在不同的机器资源配置, ...
- Java 常用类 String类与其他结构之间的转换-----String 与 char[]之间的转换
1 /* 2 String 与 char[]之间的转换 3 4 String----> char[]:调用String的toCharArray() 5 char[] ---->String ...
- MySQL汇总数和分组数据
1.使用SQL语句对数据库表中的数据进行简单的汇总和分组,这里要注意 count(*) 是对表中的所有数据目进行计数,不管表列中包含的是空值还是非空值. 而使用count(column)是对特定的列中 ...
- window.open代理劫持
window.open = new Proxy(window.open, { apply(target, ctx, args) { if (hasAuth(args[0])) { return tar ...