60pts 求hack*2,感觉自己很真
查看原帖
60pts 求hack*2,感觉自己很真
1125000
wuming_z楼主2025/7/26 18:10

WA
思路是如果能选就尽量选剩余多的,尽量削减众数数量

int n, t;
int a[2000001];
int o;
struct node {
	int x, s;
};
vector<node> mp;
bool cmp(node a, node b) {
	return a.s > b.s;
}
vector<int> ans[2000001];
signed main() {
	t = read();
	while (t--) {
		n = read();
		mp.clear();
		o = 0;
		for (int i = 1; i <= n; i++)a[i] = read(),ans[i].clear();
		sort(a + 1, a + n + 1);
		for (int i = 1; i <= n; i++) {
			if (a[i] != a[i - 1])mp.push_back({ a[i],0 });
			mp[mp.size() - 1].s++;
		}
		sort(mp.begin(), mp.end(), cmp);
		int all = n;
		if (mp[0].s > all / 2)while (mp.size() > 1)mp.erase(mp.begin()+mp.size()-1);
		for (int l = 1; mp.size() > 1; l++) {
			o++;
			for (int i = 0; i < mp.size() - mp.size() % 2; i++) {
				mp[i].s--, all--;
				if (mp[0].s > all / 2) {
					mp[i].s++; all++;
					break;
				}
				ans[l].push_back(mp[i].x);
				
			}sort(mp.begin(), mp.end(), cmp);
			while (mp.size() && !mp[mp.size() - 1].s)mp.erase(mp.end() - 1);
		}if (mp.size() == 1) {
			writeln(-1);
		}
		else {
			writeln(o);
			for (int i = 1; ans[i].size(); i++) {
				writesp(ans[i].size());
				for (int j : ans[i]) {
					writesp(j);
				}putchar('\n');
			}
		}
	}
	return 0;
}
2025/7/26 18:10
加载中...