trafik

Untitled

Jul 15th, 2022
888
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <string>
  5. #include <map>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <set>
  9. #include <chrono>
  10. #include <random>
  11. #include <fstream>
  12. #define ll long long
  13. #define len(v) (int)v.size()
  14. #define all(v) v.begin(), v.end()
  15. #define rall(v) v.rbegin(), v.rend()
  16. #define pii pair<int, int>
  17. #define vi vector<int>
  18. #define vii vector<vector<int>>
  19. #define ull unsigned long long
  20. const ll maxn = 2e5 + 10;
  21. const int logn = 20;
  22. const ll inf = 1e15;
  23. const int mod = 1e9 + 7;
  24. const int M = 1e9;
  25. const ull M2 = 998244353;
  26. const int p = 541;
  27. using namespace std;
  28.  
  29. struct segtree {
  30.     int n;
  31.     vector<ll> a;
  32.     vector<pair<ll, ll>> t;
  33.     void init(int _n, vector<ll>& _a) {
  34.         a = _a;
  35.         n = _n;
  36.         t.resize(n * 4 + 10);
  37.     }
  38.     void build(ll v, ll l, ll r) {
  39.         if (l + 1 == r) {
  40.             t[v] = { a[l], l };
  41.             return;
  42.         }
  43.         int m = (l + r) / 2;
  44.         build(2 * v + 1, l, m);
  45.         build(2 * v + 2, m, r);
  46.         //t[v] = max(t[2 * v + 1], t[2 * v + 2]);
  47.         t[v] = (t[2 * v + 1].first > t[2 * v + 2].first ? t[2 * v + 1] : t[2 * v + 2]);
  48.     }
  49.     pair<ll, ll> get(ll v, ll l, ll r, ll ql, ll qr) {
  50.         if (ql >= r || l >= qr) return { -inf, 0 };
  51.         if (ql <= l && r <= qr) return t[v];
  52.         int m = (l + r) / 2;
  53.         //return max(get(2 * v + 1, l, m, ql, qr), get(2 * v + 2, m, r, ql, qr));
  54.         auto g1 = get(2 * v + 1, l, m, ql, qr);
  55.         auto g2 = get(2 * v + 2, m, r, ql, qr);
  56.         return (g1.first > g2.first ? g1 : g2);
  57.     }
  58. };
  59.  
  60. bool cmp(pair<ll, ll> a, pair<ll, ll> b) {
  61.     return a.first < b.first;
  62. }
  63.  
  64. void solve() {
  65.     ifstream fin("dowry.in");
  66.     ofstream fout("dowry.out");
  67.     int n; fin >> n;
  68.     ll L, R; fin >> L >> R;
  69.     vector<ll> c(n), w(n);
  70.     for (int i = 0; i < n; ++i) {
  71.         fin >> w[i] >> c[i];
  72.     }
  73.     vector<pair<ll, ll>> d(1 << (n / 2));
  74.     for (int mask = 0; mask < (1 << (n / 2)); ++mask) {
  75.         for (int i = 0; i < (n / 2); ++i) {
  76.             if ((mask >> i) & 1) {
  77.                 d[mask].first += w[i];
  78.                 d[mask].second += c[i];
  79.             }
  80.         }
  81.     }
  82.     sort(all(d), cmp);
  83.     vector<ll> cm;
  84.     for (auto e : d)
  85.         cm.push_back(e.second);
  86.     segtree sg;
  87.     sg.init(len(cm), cm);
  88.     sg.build(0, 0, sg.n);
  89.     ll cans1 = 0, msk = 0, wans1 = 0, wans2 = 0;
  90.     ll mskans = 0, cans2 = 0;
  91.  
  92.     for (int mask = 0; mask < (1 << (n - (n / 2))); mask++) {
  93.         ll c1 = 0, w1 = 0;
  94.         for (int i = 0; i < (n - (n / 2)); ++i) {
  95.             if ((mask >> i) & 1) {
  96.                 w1 += w[i + (n / 2)];
  97.                 c1 += c[i + (n / 2)];
  98.             }
  99.         }
  100.         if (w1 > R)
  101.             continue;
  102.  
  103.         // L <= w1 + w2 <= R
  104.         // L - w1 <= w2 <= R - w1
  105.         // 1) d[m].first >= L - w1
  106.         // 2) d[m].first <= R - w1
  107.         if (w1 == 10 && c1 == 3) {
  108.             cout << "";
  109.         }
  110.         ll l = -1;
  111.         ll r = (1 << (n / 2));
  112.         while (l + 1 < r) {
  113.             ll m = (l + r) / 2;
  114.             if (d[m].first >= (L - w1))
  115.                 r = m;
  116.             else
  117.                 l = m;
  118.         }
  119.         ll r1 = r;
  120.         l = 0;
  121.         r = (1 << (n / 2));
  122.         while (l + 1 < r) {
  123.             ll m = (l + r) / 2;
  124.             if (d[m].first <= (R - w1))
  125.                 l = m;
  126.             else
  127.                 r = m;
  128.         }
  129.         ll r2 = l;
  130.         auto ret = sg.get(0, 0, sg.n, r1, r2 + 1);
  131.         if (cans1 + cans2 < ret.first + c1) {
  132.             //csum = ret.first + d[ret.second].second;
  133.             cans1 = ret.first;
  134.             cans2 = c1;
  135.             msk = (mask << (n / 2));
  136.             wans1 = d[ret.second].first;
  137.             wans2 = w1;
  138.         }
  139.     }
  140.     for (int mask = 0; mask < (1 << (n / 2)); ++mask) {
  141.         ll m = mask & msk;
  142.         if (m)
  143.             continue;
  144.         ll c1 = 0, w1 = 0;
  145.         for (int i = 0; i < (n / 2); ++i) {
  146.             if ((mask >> i) & 1) {
  147.                 w1 += w[i];
  148.                 c1 += c[i];
  149.             }
  150.         }
  151.         if (c1 == cans1 && w1 == wans1) {
  152.             mskans = msk ^ mask;
  153.         }
  154.     }
  155.     vector<int> ans;
  156.     for (int i = 0; i < n; ++i) {
  157.         if ((mskans >> i) & 1) {
  158.             ans.push_back(i + 1);
  159.         }
  160.     }
  161.     fout << len(ans) << endl;
  162.     for (auto el : ans)
  163.         fout << el << " ";
  164. }
  165.  
  166. signed main() {
  167.     ios::sync_with_stdio(0);
  168.     cin.tie(0);
  169.     cout.tie(0);
  170.  
  171.     solve();
  172. }
Advertisement
Add Comment
Please, Sign In to add comment