rt WA #5
#include<bits/stdc++.h>
using namespace std;
struct Q{
int day,sum;
bool operator < (const Q& a) const {return sum > a.sum;}
bool operator > (const Q& a) const {return sum < a.sum;}
};
priority_queue<Q> q;
int n;
int a[200005],fa[200005],vis[200005],fine[200005];
bool same;
int f[100005];
long long ans;
void solve(int k){
int p=0;
int t=0;
for(p=k;p;p=fa[p]){
f[++t] = p;
}
if(t >= 2)same = false;
for(int i=1;i<=t;i++){
if(i <= t/2){
ans += a[f[i]];
fine[f[i]] = 1;
}
if(i > t-(t/2)){
ans -= a[f[i]];
fine[f[i]] = 1;
}
}
return;
}
void find(){
same = true;
for(int i=1;i<=n;i++){
while(!q.empty()){
Q x = q.top();
if(x.sum > a[i]) break;
q.pop();
if(!vis[x.day]){
vis[x.day] = 1;
fa[i] = x.day;
break;
}
}
q.push({i,a[i]});
}
for(int i=1;i<=n;i++){
if(!vis[i]){
solve(i);
}
}
if(same) return;
int newn=0;
for(int i=1;i<=n;i++){
if(!fine[i]) a[++newn] = a[i];
}
if(newn <= 1)return;
for(int i=1;i<=newn;i++){
fa[i] = fine[i] = vis[i] = 0;
}
n = newn;
find();
return;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
find();
printf("%lld\n",ans);
return 0;
}
简单解释一下,大致思路就是对于每一天,选择前面最小的买入股票的一天买入股票并于这一天卖出,然后统计收益,再将没有参与买卖的部分加入一个新的数组数组重复以上操作,直到剩余序列单调不降
想知道是思路错了还是代码有问题