Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define s second
- #define f first
- #define mp make _pair
- #define ld long double
- #define pb push_back
- #define ull unsigned long long
- using namespace std;
- const int MAXN = 4e6 + 7;
- const int INF = 1e9 + 7;
- const int MOD = 1e9 + 7;
- const double EPS = 1e-6;
- bool dp[MAXN];
- ll l, r, ans[MAXN], nxt[MAXN];
- int n, a[MAXN], pr[MAXN], pos[505];
- void solve () {
- cin >> n >> l >> r;
- // n = 200'000;
- // l = (ll)1e17, r = (ll)1e18;
- for (int i = 1; i <= n; i++) {
- cin >> a[i];
- // a[i] = rand() % 51;
- l -= a[i];
- r -= a[i];
- if (!pos[a[i]])
- pos[a[i]] = i;
- }
- if (r < 0) {
- cout << -1;
- return;
- }
- l = max(0ll, l);
- dp[0] = 1;
- for (int i = 1; i <= 500; ++i) {
- if (!pos[i])
- continue;
- for (int j = i; j <= 1'000'000; ++j) {
- if (!dp[j] && dp[j - i]) {
- dp[j] = 1;
- pr[j] = i;
- }
- }
- }
- nxt[1'000'001] = (ll)2e18;
- for (int i = 1'000'000; i >= 0; --i)
- nxt[i] = (dp[i] ? i : nxt[i + 1]);
- for (int i = 0; i <= 1'000'000; i++) {
- if (!dp[i]) continue;
- ll rem = (i ? l % i : l);
- ll cnt = (i ? l / i : 0);
- ll r1 = r - cnt * i;
- if (rem > 1'000'000 || nxt[rem] > 1'000'000 || nxt[rem] > r1 || !dp[nxt[rem]])
- continue;
- for (int j = 1; j <= n; j++)
- ans[j] = 1;
- int s = i;
- while (s) {
- ans[pos[pr[s]]] += cnt;
- s -= pr[s];
- }
- s = nxt[rem];
- while (s) {
- ans[pos[pr[s]]]++;
- s -= pr[s];
- }
- for (int j = 1; j <= n; j++)
- cout << ans[j] << " ";
- return;
- }
- cout << -1;
- }
- int main() {
- cin.tie(NULL);
- cout.tie(NULL);
- ios_base::sync_with_stdio(false);
- int t = 1;
- //cin >> t;
- while (t--) {
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment