正题
CF-1586D
题目大意
有一个大小为n的数列a,你可以进行最多2*n次查询
对于每次查询,你要给出一个大小为n的数列b,ci=ai+bic_i=a_i+b_ici=ai+bi,题目会回答c中出现次数大于2的数的最早出现位置
现在让你得出a数组
解题思路
可以把b数组的前n-1位放1,最后一位放n,每次减1,当找到第一个不为0的查询时,就是an+bn=n+1a_n+b_n=n+1an+bn=n+1,这样就得出了最后一位,最多查询n次
然后可以通过最后一位对所有数字进行对比,就可以再n次查询内求出其他数
code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 10000
using namespace std;
int n,g,now,num,a[N];
int main()
{scanf("%d",&n);g=0;now=n;while(!g&&now>1){//得出第一位putchar('?');for(int i=1;i<n;++i)printf(" 1");printf(" %d\n",now);fflush(stdout);scanf("%d",&g);if(g)break;now--;}if(now==1)now=1;num=n+1-now;a[n]=num;for(int i=1;i<num;++i){//和每一位比较putchar('?');for(int j=1;j<n;++j)printf(" %d",num-i+1);printf(" %d\n",1);fflush(stdout);scanf("%d",&g);a[g]=i;}for(int i=num+1;i<=n;++i){putchar('?');for(int j=1;j<n;++j)printf(" %d",n-(i-num));printf(" %d\n",n);fflush(stdout);scanf("%d",&g);a[g]=i;}putchar('!');for(int i=1;i<=n;++i)printf(" %d",a[i]);return 0;
}