#pragma GCC optimize("O3") // #pragma GCC target ("avx2") #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4") //,popcnt,abm,mmx,avx,tune=native") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, TREASURE; cin >> n >> TREASURE; vector<unsigned char> a(n); int A = 0; for (int i = 0; i < n; i++) { int x; cin >> x; a[i] = x; A = max(A, x); } reverse(a.begin(), a.end()); vector<unsigned char> answer(n); vector<int> cnt(2 * A + 1); int LAST = 0; for (int i = 0; i < n; i++) { int k = i / 2; long long sum = 0; for (int x = 0; x <= A; x++) { sum += (long long) x * min(k, cnt[x]); if (k > cnt[x]) { k -= cnt[x]; } else { if (sum <= TREASURE) { cnt = vector<int>(2 * A + 1); int j = 0; constexpr int HACK = 8; while (j < i - HACK && k >= HACK) { for (int z = j; z < j + HACK; z++) { k -= (answer[z] == x); // if (answer[z] == x) { // k--; // } // } // for (int z = j; z < j + HACK; z++) { ++cnt[(answer[z] <= x ? answer[z] += a[z] : answer[z] = a[z])]; } j += HACK; } for (; j < i; j++) { if (answer[j] <= x) { if (k <= 0) { for (int z = j; z < i; z++) { if (answer[z] < x) ++cnt[answer[z] += a[z]]; else ++cnt[answer[z] = a[z]]; } /* for (; j < i; j++) { // ++cnt[answer[j] < x ? answer[j] += a[j] : answer[j] = a[j]]; if (answer[j] < x) ++cnt[answer[j] += a[j]]; else ++cnt[answer[j] = a[j]]; } */ break; } k -= (answer[j] == x); // if (answer[j] == x) { // k--; // } ++cnt[answer[j] += a[j]]; } else { ++cnt[answer[j] = a[j]]; } } int tmp = TREASURE - sum + a[i]; LAST = tmp; answer[i] = min(tmp, A + 1); } else { answer[i] = 0; } ++cnt[answer[i]]; break; } } } vector<int> big(n); for (int i = 0; i < n; i++) { big[i] = answer[i]; } for (int i = n - 1; i >= 0; --i) { if (big[i] != 0) { big[i] = LAST; break; } } for (int i = 0; i < n; i++) { big[i] = max(-1, big[i] - a[i]); } reverse(big.begin(), big.end()); for (int x : big) { cout << x << " "; } cout << "\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #pragma GCC optimize("O3") // #pragma GCC target ("avx2") #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4") //,popcnt,abm,mmx,avx,tune=native") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, TREASURE; cin >> n >> TREASURE; vector<unsigned char> a(n); int A = 0; for (int i = 0; i < n; i++) { int x; cin >> x; a[i] = x; A = max(A, x); } reverse(a.begin(), a.end()); vector<unsigned char> answer(n); vector<int> cnt(2 * A + 1); int LAST = 0; for (int i = 0; i < n; i++) { int k = i / 2; long long sum = 0; for (int x = 0; x <= A; x++) { sum += (long long) x * min(k, cnt[x]); if (k > cnt[x]) { k -= cnt[x]; } else { if (sum <= TREASURE) { cnt = vector<int>(2 * A + 1); int j = 0; constexpr int HACK = 8; while (j < i - HACK && k >= HACK) { for (int z = j; z < j + HACK; z++) { k -= (answer[z] == x); // if (answer[z] == x) { // k--; // } // } // for (int z = j; z < j + HACK; z++) { ++cnt[(answer[z] <= x ? answer[z] += a[z] : answer[z] = a[z])]; } j += HACK; } for (; j < i; j++) { if (answer[j] <= x) { if (k <= 0) { for (int z = j; z < i; z++) { if (answer[z] < x) ++cnt[answer[z] += a[z]]; else ++cnt[answer[z] = a[z]]; } /* for (; j < i; j++) { // ++cnt[answer[j] < x ? answer[j] += a[j] : answer[j] = a[j]]; if (answer[j] < x) ++cnt[answer[j] += a[j]]; else ++cnt[answer[j] = a[j]]; } */ break; } k -= (answer[j] == x); // if (answer[j] == x) { // k--; // } ++cnt[answer[j] += a[j]]; } else { ++cnt[answer[j] = a[j]]; } } int tmp = TREASURE - sum + a[i]; LAST = tmp; answer[i] = min(tmp, A + 1); } else { answer[i] = 0; } ++cnt[answer[i]]; break; } } } vector<int> big(n); for (int i = 0; i < n; i++) { big[i] = answer[i]; } for (int i = n - 1; i >= 0; --i) { if (big[i] != 0) { big[i] = LAST; break; } } for (int i = 0; i < n; i++) { big[i] = max(-1, big[i] - a[i]); } reverse(big.begin(), big.end()); for (int x : big) { cout << x << " "; } cout << "\n"; } |