AtCoder Beginner Contest 215

https://atcoder.jp/contests/abc215

F - Dist Max 2

题意

给定 nn 个点 (x,y)(x,y)。定义点 ii 与点 jj 的距离为 min(xixj,yiyj)\min(|x_i-x_j|,|y_i-y_j|)。求两点间的最大距离。

数据范围:2n2×1052\leq n\leq 2\times10^5

题解

考虑二分答案,对于固定的 mm,即需要检验是否存在一对 i,ji,j,满足

xixjm,yiyjm|x_i-x_j|\geq m,|y_i-y_j|\geq m

可以将所有点按 xx 排序,然后双指针:对于每个 ii,将所有 xixjmx_i-x_j\geq mjj 加入,并维护 yy 的最值,判断是否有 yyim|y-y_i|\geq m 即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N=2e5+5;
int n;
pii a[N];
bool check(int m)
{
int mx=0,mn=1e9;
for(int i=1,j=1;i<=n;i++)
{
while(j<i&&a[i].first-a[j].first>=m)
{
mx=max(mx,a[j].second);
mn=min(mn,a[j].second);
j++;
}
if(mx>=a[i].second+m) return 1;
if(mn<=a[i].second-m) return 1;
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].first>>a[i].second;
sort(a+1,a+n+1);
int l=0,r=1e9;
while(l<r)
{
int m=(l+r+1)/2;
if(check(m)) l=m;
else r=m-1;
}
cout<<l<<'\n';
return 0;
}

G - Colorful Candies 2

题意

nn 颗糖果,每颗糖果有一种颜色。对于 k=1,2,,nk=1,2,\cdots,n,求在这 nn 颗糖果中取 kk 颗,颜色数的期望。

数据范围:1n5×1041\leq n\leq5\times10^4

题解

考虑每种颜色的贡献,假设有 aia_i 个。那么取 kk 个糖果的答案就是

(nk)(naik)(nk)\sum\frac{\binom{n}{k}-\binom{n-a_i}{k}}{\binom{n}{k}}

而不同的 aia_i 的个数是 O(n)O(\sqrt{n}) 级别的,所以直接计算就可以了。


AtCoder Beginner Contest 215
https://je3ter.github.io/2023/11/19/ACM/AtCoder Beginner Contest 215/
作者
Je3ter
发布于
2023年11月19日
许可协议