Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <cstring>
- #include <iomanip>
- #include <string>
- #include <stdio.h>
- #include <math.h>
- #include <algorithm>
- #include <vector>
- #include <map>
- #include <set>
- #include <stack>
- #include <queue>
- #include <cassert>
- using namespace std;
- //types
- typedef long long ll;
- typedef long double ld;
- typedef map <string, ll> msi;
- typedef map <char, ll> mci;
- typedef map <ll, ll> mii;
- typedef set <ll> si;
- typedef pair <ll, ll> pii;
- typedef set <char> schar;
- typedef vector <ll> vi;
- typedef vector <vi> vvi;
- typedef vector <ld> vld;
- typedef vector <pii> vpii;
- // loops
- #define FOR(i,a,b) for (ll i = (a); i < (b); i++)
- #define F0R(i,a) FOR(i,0,a)
- #define ROF(i,a,b) for (ll i = (b)-1; i >= (a); i--)
- #define R0F(i,a) ROF(i,0,a)
- #define rep(a) F0R(__,a)
- #define each(a,x) for (auto& a: x)
- #define scan(x) each (a, x) cin >> a;
- #define scanp(x) each (p, x) cin >> p.fs >> p.sc;
- #define print(x) each (a, x) cout << a << ' ';
- // other
- #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cout.precision(9);
- #define _ << " "
- #define all(x) (x).begin(), (x).end()
- #define rall(x) (x).rbegin(), (x).rend()
- #define mp make_pair
- #define fs first
- #define sc second
- #define pb push_back
- void solve();
- void solvet() {
- int t; cin >> t;
- rep(t) solve();
- }
- int main() {
- IOS;
- cout << setprecision(20);
- solve();
- return 0;
- }
- ll autoGetAns(vector<int> q)
- {
- for(int i: q)
- assert( 0<i && i<=q.size());
- vector<int> p{12,6,2,3,11,4,1,7,8,5,10,9};
- assert(q.size() == p.size());
- vector<int> s(q);
- for(int i=0;i<p.size();i++)
- {
- s[i] += p[i];
- }
- map<int,int> cnt;
- for(int i=0;i<p.size();i++)
- cnt[s[i]]++;
- ll res = 0;
- for(int i=0;i<p.size();i++)
- if(cnt[s[i]] > 1 )
- {
- res=i+1;
- break;
- }
- cout <<"Resp=" << res << endl;
- return res;
- }
- int n;
- ll getAns(ll fill, ll cur, ll target) {
- vector<int> q;
- cout << "? ";
- FOR(i, 1, n + 1) {
- if (i == target) {cout << cur << " "; q.push_back(cur);}
- else {cout << fill << " "; q.push_back(fill);}
- }
- cout << endl;
- cout.flush();
- ll ans;
- ans = autoGetAns(q);
- return ans;
- }
- void solve() {
- cin >> n;
- vi p(n, 0);
- ll curR = n;
- ll curL = 1;
- ll lastFamous = 0;
- ll done = 0;
- ll flag = 0;
- FOR(j, 1, n + 1) {
- if (done == n) break;
- if (done == n - 1) {
- F0R(i, n) {
- if (p[i] == 0) {
- p[i] = curR;
- break;
- }
- done++;
- }
- break;
- }
- if (lastFamous && flag != curL) {
- flag = curL;
- ll ans = getAns(p[lastFamous - 1], curL, lastFamous);
- if (ans < lastFamous && ans != 0) {
- p[ans - 1] = curL;
- curL++;
- done++;
- j--;
- continue;
- }
- }
- ll ans = getAns(curL, curR, j);
- if (ans == j) {
- p[j - 1] = curL;
- curL++;
- lastFamous = j;
- done++;
- }
- else if (ans != 0) {
- p[ans - 1] = curR;
- p[j - 1] = curL;
- curL++;
- curR--;
- lastFamous = j;
- done += 2;
- }
- }
- while (done < n) {
- ll ans = getAns(p[lastFamous - 1], curL, lastFamous);
- if (ans < lastFamous && ans != 0) {
- p[ans - 1] = curL;
- curL++;
- done++;
- continue;
- }
- }
- cout << "! ";
- print(p);
- cout << endl;
- cout.flush();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement