给定序列
明显反悔贪心。
不失一般性,令
双倍经验 CF865D Buy Low Sell High。
xxxxxxxxxx58123
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;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 初稿