给定序列
明显反悔贪心。
不失一般性,令
双倍经验 CF865D Buy Low Sell High。
xxxxxxxxxx
581
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;
26int P[210000];
27ll ans(0);
28priority_queue < pair < int, int >, vector < pair < int, int > >, greater < pair < int, int > > > cur;
29
30int main(){
31 N = read();
32 for(int i = 1; i <= N; ++i){
33 P[i] = read();
34 if(!cur.empty() && P[i] > cur.top().first){
35 int val, idx; tie(val, idx) = cur.top(); cur.pop();
36 ans += P[i] - val, cur.push({P[i], P[i]});
37 if(idx)cur.push({idx, 0});
38 }else cur.push({P[i], 0});
39 }printf("%lld\n", ans);
40 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
41 return 0;
42}
43
44template < typename T >
45inline T read(void){
46 T ret(0);
47 int flag(1);
48 char c = getchar();
49 while(c != '-' && !isdigit(c))c = getchar();
50 if(c == '-')flag = -1, c = getchar();
51 while(isdigit(c)){
52 ret *= 10;
53 ret += int(c - '0');
54 c = getchar();
55 }
56 ret *= flag;
57 return ret;
58}
update-2022_12_20 初稿