№ |
Отправитель |
Задача |
Язык |
Вердикт |
Время |
Память |
Отослано |
Протест. |
|
145298385 |
Дорешивание:
Qiulyqwq |
1336D
- 27
|
C++17 (GCC 9-64)
|
Полное решение
|
15 мс
|
36 КБ
|
2022-02-05 17:23:11 |
2022-02-05 17:23:11 |
|
// #pragma GCC optimize ("Ofast,no-stack-protector,fast-math")
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define rez resize
#define pb push_back
#define mkp make_pair
#define debug(...) fprintf (stderr, __VA_ARGS__)
typedef long long ll;
typedef pair <int, int> pii;
#define lep(i, l, r) for (int i = (l), i##_end = (r); i <= i##_end; ++ i)
#define rep(i, r, l) for (int i = (r), i##_end = (l); i >= i##_end; -- i)
char __c; bool __f; template <class T> inline void IN (T & x) {
__f = 0, x = 0; while (__c = getchar (), ! isdigit (__c)) if (__c == '-') __f = 1;
while (isdigit (__c)) x = x * 10 + __c - '0', __c = getchar (); if (__f) x = -x;
}
template <class T> inline void chkmin (T & x, T y) { if (x > y) x = y; }
template <class T> inline void chkmax (T & x, T y) { if (x < y) x = y; }
const int N = 1e2 + 5;
int n, a[N];
ll triplet, straight;
pair <ll, ll> tmp[N];
map <ll, int> mp;
inline pair <ll, ll> query (int x) {
printf ("+ %d\n", x), fflush (stdout);
ll _t = triplet, _s = straight;
IN (triplet), IN (straight);
return mkp (straight - _s, triplet - _t);
}
inline void case0 () {
for (int i = 4; i <= n; i += 2) tmp[i] = query (i);
tmp[2] = query (2);
if (n > 5) {
tmp[0] = tmp[n - 2] = query (n - 2);
a[n - 2] = tmp[n - 1].fi == 0 ? 0 : mp[tmp[n - 2].se] - 1;
}
tmp[1] = tmp[3] = query (3);
a[3] = tmp[2].fi == 0 ? 0 : mp[tmp[3].se] - 1;
for (int i = 2; i <= n - 2; i += 2) tmp[i] = query (i), a[i] = mp[tmp[i].se] - 2;
for (int i = 4; i <= n - 4; i += 2) {
tmp[i].fi -= (a[i - 2] + 2) * (a[i - 1] + (i == 4));
a[i + 1] = tmp[i].fi / (a[i - 1] + (i == 4) + a[i + 2] + 1);
}
if (n > 5) {
tmp[n - 3].fi -= (a[n - 5] + 2) * (a[n - 4] + (n == 7));
tmp[n - 3].fi -= (a[n - 4] + (n == 7)) * (a[n - 2] + 1);
a[n - 1] = tmp[n - 3].fi / (a[n - 2] + 1) - 1;
a[n] = (tmp[0].fi - (a[n - 3] + 1) * (a[n - 4] + a[n - 1] + 1)) / (a[n - 1] + 1);
a[1] = (tmp[1].fi - (a[4] + 1) * (a[2] + a[5] + 1 + (n == 7))) / (a[2] + 1);
} else {
tmp[4] = query (4), a[4] = mp[tmp[4].se] - 2;
a[5] = (tmp[4].fi - (a[2] + 2) * (a[3] + 1)) / (a[3] + 1);
a[1] = (tmp[2].fi - (a[3] + 1) * (a[4] + 1)) / (a[3] + 1);
}
}
inline void case1 () {
for (int i = 4; i <= n; i += 2) tmp[i] = query (i);
while (n > 4 && tmp[n].fi == 0) {
tmp[n] = query (n);
a[n - 1] = 0, a[n] = mp[tmp[n].se] - 2, n -= 2;
}
if (n == 4) {
tmp[3] = query (3), tmp[2] = query (2);
a[2] = tmp[3].fi == 0 ? 0 : mp[tmp[2].se] - 1;
tmp[4] = query (4), a[4] = mp[tmp[4].se] - 2;
a[3] = tmp[4].fi / (a[2] + 1) - 1;
a[1] = tmp[2].fi / (a[3] + 1) - a[4] - 1;
return ;
}
tmp[2] = query (2);
tmp[n - 2] = query (n - 2), a[n - 2] = mp[tmp[n - 2].se] - 2;
a[n - 1] = tmp[n].fi / (a[n - 2] + 1);
tmp[3] = query (3);
a[3] = tmp[2].fi == 0 ? 0 : mp[tmp[3].se] - 1;
for (int i = 2; i <= n - 4; i += 2) tmp[i] = query (i), a[i] = mp[tmp[i].se] - 2;
a[1] = (tmp[2].fi - (a[3] + 1) * (a[4] + 1 + (n == 6))) / (a[3] + 1);
for (int i = 4; i <= n - 4; i += 2) {
tmp[i].fi -= (a[i - 2] + 2) * (a[i - 1] + (i == 4));
a[i + 1] = tmp[i].fi / (a[i - 1] + (i == 4) + a[i + 2] + 1 + (i == n - 4));
}
tmp[n - 2].fi -= a[n - 3] * (a[n - 4] + 1 + a[n - 1]);
a[n] = tmp[n - 2].fi / a[n - 1] - 1;
}
signed main () {
IN (n), IN (triplet), IN (straight);
lep (i, 2, n + 5) mp[1ll * (i - 1) * (i - 2) / 2] = i;
int _n = n;
(n & 1) ? case0 () : case1 ();
printf ("! ");
lep (i, 1, _n) printf ("%d ", a[i]);
puts (""), fflush (stdout);
return 0;
}
Время: ? ms, память: ? КБ