存在变量 1 y 表示 2 y 表示
这题比 E 简单多了。。
观察发现如果有一个
显然我们希望让这个东西无后效性,所以具体地,我们将整个操作逆序遍历。如果为
有个细节就是注意当删 break 了,因为此时无法将当前的
然后我们刚才找到前
显然这个东西的复杂度最坏是
然后还有两个老生常谈的 AtCoder 独有的问题,一个就是 C++17 似乎不支持 basic_string < pair < int, int > >,大概的原因时 is_trivial < pair < int, int > >::value 为 false,所以会报 CE,这个东西在 [ABC248Ex] Beautiful Subsequences 题解 也提到过。然后就是 AtCoder 里面 data 似乎时保留字符。
xxxxxxxxxx103123
45678910
11using namespace std;12
13mt19937 rnd(random_device{}());14int rndd(int l, int r){return rnd() % (r - l + 1) + l;}15bool rnddd(int x){return rndd(1, 100) <= x;}16
17typedef unsigned int uint;18typedef unsigned long long unll;19typedef long long ll;20typedef long double ld;21
22template < typename T = int >23inline T read(void);24
25int N, K;26ll sum(0);27ll ans(LONG_LONG_MIN);28int mp[210000];29struct Pair{int first, second;};30basic_string < Pair > opt;31basic_string < int > _data;32
33class SegTree{34private:35 int tr[210000 << 2];36 ll sum[210000 << 2];37 38 39 40public:41 void Pushup(int p){42 tr[p] = tr[LS] + tr[RS];43 sum[p] = sum[LS] + sum[RS];44 }45 void Modify(int pos, int p = 1, int gl = 1, int gr = N){46 if(gl == gr)return tr[p]++, sum[p] += mp[pos], void();47 if(pos <= MID)Modify(pos, LS, gl, MID);48 else Modify(pos, RS, MID + 1, gr);49 Pushup(p);50 }51 ll Query(int K, int p = 1, int gl = 1, int gr = N){52 if(tr[p] <= K)return sum[p];53 if(gl == gr)return 0;54 if(tr[LS] > K)return Query(K, LS, gl, MID);55 else return sum[LS] + Query(K - tr[LS], RS, MID + 1, gr);56 }57}st;58
59int main(){60 // freopen("in.txt", "r", stdin);61 N = read(), K = read();62 opt += {1, 0};63 for(int i = 1; i <= N; ++i){64 int f = read(), v = read();65 opt += {f, v};66 if(f == 2)_data += v;67 }sort(_data.begin(), _data.end());68 _data.erase(unique(_data.begin(), _data.end()), _data.end());69 // N = _data.size();70 for(auto &op : opt){71 if(op.first == 1)continue;72 int dis = distance(_data.begin(), upper_bound(_data.begin(), _data.end(), op.second));73 mp[dis] = op.second, op.second = dis;74 }75 for(auto it = opt.rbegin(); it != opt.rend(); ++it){76 if(it->first == 1){77 ans = max(ans, (ll)it->second + sum - st.Query(K--));78 if(K < 0)break;79 // printf("cur, ans = %lld\n", it->second + sum - st.Query(K + 1));80 }else{81 sum += mp[it->second];82 if(mp[it->second] < 0)st.Modify(it->second);83 }84 }printf("%lld\n", ans);85 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);86 return 0;87}88
89template < typename T >90inline T read(void){91 T ret(0);92 int flag(1);93 char c = getchar();94 while(c != '-' && !isdigit(c))c = getchar();95 if(c == '-')flag = -1, c = getchar();96 while(isdigit(c)){97 ret *= 10;98 ret += int(c - '0');99 c = getchar();100 }101 ret *= flag;102 return ret;103}update-2022_11_30 初稿