Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define pb push_back
- #define task "BOX"
- #define pll pair<ll, ll>
- #define pii pair<int, int>
- #define fi first
- #define se second
- using namespace std;
- const int mod = 998244353;
- const int N = 1e5+5;
- const int M = 5e3+5;
- const ll base = 257;
- const ll base1 = 311;
- int n, m, ans, dp[M], k, lst[N];
- bool trave[M*14][M];
- vector<pii> adj[N];
- struct box
- {
- int c, w, id;
- bool operator < (const box& b)
- {
- return c+w < b.c+b.w;
- }
- }b[N];
- void sol(int itest)
- {
- cin >> n;
- for(int i = 1; i <= n; i ++)
- {
- int c, w;
- cin >> c >> w;
- adj[w].pb({c, i});
- }
- for(int i = 1; i <= 5000; i ++)
- {
- sort(adj[i].begin(), adj[i].end());
- k = 5000/i+1;
- while(!adj[i].empty() && k > 0)
- {
- --k;
- ++m;
- b[m].c = adj[i].back().fi;
- b[m].id = adj[i].back().se;
- adj[i].pop_back();
- b[m].w = i;
- }
- }
- sort(b+1, b+1+m);
- fill_n(dp, M, -1);
- fill_n(lst, m+1, -1);
- dp[0] = 0;
- k = 0;
- for(int i = 1; i <= m; i ++)
- {
- for(int j = b[i].c; j >= 0; j --)
- {
- if(dp[j] == -1)continue;
- int nxt = min(5001, j+b[i].w);
- if(dp[nxt] < dp[j]+1)
- {
- if(nxt == 5001)lst[i] = j;
- else trave[i][nxt] = 1;
- dp[nxt] = dp[j]+1;
- if(ans < dp[nxt])
- {
- ans = dp[nxt];
- k = nxt;
- }
- }
- }
- }
- cout << ans << '\n';
- for(int i = m; i > 0; i --)
- {
- if(trave[i][k] && k <= 5000)
- {
- k -= b[i].w;
- cout << b[i].id <<(k == 0 ? "\n" : " ");
- }
- else if(lst[i] != -1 && k == 5001)
- {
- k = lst[i];
- cout << b[i].id<<(k == 0 ? "\n" : " ");;
- }
- }
- }
- int main()
- {
- if(fopen(task".inp", "r")){
- freopen(task".inp", "r", stdin);
- freopen(task".out", "w", stdout);
- }
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int ntest;
- ntest = 1;
- //cin >> ntest;
- for(int i = 1; i <= ntest; i ++)
- sol(i);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement