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(构造)相关的知识,希望对你有一定的参考价值。
最后一定是把所有询问异或起来得到答案
设第 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=1∑nci=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)