Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <unordered_map>
- #include <string>
- #include <map>
- #include <cmath>
- #include <algorithm>
- #include <set>
- #include <chrono>
- #include <random>
- #include <fstream>
- #define ll long long
- #define len(v) (int)v.size()
- #define all(v) v.begin(), v.end()
- #define rall(v) v.rbegin(), v.rend()
- #define pii pair<int, int>
- #define vi vector<int>
- #define vii vector<vector<int>>
- #define ull unsigned long long
- const ll maxn = 2e5 + 10;
- const int logn = 20;
- const ll inf = 1e15;
- const int mod = 1e9 + 7;
- const int M = 1e9;
- const ull M2 = 998244353;
- const int p = 541;
- using namespace std;
- struct segtree {
- int n;
- vector<ll> a;
- vector<pair<ll, ll>> t;
- void init(int _n, vector<ll>& _a) {
- a = _a;
- n = _n;
- t.resize(n * 4 + 10);
- }
- void build(ll v, ll l, ll r) {
- if (l + 1 == r) {
- t[v] = { a[l], l };
- return;
- }
- int m = (l + r) / 2;
- build(2 * v + 1, l, m);
- build(2 * v + 2, m, r);
- //t[v] = max(t[2 * v + 1], t[2 * v + 2]);
- t[v] = (t[2 * v + 1].first > t[2 * v + 2].first ? t[2 * v + 1] : t[2 * v + 2]);
- }
- pair<ll, ll> get(ll v, ll l, ll r, ll ql, ll qr) {
- if (ql >= r || l >= qr) return { -inf, 0 };
- if (ql <= l && r <= qr) return t[v];
- int m = (l + r) / 2;
- //return max(get(2 * v + 1, l, m, ql, qr), get(2 * v + 2, m, r, ql, qr));
- auto g1 = get(2 * v + 1, l, m, ql, qr);
- auto g2 = get(2 * v + 2, m, r, ql, qr);
- return (g1.first > g2.first ? g1 : g2);
- }
- };
- bool cmp(pair<ll, ll> a, pair<ll, ll> b) {
- return a.first < b.first;
- }
- void solve() {
- ifstream fin("dowry.in");
- ofstream fout("dowry.out");
- int n; fin >> n;
- ll L, R; fin >> L >> R;
- vector<ll> c(n), w(n);
- for (int i = 0; i < n; ++i) {
- fin >> w[i] >> c[i];
- }
- vector<pair<ll, ll>> d(1 << (n / 2));
- for (int mask = 0; mask < (1 << (n / 2)); ++mask) {
- for (int i = 0; i < (n / 2); ++i) {
- if ((mask >> i) & 1) {
- d[mask].first += w[i];
- d[mask].second += c[i];
- }
- }
- }
- sort(all(d), cmp);
- vector<ll> cm;
- for (auto e : d)
- cm.push_back(e.second);
- segtree sg;
- sg.init(len(cm), cm);
- sg.build(0, 0, sg.n);
- ll cans1 = 0, msk = 0, wans1 = 0, wans2 = 0;
- ll mskans = 0, cans2 = 0;
- for (int mask = 0; mask < (1 << (n - (n / 2))); mask++) {
- ll c1 = 0, w1 = 0;
- for (int i = 0; i < (n - (n / 2)); ++i) {
- if ((mask >> i) & 1) {
- w1 += w[i + (n / 2)];
- c1 += c[i + (n / 2)];
- }
- }
- if (w1 > R)
- continue;
- // L <= w1 + w2 <= R
- // L - w1 <= w2 <= R - w1
- // 1) d[m].first >= L - w1
- // 2) d[m].first <= R - w1
- if (w1 == 10 && c1 == 3) {
- cout << "";
- }
- ll l = -1;
- ll r = (1 << (n / 2));
- while (l + 1 < r) {
- ll m = (l + r) / 2;
- if (d[m].first >= (L - w1))
- r = m;
- else
- l = m;
- }
- ll r1 = r;
- l = 0;
- r = (1 << (n / 2));
- while (l + 1 < r) {
- ll m = (l + r) / 2;
- if (d[m].first <= (R - w1))
- l = m;
- else
- r = m;
- }
- ll r2 = l;
- auto ret = sg.get(0, 0, sg.n, r1, r2 + 1);
- if (cans1 + cans2 < ret.first + c1) {
- //csum = ret.first + d[ret.second].second;
- cans1 = ret.first;
- cans2 = c1;
- msk = (mask << (n / 2));
- wans1 = d[ret.second].first;
- wans2 = w1;
- }
- }
- for (int mask = 0; mask < (1 << (n / 2)); ++mask) {
- ll m = mask & msk;
- if (m)
- continue;
- ll c1 = 0, w1 = 0;
- for (int i = 0; i < (n / 2); ++i) {
- if ((mask >> i) & 1) {
- w1 += w[i];
- c1 += c[i];
- }
- }
- if (c1 == cans1 && w1 == wans1) {
- mskans = msk ^ mask;
- }
- }
- vector<int> ans;
- for (int i = 0; i < n; ++i) {
- if ((mskans >> i) & 1) {
- ans.push_back(i + 1);
- }
- }
- fout << len(ans) << endl;
- for (auto el : ans)
- fout << el << " ";
- }
- signed main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment