对于40%40\%40%的数据,n≤3000n\le3000n≤3000
对于100%100\%100%的数据,2≤n≤3000002\le n \le 3000002≤n≤300000 , 1≤pi≤1∗1061\le p_i\le 1*10^61≤pi≤1∗106
题目来源:CF866D
链接:http://codeforces.com/contest/866/problem/D
AC了以后才发现,这道题40分比100分难写,但容易想到(对我来说)。40分:DP,就不详细说了,还要加优化。
注意到对于一个股票,当天不买等价于当天买了再卖,因此可以假设当天卖了,然后如果要买回来还可以弥补。即每天先卖,然后取之前所有可以买的中最便宜的与他交易,赚差价。这里用堆来维护即可,这个思想其实不少见,以前有一道题说的是一条路上有几个加油站,每个加油站可以加固定数量的油,而汽车油箱无限大,问至少要加几次,其实每次经过一个加油站就->等价于获得了一次加油的机会,以后什么时候用都可以<-。这里也一样,每次卖完就获得了两次(因为还可以只买不卖)再买它的机会,每次挑最优的股票赚差价,这就是贪心之处、
代码
补充说明:任意一次买卖都必须是选两个日期,买前者卖后者,尽管题目条件是每天只能买或卖至多一次,但是我们可以不用管(为啥??)。因为你如果在某一天先卖了,又在之后买了,相当于没买也没卖,而两次买卖相当于首尾相接只留下前者买入的和后者卖出的。即a->b,b->c <==> a->c。因此有了贪心的策略。