WA求助 悬赏关注 貌似单调队列出了问题
查看原帖
WA求助 悬赏关注 貌似单调队列出了问题
167875
137QWQ楼主2022/8/27 16:18

#1#2#3#4#5WA

#include<bits/stdc++.h>
using namespace std;
const int N=2010;
const int inf=(1<<31)-1;
int t,maxp,w;
int dp[N][N],dpa[N],dpb[N],cnta,cntb;
struct node
{
    int num[N],id[N],cnt,nid,s,k;
}a;
void start(node& a,int k)
{
    a.cnt=-1; a.nid=0; a.s=0; a.k=k;
}
void push(node& a,int b)
{
    while(a.cnt>=a.s&&a.num[a.cnt]<b)
        --a.cnt;
    a.num[++a.cnt]=b;
    a.id[a.cnt]=++a.nid;
    if(a.nid-a.id[a.s]>=a.k) ++a.s;
}
int top(node& a)
{
    return (a.s<=a.cnt?a.num[a.s]:-inf);
}
int main()
{
    cin>>t>>maxp>>w;
    memset(dp[0]+1,0x80,sizeof(dp[0]));
    int ap,bp,as,bs;
    node dpa,dpb;
    for(int i=1;i<=t;i++)
    {
        cin>>ap>>bp>>as>>bs;
        start(dpa,as);
        for(int j=0;j<=maxp;j++)
        {
            start(dpb,bs);
            dp[i][j]=dp[i-1][j];
            if(j>0)
                push(dpa,dp[max(0,i-w-1)][j-1]-ap); //买入部分用的单调队列  可能问题就在这 
            dp[i][j]=max(dp[i][j],top(dpa));
            for(int k=j+1;k<=min(j+bs,maxp);k++) //j+1~j+bs
            {
                push(dpb,dp[max(0,i-w-1)][k]+(k-j)*bp); //卖出部分直接暴力 没有使用单调队列 
            }
            dp[i][j]=max(dp[i][j],top(dpb));
            //cout<<dp[i][j]<<" ";
        }
        //cout<<endl;
    }
    cout<<dp[t][0];
}
2022/8/27 16:18
加载中...