135 字
1 分钟

AT_abc366_e Manhattan Multifocal Ellipse 题解

2024-08-14
浏览量 加载中...

ABC 最水的一场。

题意#

给定二维平面上的 NN 个点 (x1,y1)(x2,y2)(xN,yN)(x_{1},y_{1}),(x_{2},y_{2})\ldots(x_{N},y_{N}) 和非负整数 DD,试求满足 i=1n(xxi,yyi)D\sum_{i=1}^n(|x-x_{i}|,|y-y_{i}|) \le D 的整数对 (x,y)(x,y) 的个数。

解析#

需要满足的条件为 i=1n(xxi,yyi)D\sum_{i=1}^n(|x-x_{i}|,|y-y_{i}|) \le D,移项即得 Di=1nxxii=1nyyiD-\sum_{i=1}^n{|x-x_i|} \geq \sum_{i=1}^n|y-y_i|

不妨枚举所有的 xxyy,并将其排序并记录,然后用双指针维护即可。理论二分也可行,未尝试。

赛时代码#

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e6+10,M=(N<<2)+10;
ll n,d,i,j,t,s,ans,x[N],y[N],f1[M],f2[M],s1[M],s2[M];
int main(){
cin>>n>>d;
for(i=1;i<=n;i++)cin>>x[i]>>y[i],f1[(N<<1)+y[i]+1]++,f2[(N<<1)+y[i]-1]++;
for(i=0;i<=M;i++)t+=f1[i],f1[i]=0,s+=t,s2[i]+=s;
t=s=0;
for(i=M;i>=0;i--)t+=f2[i],f2[i]=0,s+=t,s2[i]+=s;
for(i=1;i<=n;i++)f1[(N<<1)+x[i]+1]++,f2[(N<<1)+x[i]-1]++;
t=s=0;
for(i=0;i<=M;i++)t+=f1[i],f1[i]=0,s+=t,s1[i]+=s;
t=s=0;
for(i=M;i>=0;i--)t+=f2[i],f2[i]=0,s+=t,s1[i]+=s;
t=M;stable_sort(s1,s1+t+1);stable_sort(s2,s2+t+1);
for(i=t;i>=0;i--){
while(j<=t&&s1[i]+s2[j]<=d)j++;
ans+=j;
}
cout<<ans;
}

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
AT_abc366_e Manhattan Multifocal Ellipse 题解
https://blog.walterfang.site/posts/solution-at_abc336_e/
作者
Walter_Fang
发布于
2024-08-14
许可协议
CC BY-NC-SA 4.0
最后更新于 2024-08-14,距今已过 511 天

部分内容可能已过时

评论区

目录