auto maintain = [&]() { if (L.size() == R.size() + 1) { auto x = *L.rbegin(); L.erase(prev(L.end())); sumL -= x; R.insert(x); sumR += x; } elseif (R.size() == L.size() + 2) { auto x = *R.begin(); R.erase(R.begin()); sumR -= x; L.insert(x); sumL += x; } mid = *R.begin(); };
int ans = 0; for (int l = 0, r = 0; r < n; ++r) { if (a[r] >= mid) { R.insert(a[r]); sumR += a[r]; } else { L.insert(a[r]); sumL += a[r]; } maintain();
if ((ll(L.size()) * mid - sumL) + (sumR - ll(R.size()) * mid) <= k) { ans = max(ans, r - l + 1); } else { if (a[l] >= mid) { R.extract(a[l]); sumR -= a[l]; } else { L.extract(a[l]); sumL -= a[l]; } maintain(); l++; } }
cout << ans << "\n";
例 3 找出k 个二元组并重新排为(a1,b1),(a2,b2),…,(ak,bk) ,最大化k 使得:i=1∑kai+i=1∑k−1∣bi−bi+1∣⩽L。数据范围:n⩽2000,0⩽ai,bi,l⩽109。(CF1935C. Messenger in MAC)
int n = read(), L = read(); vector<pair<int, int>> a(n); for (int i = 0; i < n; ++i) { a[i].second = read(), a[i].first = read(); } sort(a.begin(), a.end());
int ans = 0; for (int l = 0; l < n; ++l) { priority_queue<int> Q; int sum = 0; for (int r = l; r < n; ++r) { Q.push(a[r].second); sum += a[r].second; while (!Q.empty() && sum + a[r].first - a[l].first > L) { sum -= Q.top(); Q.pop(); } ans = max(ans, (int)Q.size()); } } cout << ans << '\n';
int m = read(), x = read(); ll now = 0; priority_queue<int> Q; while (m--) { int c = read(); if (now >= c) { now -= c; Q.push(c); } elseif (!Q.empty() && Q.top() > c) { now += Q.top(); Q.pop(); now -= c; Q.push(c); } now += x; } printf("%lld\n", Q.size());
int n = read(), x = read(), k = read(); int res = 0; ll now = x; priority_queue<int> Q; while (n--) { int c = read(); now -= c; Q.push(c); if (k && now <= 0) { now += Q.top(); Q.pop(); k--; } if (now > 0) res = i; } printf("%d\n", res);
for (int i = 1; i <= n; ++i) { int x = read(), y = read(); S1.insert({ x,y }); S2.insert({ x,y }); }
int op = 0; ll ans[2] = { 0 }; for (int i = 1; i <= m; ++i) { char c = getchar(); int k = read(); switch (c) { case'U': U += k; while (1) { if (S1.empty()) break; auto t = *S1.begin(); if (t.first < U) { S1.erase(t); S2.erase(t); ans[op] += 1; } elsebreak; } break; case'D': D -= k; while (1) { if (S1.empty()) break; auto t = *S1.rbegin(); if (t.first > D) { S1.erase(t); S2.erase(t); ans[op] += 1; } elsebreak; } break; case'L': L += k; while (1) { if (S2.empty()) break; auto t = *S2.begin(); if (t.second < L) { S1.erase(t); S2.erase(t); ans[op] += 1; } elsebreak; } break; case'R': R -= k; while (1) { if (S2.empty()) break; auto t = *S2.rbegin(); if (t.second > R) { S1.erase(t); S2.erase(t); ans[op] += 1; } elsebreak; } break; default: break; } op ^= 1; } printf("%lld %lld\n", ans[0], ans[1]); }
intcmp(char a, char b){ if (b == '(') { return1; } elseif ((b == '^') && (a == '+' || a == '-' || a == '*' || a == '/' || a == '(')) { return1; } elseif ((b == '*' || b == '/') && (a == '+' || a == '-' || a == '(')) { return1; } elseif ((b == '+' || b == '-') && (a == '(')) { return1; } else { return0; } }
intpow(int x, int y){ int res = 1; for (int i = 0; i < y; i++) { res *= x; } return res; }
intcal(const string& s){ stack<int> stk; int n = 0; for (constauto& c : s) { if (isdigit(c)) { n = n * 10 + (c - '0'); } elseif (c == ' ') { stk.push(n); n = 0; } else { int x = stk.top(); stk.pop(); int y = stk.top(); stk.pop(); switch (c) { case'+': n = y + x; break; case'-': n = y - x; break; case'*': n = y * x; break; case'/': n = y / x; break; case'^': n = pow(y, x); break; default: break; } } } return stk.top(); }
string i2p(const string& str){ stack<char> stk; string s; for (constauto& c : str) { if (isdigit(c)) { s += c; continue; } if (!stk.empty() && s.back() != ' ') { s += ' '; } if (c == ')') { while (!stk.empty() && stk.top() != '(') { s += stk.top(); stk.pop(); s += ' '; } stk.pop(); } elseif (!stk.empty() && !cmp(stk.top(), c)) { while (!stk.empty() && (!cmp(stk.top(), c))) { s += stk.top(); stk.pop(); s += ' '; } stk.push(c); } else { stk.push(c); } } return s; }
intmain(){ string s; cin >> s; s = '(' + s + ')'; cout << cal(i2p(s)) << "\n"; return0; }