这是一道神奇的交互题(第一次见到交互题有1400的),大致题意就是给你一个神奇的未知序列并且长度为n,你需要做的就是最多询问n次,每次询问l,r ,并且 l不能等于r, 最后让你求出最后的序列是什么,这个题要推一些东西,刚开始想每次询问区间长度减去1,,然后求出减去的那个长度的那个数,结果发现最少需要n+1次才能求出来,于是就试了试另一种求法,结果神奇的发现,如果每次询问长度为2,那么可以用n-1次求出ai+ai+1的值,再用一次去求出a1的值,然后再找出来这这些数据中的关系,发现求出长度为2的区间数据 可以减去前面的再加上前面的前面,最后再加上或者减去a1 就可以的出ai, 然后试了一下发现样例可以过就叫了,结果真的过了O。o
题目:
ac代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 1e3 + 10;
typedef long long int LL ;
LL qz[N];
LL qf[N];
LL ans[N];
int ne[2] = {1,-1};
int main()
{
int n ;
cin >> n ;
for(int i = 1; i <= n-1 ; i ++)
{
cout <<'?'<<' '<<i<<' '<<i + 1<<endl;
cin >> ans[i+1];
fflush(stdin);
}
cout << '?'<<' '<<1<<' '<<3 <<endl;
cin >> ans[1];
ans[1] -= ans[3];
int k = 0;
for(int i = 2 ; i <= n ; i++)
{
qz[i] = qz[i-1] + ans[i] * ne[k%2];
k ++ ;
}
for(int i = 2 ; i <= n ; i ++)
{
if(i % 2 == 0)ans[i] = qz[i] - ans[1];
else ans[i] = ans[1] - qz[i];
//if(i % 2 == 0)ans[i] = ans[i] - qz[i-1] + - ans[1];
//else if(i % 2 == 0)ans[i] = ans[i] - qf[i-1] + ans[1];
}
cout <<'!'<<' ';
for(int i = 1; i <= n ; i ++)cout << ans[i]<<' ';
}