存在变量 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 似乎时保留字符。
xxxxxxxxxx
1031
2
3
4
5
6
7
8
9
10
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 初稿