Buy and ResellTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1580 Accepted Submission(s): 548 Problem Description The Power Cube is used as a stash of Exotic Power. There are n cities numbered 1,2,…,n where allowed to trade it. The trading price of the Power Cube in the i -th city is ai dollars per cube. Noswal is a foxy businessman and wants to quietly make a fortune by buying and reselling Power Cubes. To avoid being discovered by the police, Noswal will go to the i -th city and choose exactly one of the following three options on the i -th day:
Input There are multiple test cases. The first line of input contains a positive integer T (T≤250 ), indicating the number of test cases. For each test case:
Output For each case, print one line with two integers —— the maximum profit and the minimum times of trading to get the maximum profit.
Sample Input 3 4 1 2 10 9 5 9 5 9 10 5 2 2 1
Sample Output 16 4 5 2 0 0 Hint In the first case, he will buy in 1, 2 and resell in 3, 4. profit = - 1 - 2 + 10 + 9 = 16 In the second case, he will buy in 2 and resell in 4. profit = - 5 + 10 = 5 In the third case, he will do nothing and earn nothing. profit = 0
Source
Recommend chendu | We have carefully selected several similar problems for you: 6447 6446 6445 6444 6443
|
#pragma comment(linker, "/STACK:102400000,102400000")
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define ll long long
const int maxn =3e3+5;
const int mod=1e9+7;
#define pii pair<int,int>
#define fi first
#define se second
/*
题目大意:就是一个序列,按顺序走过,
每个节点都有个权重,然后支持三种操作,
买入,卖出,跳过,问最后能得到的最大收益是多少。
对于每个点,无妨是有三种状态,
买入的起点,卖出的终点,中间点(暂态)。
可以肯定刚加入的点在没遇到后面的点之前都是暂态。
买卖链可以用大小关系去延扩,比如1,2,5,1买2卖,2买5卖。
有点像二分图中的增广路径,对于新出现的一对买卖点,
我们要维护出当前的最好的状态并且可以因为后期的变动调整为最优。
对于每个点在最大堆中肯定不止有一个状态。
那么就可以研究下什么情况下一个数两种状态都消去了也对答案无影响。
应该是已经找到继承点的时候,比如1和2,2加入时1的状态全部消失了,
那么2这个点就可以代替1做决策了,如果比2 小那卖的最优,如果出现比其大的,
因为2的状态还没消去,状态还可以扩展下去,就是说2取消了和1的绑定关系,
答案累加的实际上是3-1,(3-2+2-1)2起到桥梁的作用。
*/
int n,x;
int main()
{
int t;scanf("%d",&t);
while(t--)
{
ll ans=0;int cnt=0;
priority_queue< pair<int,int> > pq;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
pq.push(make_pair(-x,1));
pq.push(make_pair(-x,2));
ll tmp=x+pq.top().fi;
ans+=tmp;///ans不可能为负数,因为是先加进去后累计答案的,最多就是零。
if(pq.top().se==1) cnt+=2;
pq.pop();
}
printf("%lld %d\n",ans,cnt);
}
return 0;
}