T183637-变异距离(2021 CoE III C)【单调栈】

1|0正题

题目链接:https://www.luogu.com.cn/problem/T183637


1|1题目大意

给出n个二元组(xi,yi),求最大的

|xixj|×min{|yi|,|yj|}

1n2×106,106xi106,109yi109,1T10


1|2解题思路

昨天出去了所以没打比赛,这个算法是那个时候口胡的。

首先时间复杂度显然不能带log,但是注意到x的范围,这是在告诉我们可以拿x去排序。

x排好序之后,我们发现对于一个位置j,我们寻找一个i<j使得答案最大那么显然i要在从前往后的单调队列里。

这个其实启示了我们,我们可以前后各维护一个单调栈然后在两个栈里面搞。

至于搞法不难发现决定因素是最小的那个,所以我们每次把小的那个弹出顶部就好了。

时间复杂度O(n)

然后交上去T了好多发,以为是常数的问题,结果换成题解的做法还是T了。

最后发现快读还不够,要用那个文件的黑科技读入,出题人真有你的
在这里插入图片描述


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<cctype> #define ll long long using namespace std; const int N=2e6+10; int T,n,a[N],sp[N],ss[N],tp,ts; long long ans; inline char Getchar() { static char buf[100000],*p1=buf+100000,*pend=buf+100000; if(p1==pend) { p1=buf; pend=buf+fread(buf,1,100000,stdin); if (pend==p1) return -1; } return *p1++; } inline int read() { char c;int d=1;int f=0; while(c=Getchar(),!isdigit(c))if(c==45)d=-1;f=(f<<3)+(f<<1)+c-48; while(c=Getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48; return d*f; } void GetAns(int i,int j) {ans=max(ans,1ll*(i-j)*min(a[i],a[j]));} signed main() { T=read(); while(T--){ n=read();ans=0; memset(a,0,sizeof(a)); for(int i=1;i<=n;i++){ int x=read()+1e6,y=read(); a[x]=max(a[x],abs(y)); } ts=tp=0; for(int i=0;i<=2e6;i++){ if(!a[i])continue; while(ts>0&&a[i]>=a[ss[ts]])ts--; ss[++ts]=i; } for(int i=2e6;i>=0;i--){ if(!a[i])continue; while(tp>0&&a[i]>=a[sp[tp]])tp--; sp[++tp]=i; } int hp=1,hs=1; while(ts&&tp){ GetAns(ss[ts],sp[tp]); if(ts>0&&a[ss[ts]]<=a[sp[tp]])ts--; else tp--; } printf("%lld\n",ans); } return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14969370.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(67)  评论(5编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示