首页 > 其他分享 >题解:CF1896G Pepe Racing

题解:CF1896G Pepe Racing

时间:2024-08-07 10:51:26浏览次数:11  
标签:CF1896G int 题解 元素 Pepe tot -- max 2n

主要思路:构造。

思路

方法一

一个一个的找,分别查询 \([1,n],[n+1,2n],\dots,[n(n-1)+1,n^{2}]\) 中最快的人,再把 \(n\) 个人合起来查询,不过很明显的是,这个方法很蠢,并不能切掉此题。

方法二

找第二快的人,只有最快的人在的一组需重新询问,剩下答案无需改变。需排除的人的一组用不是现在任何一组最大值的东西来补空位。这样询问总次数达到 \(2n^{2}-n+1\)。

方法三

明显的方法而仍与题目要求差 \(n\)。

当只剩下 \(2n\) 个元素的时候,如果是恰好每组两个,那么这时候删除 \(\max\) 就不需要再进行一次维护,仅剩的一个元素直接继承 \(\max\)。

在补充元素的时候,并不真的把元素补进去,而是在求 \(\max\) 的时候直接顺着往后找满 \(n\) 个,然后当删除的组不平衡(极差大于 \(1\))以后,真的将元素最多的组里的元素补给最少的,这样就能保证一直平衡。

这样询问次数就到达了 \(2n^{2}-2n+1\)。

AC Code

#include<bits/stdc++.h>
using namespace std;
const int N = 405;
int n, ans[N], vis[405];
set<int>s[N];
vector<int>asn;
inline int ask(set<int>&s) {
	cout << "? ";
	for (auto x : s)cout << x << " ";
	cout << "\n";
	int ret;
	cin >> ret;
	return ret;
}
inline get(set<int>&s) {
	int tot = 1;
	for (int i = n - s.size(); i; i--) {
		while (vis[tot] || s.find(tot) != s.end())tot++;
		s.insert(tot);
	}
}
inline void solve() {
	cin >> n;
	for (int i = 0; i <= n * n + 1; i++)vis[i] = 0, ans[i] = 0, s[i].clear();
	asn.clear();
	for (int i = 1; i <= n; i++) {
		for (int j = (i - 1) * n + 1; j <= i * n; j++)s[i].insert(j);
		ans[i] = ask(s[i]), vis[ans[i]] = 1;
	}
	for (int tot = n * n; tot >= 2 * n; tot--) {
		set<int>now;
		for (int i = 1; i <= n; i++)now.insert(ans[i]);
		get(now);
		int x = ask(now), id = 0;
		for (int i = 1; i <= n; i++)if (ans[i] == x)id = i;
		asn.push_back(x);
		s[id].erase(x);
		get(s[id]);
		ans[id] = ask(s[id]);
		vis[ans[id]] = 1;
		for (int i = 1; i <= n; i++)if (i != id)s[i].erase(ans[id]);
	}
	set<int>now;
	for (int i = 1; i <= n; i++)now.insert(ans[i]);
	get(now);
	for (int tot = n - 1; tot; tot--) {
		int x = ask(now);
		now.erase(x);
		get(now);
		asn.push_back(x);
	}
	for (auto x : now)if (vis[x])asn.push_back(x);
	cout << "! ";
	for (auto x : asn)cout << x << " ";
	cout << endl;
}
int t;
int main() {
	cin >> t;
	while (t--) solve();
	return 0;
}

标签:CF1896G,int,题解,元素,Pepe,tot,--,max,2n
From: https://www.cnblogs.com/AUBSwords/p/18346595

