分治 n log^2 n 113分求助 有tle可以理解 但是为什么会wa
查看原帖
分治 n log^2 n 113分求助 有tle可以理解 但是为什么会wa
294454
Just_A_King楼主2023/6/27 21:19
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> p;

const ll N = 200003;

ll n, ans = 1e18;
p a[N];

ll calc(ll x, ll y) {
    return (a[x].first - a[y].first)*(a[x].first - a[y].first) + (a[x].second - a[y].second)*(a[x].second - a[y].second);
}

void work(ll l, ll r) {
    if(l == r) return;
    ll mid = (l + r)/2;
    work(l, mid), work(mid + 1, r);
    vector<int> b;
    for(ll i = l; i <= r; i++)
    	b.push_back(i);
    sort(b.begin(), b.end(), [&](int x, int y) {
    	return a[x].second < a[y].second;
	});
	for(ll i = 0; i < b.size(); i++)
		for(ll j = i + 1; j < min((ll)b.size(), i + 6ll); j++)//如果对这里有异议,请看下一份代码
			ans = min(ans, calc(b[i], b[j]));
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i].first >> a[i].second;
	sort(a + 1, a + 1 + n);
    work(1, n);
    cout << ans << endl;
    return 0;
}

另一个写法 108分

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> p;

const ll N = 200003;

ll n, ans = 1e18;
p a[N];

ll calc(ll x, ll y) {
    return (a[x].first - a[y].first)*(a[x].first - a[y].first) + (a[x].second - a[y].second)*(a[x].second - a[y].second);
}

void work(ll l, ll r) {
    if(l == r) return;
    ll mid = (l + r)/2;
    work(l, mid), work(mid + 1, r);
    vector<int> b, c;
    for(ll i = l; i <= mid; i++)
    	b.push_back(i);
    for(ll i = mid + 1; i <= r; i++)
    	c.push_back(i);
    	
    auto fun = [&](int x, int y) {
    	return a[x].second < a[y].second;
	};
    sort(b.begin(), b.end(), fun);
	sort(c.begin(), c.end(), fun);
	
	int j = 0, k = 0;
	for(int i = 0; i < b.size(); i++) {
		while(j < c.size() && a[c[j]].second < a[b[i]].second) j++;
		while(k < c.size() && a[c[k]].second - a[b[i]].second <= sqrt(ans)) k++;
		for(int o = j; o < k; o++)
			ans = min(ans, calc(b[i], c[o]));
	}
	j = 0, k = 0;
	for(int i = 0; i < c.size(); i++) {
		while(j < b.size() && a[b[j]].second < a[c[i]].second) j++;
		while(k < b.size() && a[b[k]].second - a[c[i]].second <= sqrt(ans)) k++;
		for(int o = j; o < k; o++)
			ans = min(ans, calc(c[i], b[o]));
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i].first >> a[i].second;
	sort(a + 1, a + 1 + n);
    work(1, n);
    cout << ans << endl;
    return 0;
}
2023/6/27 21:19
加载中...