Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) E. Lost Array(构造)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) E. Lost Array(构造)相关的知识,希望对你有一定的参考价值。

LINK

最后一定是把所有询问异或起来得到答案

设第 i i i个数询问了 c i c_i ci次显然 c i c_i ci为奇数且满足 ∑ i = 1 n c i = s u m \\sum\\limits_{i=1}^nc_i=sum i=1nci=sum

其中 s u m sum sum表示总的询问数字,那么共询问 s u m k \\frac{sum}{k} ksum次且满足 m a x { c i } < = s u m k max \\{c_i\\}<=\\frac{sum}{k} max{ci}<=ksum

于是我们初始把所有 c i = 1 c_i=1 ci=1,然后每次取出一个最小的 c i + = 2 c_i+=2 ci+=2

检查此时是否满足条件,满足条件即可退出

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 509;
int n,k,c[maxn],sum;
int id,mx;
int cao[maxn][maxn];
void isok()
{
	if( sum%k!=0 || sum/k<mx )	return;
	//满足条件了
	int nw = 0, ans = 0;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=c[i];j++)
	{
		while( true )
		{ 
			nw++;
			if( nw==sum/k+1 )	nw = 1;
			if( cao[nw][0]>=k )	continue;
			cao[nw][++cao[nw][0]] = i;	
			break;
		}
	}
	for(int i=1;i<=sum/k;i++)
	{
		cout << "? ";
		for(int j=1;j<=k;j++)	cout << " " << cao[i][j];
		cout << endl;
		int x; cin >> x; ans ^= x;
	}
	cout << "! " << ans;
	exit(0); 
}
signed main()
{
	cin >> n >> k;
	for(int i=1;i<=n;i++)	c[i] = 1, sum++;
	mx = 1;
	isok();
	while( sum/k<=500 )
	{
		id++;
		if( id==n+1 )	id = 1;
		c[id] += 2; sum += 2;
		mx = max( mx,c[id] );
		isok();	
	}
	cout << -1;
} 

以上是关于Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) E. Lost Array(构造)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces LATOKEN Round 1 (Div. 1 + Div. 2)

Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) E. Lost Array(构造)

Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) B. Histogram Ugliness(贪心)

Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) D. Lost Tree(交互,二分/图,思维)

D. Lost Tree树的二分图性质——Codeforces LATOKEN Round 1 (Div. 1 + Div. 2)

D. Lost Tree树的二分图性质——Codeforces LATOKEN Round 1 (Div. 1 + Div. 2)