#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for (int i = (a); i <= (b); ++i)
#define REPD(i,a,b) for (int i = (a); i >= (b); --i)
#define FORI(i,n) REP(i,1,n)
#define FOR(i,n) REP(i,0,int(n)-1)
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define ll long long
#define SZ(x) int((x).size())
#define DBG(v) cerr << #v << " = " << (v) << endl;
#define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++)
#define fi first
#define se second
const int N = 50500;
int a[N];
int n,m;
int prev_offer[N], need_offer[N];
bool can_offer[N];
pii sel_offers[N];
int main() {
scanf("%d%d", &n, &m);
FORI(i,n) scanf("%d", &a[i]);
can_offer[n] = true;
prev_offer[n] = m;
int who_offers = n+1;
for (int k = n-1; k >= 1; k--) {
REP(i,k+1,n) {
need_offer[i] = prev_offer[i] + a[i];
if (can_offer[i] == false) need_offer[i] = 0;
sel_offers[i] = mp(need_offer[i], -i);
}
sort(sel_offers+k+1, sel_offers+n+1);
int voting = n - k + 1, need_votes = (voting+1) / 2;
int rem_coins = m;
FOR(i,need_votes-1) {
rem_coins -= sel_offers[k+1+i].fi;
if (rem_coins < 0) break;
}
if (rem_coins < 0) {
can_offer[k] = false;
//printf("%d has no good offer\n", k);
} else {
can_offer[k] = true;
REP(i,k+1,n) prev_offer[i] = 0;
prev_offer[k] = rem_coins;
FOR(i,need_votes-1) prev_offer[-sel_offers[k+1+i].se] = sel_offers[k+1+i].fi;
who_offers = k;
//printf("%d offers: ", k);
//FORI(i,n) printf("%d ", prev_offer[i]);
//printf("\n");
}
}
FORI(i,who_offers-1) printf("-1 ");
REP(i,who_offers,n) printf("%d ", prev_offer[i]);
printf("\n");
return 0;
}
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 | #include <bits/stdc++.h> using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define REPD(i,a,b) for (int i = (a); i >= (b); --i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define fi first #define se second const int N = 50500; int a[N]; int n,m; int prev_offer[N], need_offer[N]; bool can_offer[N]; pii sel_offers[N]; int main() { scanf("%d%d", &n, &m); FORI(i,n) scanf("%d", &a[i]); can_offer[n] = true; prev_offer[n] = m; int who_offers = n+1; for (int k = n-1; k >= 1; k--) { REP(i,k+1,n) { need_offer[i] = prev_offer[i] + a[i]; if (can_offer[i] == false) need_offer[i] = 0; sel_offers[i] = mp(need_offer[i], -i); } sort(sel_offers+k+1, sel_offers+n+1); int voting = n - k + 1, need_votes = (voting+1) / 2; int rem_coins = m; FOR(i,need_votes-1) { rem_coins -= sel_offers[k+1+i].fi; if (rem_coins < 0) break; } if (rem_coins < 0) { can_offer[k] = false; //printf("%d has no good offer\n", k); } else { can_offer[k] = true; REP(i,k+1,n) prev_offer[i] = 0; prev_offer[k] = rem_coins; FOR(i,need_votes-1) prev_offer[-sel_offers[k+1+i].se] = sel_offers[k+1+i].fi; who_offers = k; //printf("%d offers: ", k); //FORI(i,n) printf("%d ", prev_offer[i]); //printf("\n"); } } FORI(i,who_offers-1) printf("-1 "); REP(i,who_offers,n) printf("%d ", prev_offer[i]); printf("\n"); return 0; } |
English