ivnikkk

Untitled

Dec 19th, 2022
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.60 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS 
  2. #define debug(l) cerr<<#l<<' '<<l<<'\n';
  3. #include "bits/stdc++.h"
  4. using namespace std;
  5. #define all(a) a.begin(), a.end()
  6. typedef long long ll;
  7. typedef pair<ll, ll> pll;
  8. typedef long double ld;
  9. struct Segtree {
  10.     vector<pll> t;
  11.     Segtree(ll n) {
  12.         t.resize(4 * n);
  13.     }
  14.     void build(vector<pair<ll, pll>>& a, ll v, ll tl, ll tr) {
  15.         if (tl == tr) {
  16.             t[v] = a[tl].second;
  17.             return;
  18.         }
  19.         ll tm = (tl + tr) / 2;
  20.         build(a, v * 2, tl, tm);
  21.         build(a, v * 2 + 1, tm + 1, tr);
  22.         t[v] = max(t[v * 2], t[v * 2 + 1]);
  23.     }
  24.     pll get_mx(ll v, ll tl, ll tr, ll l, ll r) {
  25.         if (tl > r || tr < l) {
  26.             return { -1e18,0 };
  27.         }
  28.         if (tl >= l && tr <= r) {
  29.             return t[v];
  30.         }
  31.         ll tm = (tl + tr) / 2;
  32.         return max(get_mx(v * 2, tl, tm, l, r), get_mx(v * 2 + 1, tm + 1, tr, l, r));
  33.     }
  34. };
  35. signed main() {
  36. #ifdef _DEBUG
  37.     freopen("input.txt", "r", stdin);
  38.     freopen("output.txt", "w", stdout);
  39. #endif
  40.     freopen("dowry.in", "r", stdin);
  41.     freopen("dowry.out", "w", stdout);
  42.     ios_base::sync_with_stdio(false);
  43.     cin.tie(nullptr);
  44.     cout.tie(nullptr);
  45.     ll n;
  46.     cin >> n;
  47.     ll l, r;
  48.     cin >> l >> r;
  49.     vector<pll> a(n);
  50.     for (ll i = 0; i < n; i++) {
  51.         cin >> a[i].first >> a[i].second;
  52.     }
  53.     ll mid = n / 2;
  54.     vector<pair<ll, pll>> q;
  55.     vector<ll> w;
  56.     for (ll mask = 0; mask < (1 << mid); mask++) {
  57.         ll s = 0;
  58.         ll c = 0;
  59.         for (ll i = 0; i < mid; i++) {
  60.             if ((mask >> i) & 1) {
  61.                 s += a[i].first;
  62.                 c += a[i].second;
  63.             }
  64.         }
  65.         q.push_back({ s,{ c, mask } });
  66.         w.push_back(s);
  67.     }
  68.     sort(all(w));
  69.     sort(all(q));
  70.     Segtree T((ll)w.size());
  71.     T.build(q, 1, 0, (ll)w.size() - 1);
  72.     const ll mod = 1e3;
  73.     pair<ll, pll> masks = { -mod, {0,0} };
  74.     ll cr = n - mid;
  75.     for (ll mask = 0; mask < (1 << cr); mask++) {
  76.         ll s = 0, c = 0;
  77.         for (ll i = 0; i < cr; i++) {
  78.             if ((mask >> i) & 1) {
  79.                 s += a[mid + i].first;
  80.                 c += a[mid + i].second;
  81.             }
  82.         }
  83.         ll j = upper_bound(all(w), r - s) - w.begin();
  84.         ll i = lower_bound(all(w), l - s) - w.begin();
  85.         if (i > w.size() - 1)continue;
  86.         if (j == (ll)w.size())j--;
  87.         else if (w[j] > r - s) {
  88.             j--;
  89.         }
  90.         if (i == (ll)w.size())continue;
  91.         //if (j == 0) continue;
  92.         pll mx = T.get_mx(1, 0, (ll)w.size() - 1, i, j);
  93.         if (mx.first + c > masks.first) {
  94.             masks = { mx.first + c,{mx.second,mask} };
  95.         }
  96.     }
  97.     vector<ll> ans;
  98.     for (ll i = 0; i < mid; i++) {
  99.         if ((masks.second.first >> i) & 1) {
  100.             ans.push_back(i + 1);
  101.         }
  102.     }
  103.     for (ll i = 0; i < cr; i++) {
  104.         if ((masks.second.second >> i) & 1) {
  105.             ans.push_back(mid + i + 1);
  106.         }
  107.     }
  108.     cout << ans.size() << '\n';
  109.     for (ll& i : ans) {
  110.         cout << i << ' ';
  111.     }
  112. }
Add Comment
Please, Sign In to add comment