MLE 求调
查看原帖
MLE 求调
1062683
lottle1212__楼主2024/10/1 16:24

MLE on #13

#include <iostream>
#include <bitset>
#include <algorithm>
#include <string.h>
#include <iomanip>
#include <math.h>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define fst first
#define scd second 
#define ll long long
#define db double
#define L(i, j, k) for (int i=(j); i<=(k); ++i)
#define R(i, j, k) for (int i=(j); i>=(k); --i)
#define mp make_pair
#define pii pair <int, int>
#define pll pair <ll, ll>
#define vi vector <int>
#define vl vector <ll>
#define eb emplace_back
#define pb push_back
#define sz(x) ((int) x.size())
#define ms(f, x) memset(f, x, sizeof (f))
#define ACN(i, h_u) for (int i=h_u; i; i=e[i].nxt)
using namespace std;
template <typename INT> void rd(INT &res) {
	res=0; bool f=false; char ch=getchar();
	while (ch<'0'||ch>'9') f|=(ch=='-'), ch=getchar();
	while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^48), ch=getchar();
	res=(f?-res:res);
}
template <typename INT, typename ...Args>
void rd(INT &res, Args &..._res) { rd(res), rd(_res...); }
//dfs
const int inf=0x3f3f3f3f;
const int maxn=2e5;
const int N=maxn+10;
int a[N], ch[N<<5][2], f[N], idx, cnt[N], n; vi rel[N]; set <int> s[N<<5];
//wmr
int get_fa(int x) { return x==f[x]?x:f[x]=get_fa(f[x]); }
void insert(int id) {
	int x=a[id], u=0;
	R(i, 30, 0) {
		int j=(x>>i)&1;
		if (!ch[u][j]) ch[u][j]=++idx;
		u=ch[u][j], ++cnt[u];
	}
	s[u].insert(id);
}
void remove(int id) {
	int x=a[id], u=0;
	R(i, 30, 0) {
		int j=(x>>i)&1;
		u=ch[u][j], --cnt[u];
	}
	s[u].erase(id);
}
pii query(int id) {
	int x=a[id], u=0, res=0;
	R(i, 30, 0) {
		int j=(x>>i)&1;
		if (cnt[ch[u][j]]) u=ch[u][j];
		else if (cnt[ch[u][!j]]) res+=1<<i, u=ch[u][!j];
		else return mp(inf, -1);
	}
	return mp(res, *s[u].begin());
}
//incra
bool finished() {
	L(i, 1, n) if (sz(rel[i])==n) return true;
	return false;
}
//lottle
signed main() {
//	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	rd(n);
	L(i, 1, n) rd(a[i]), rel[i].eb(i), f[i]=i, insert(i);
	ll ans=0;
	while (!finished()) {
		L(i, 1, n) if (!rel[i].empty()) {
			for (int u: rel[i]) remove(u);
			int v=-1, w=inf;
			for (int u: rel[i]) {
				pii ret=query(u); int _w=ret.fst, _v=ret.scd;
				if (_w<w) w=_w, v=_v;
			}
			if (w==inf) continue;
			ans+=w;
			int j=get_fa(v); f[j]=f[i];
			for (int u: rel[i]) insert(u);
			for (int u: rel[j]) rel[i].eb(u);
			vi ().swap(rel[j]);
		}
	}
	printf("%lld\n", ans);
	return 0;
}
2024/10/1 16:24
加载中...