首页 > 其他分享 >AtCoder Beginner Contest 234 Ex Enumerate Pairs

AtCoder Beginner Contest 234 Ex Enumerate Pairs

时间:2023-05-11 10:13:26浏览次数:56  
标签:AtCoder Pairs frac Beginner typedef long 正方形 ge

洛谷传送门

AtCoder 传送门

把每个点分到 \((\left\lfloor\frac{x}{K}\right\rfloor, \left\lfloor\frac{y}{K}\right\rfloor)\) 的正方形内,枚举相邻正方形,计入答案。

正确性显然。

复杂度证明就是所有每个正方形内距离为 \(K\) 的点对下界为 \(\Omega(n^2)\)。考虑分成四个边长为 \(\frac{K}{2}\) 的小正方形,显然每个小正方形内的点对都满足条件。根据抽屉原理,设四个小正方形内点数分别为 \(a \ge b \ge c \ge d\),则有 \(a \ge \frac{x}{4}\),\(x\) 为大正方形内的点数。那么大正方形内合法点对的下界为 \(\frac{a(a-1)}{2}\),这个是 \(O(n^2) = 4 \times 10^5\) 级别的。然后枚举相邻的正方形,均值不等式易得枚举的点对也是 \(O(n^2) = 4 \times 10^5\) 级别的。然后就做完了。

code
// Problem: Ex - Enumerate Pairs
// Contest: AtCoder - AtCoder Beginner Contest 234
// URL: https://atcoder.jp/contests/abc234/tasks/abc234_h
// Memory Limit: 1024 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 200100;

ll n, m;
pii a[maxn];
map< pii, vector<int> > mp;

void solve() {
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld%lld", &a[i].fst, &a[i].scd);
		mp[make_pair(a[i].fst / m, a[i].scd / m)].pb(i);
	}
	vector<pii> ans;
	for (int i = 1; i <= n; ++i) {
		for (int p = -1; p <= 1; ++p) {
			for (int q = -1; q <= 1; ++q) {
				for (int x : mp[make_pair(a[i].fst / m + p, a[i].scd / m + q)]) {
					if (i < x && (a[i].fst - a[x].fst) * (a[i].fst - a[x].fst) + (a[i].scd - a[x].scd) * (a[i].scd - a[x].scd) <= m * m) {
						ans.pb(i, x);
					}
				}
			}
		}
	}
	sort(ans.begin(), ans.end());
	printf("%d\n", (int)ans.size());
	for (pii p : ans) {
		printf("%lld %lld\n", p.fst, p.scd);
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:AtCoder,Pairs,frac,Beginner,typedef,long,正方形,ge
From: https://www.cnblogs.com/zltzlt-blog/p/17390197.html

相关文章

  • AtCoder Beginner Contest 221 F Diameter set
    洛谷传送门AtCoder传送门显然,选出的每两个点都要组成一条直径。还是显然,每条直径的重合部分只可能是一个点或一条边。简单证一下,没有重合显然不可能,重合超过一个点或一条边,直径会更长。进一步发现,设直径点数为\(x\),如果\(x\nmid2\),重合部分是一个点,否则重合部分是一条边......
  • AtCoder Beginner Contest 206(Sponsored by Panasonic)(E,F)
    AtCoderBeginnerContest206(SponsoredbyPanasonic)(E,F)E(容斥,gcd)E这个题大意就是给出一个\(l\)和一个\(r\),寻找满足以下条件的一对数\((x,y)\)的数量\(gcd(x,y)!=1\)\(gcd!=x\)并且\(gcd!=y\)(从这一句我们可以知道\(x\)不可能被\(y\)整除)那么我们可以设\(x\)是\(t\)的倍......
  • AtCoder Beginner Contest 217 G Groups
    洛谷传送门AtCoder传送门不妨钦定组之间的顺序是最小值越小的组越靠前,这样可以给每个组按顺序编号。设\(f_{i,j}\)为考虑了模\(m\)后\(<i\)的数,目前有\(j\)个非空组的方案数。转移就是枚举模\(m=i-1\)的数新开了\(k\)个组,设\(\len\)的数中模\(m=i-1......
  • [AtCoder-AT_ABC070C]题解(C++)
    PartIPreface原题目(Luogu)原题目(AtCoder)PartIISketch给定一个正整数\(N(1\leqN\leq100)\),表示时钟数量。接下来\(N\)行,每行一个正整数\(T_i(1\leqT_i\leq10^{18})\),表示每个时钟旋转\(T_i\)秒后还会回到原来的地方。求出在多少秒之后,所有时钟还会同时......
  • [AtCoder-AT_ABC070_A]题解(C++)
    PartIPreface原题目(Luogu)原题目(AtCoder)PartIISketch给定一个正整数\(n(100\leqn\leq999)\)。求\(n\)是否是一个回文数,是输出\(\texttt{Yes}\),不是输出\(\texttt{No}\)。PartIIIAnalysisSolve1如果仔细观察的话,应该都能发现,\(n\)一定是一个三位数。......
  • AtCoder Beginner Contest 209(D,E)
    AtCoderBeginnerContest209(D,E)D(树,lca)D这个题给出\(n\)个点,\(n-1\)条边,有两个人,一个人在\(c\)点,一个人在\(d\)点,两人以相同的速度朝着对方走来(并且都是按照最短路的走法),问这两个人相遇是在点上,还是在路上这一题意很好知道,就是判断这两点之间的最短距离的奇偶性然后我就一......
  • Atcoder Grand Contest 046 D - Secret Passage
    思路挺自然的一道agc。首先发现删除完字符后的状态可以用一个三元组\((i,j,k)\)表示,其中\(i\)表示删除完之后只剩\([i+1,n]\)的后缀,\(j\)表示可以在后面插入\(j\)个\(0\),\(k\)表示可以在后面插入\(k\)个\(1\),显然不同的三元组能够得到的串是不同的,而一组三元组可......
  • AtCoder Regular Contest 159简要题解
    AtCoderRegularContest159传送门A-CopyandPasteGraph图的邻接矩阵为\[\left(\begin{matrix}A&A&\cdots&A\\A&A&\cdots&A\\\cdots&\cdots&\cdots&\cdots\\A&A&\cdots&A\e......
  • AtCoder Regular Contest 134 E Modulo Nim
    洛谷传送门AtCoder传送门It'sallMAGIC这种题目一般先考虑局面要满足什么条件能必胜,然后根据这个性质来计数。如果把黑板上的数写成一个集合\(S\),那么:\(\varnothing\)为必胜态,\(\{1\},\{2\}\)显然为必败态,打表发现其他单元素集合都为必胜态;如果\(\existsx\inS,x......
  • AtCoder Beginner Contest 242
    A-T-shirt#include<bits/stdc++.h>usingnamespacestd;int32_tmain(){doublea,b,c,x; cin>>a>>b>>c>>x; if(x<=a)cout<<"1.000000000000"; elseif(x>b)cout<<&qu......