相关文章

  • 2024牛客暑期多校训练营7 C Array Sorting 题解
    乱搞非正解写法。分类讨论各种情况。降序排序对应交换即可数组个数小直接考虑相邻的交换其他都看做随机数据考虑结合前面情况,很容易想到,先把数组变成一个尽量有序的数组(每个元素和自己正确的位置相差不大)。最后再多次相邻交换,使得每个元素都在正确位置。把数组变成......
  • 洛谷 P4910题解
    题目大意现在穿T次手串,每根手串的长度分别为不同的n,有木和金两种珠子,相邻两颗珠子必须有一个是金。题目思路分析我们现在设穿到第n个珠子时用金的方案数为f[1][n],用木的方案数为f[0][n]如果第n个珠子为金,那么前一颗珠子是什么都可以,因此f[1][n]=f[1][n-1]+f[0][n-1]而如果......
  • CF573E Bear and Bowling 题解
    Description给定一个长度为\(n\)的序列\(a_{1\dotsn}\)。你要求一个\(a\)的子序列\(b_{1\dotsm}\)(可以为空),使得\(\sum_{i=1}^mib_i\)的值最大。\(n\le10^5\),\(|a_i|\le10^7\)。Solution有一个显然的dp是设\(f_{i,j}\)表示前\(i\)个数,选\(j\)个数的......
  • CF1920D题解
    题面这里不再赘述了,直接搬个链接。InLuoguInCodeforces思路存储一共两种操作:要么在末尾加一个数xxx,要么把整一段复制......
  • NSSCTF靶场题解(6)
    站在小白的视角上,写了在写题目的wp方面更多是想体现题目思考的逻辑和细节,更多是写给同样新手小白的内容,解题方面为什么从这一步到下一步的,很助于培养思考题目的逻辑思维,尽我所能把细节阐释到位,有些地方可能理解说辞不是特别到位,如果有问题就麻烦各位大佬师傅指点~这次题解库收......
  • 题解:CF257C View Angle
    题目传送门题意平面上有\(n\)个点。从原点引出两条射线,将平面分成两个部分,使其中一个部分覆盖所有的点。求这个部分与原点所夹的角的最小度数。思路既然一个部分覆盖了所有的点,那么另一个部分就一个点都没覆盖,那么要让这个部分最优,这两条射线一定经过两个中间没有任何点的点......
  • 【题解】暑假集训CSP提高模拟14
    目录Rank&挂分A.BA题目内容部分分10pts10+20pts正解思路代码B.BB题目内容部分分5pts正解思路代码C.BCD.BDRank&挂分T4暴搜后来改了记搜,不知道哪里锅了,挂5pts。A.BA题目内容现在有\(m\)块烙板,\(n\)张饼,第\(i\)张饼需要烙\(a_i\)个单位时间,一张饼一个单位时刻只能......
  • 2024MX-MF-DAY1-text题解
    T1【题目描述】有\(n\)个人按编号从\(1\)到\(n\)坐成一圈,即第\(i\in[1,n]\)个人右边是\(i+1\),第\(n\)个人右边的人是\(1\)。初始,每个人手上有\(m\)个球。随后,\(n\)个人按编号从小到大的顺序依次执行如下操作:把自己手中的球分成数量相同且尽可能多的三份,......
  • AkSoundSeedAir.dll修复指南:游戏音频问题解决与预防技巧
    AkSoundSeedAir.dll是一个与声音引擎相关的动态链接库(DynamicLinkLibrary,简称DLL)文件,尤其与Wwise(AudiokineticWwise)声音设计和游戏音效中间件有关。Wwise是一个广泛应用于游戏开发的声音引擎,用于处理游戏中的音频和音效,AkSoundSeedAir.dll就是Wwise的一部分,用于实现声音处理......
  • 花园改造 题解
    题目id:9989题目描述小\(X\)开始改造她的环形的花园了,具体来说她要在花园的环上种满\(n\)棵树。她现在有\(3\)种树:种子、小树苗和大树。每个位置上种不同的树会产生不同的满意度,具体来说在第\(i\)个位置,种种子会产生\(a_i\)的满意度,种小树苗会产生\(b_i\)的满意度,种大树会产生\(c......