悬赏关注,CF上第三个测试点的第7871种情况WA
查看原帖
悬赏关注,CF上第三个测试点的第7871种情况WA
329698
youdu666楼主2022/11/11 23:10

人疯掉了

#include<bits/stdc++.h>
#define int long long 
using namespace std;
inline int read(void)
{
    int x=0,y=1;
    char c=getchar();
    while(c>'9'||c<'0')
    {
        if(c=='-')
            y=-1;
        c=getchar();
    }
    while(c<='9'&&c>='0')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x*y;
}
const int N=1e6+5,M=1005,INF=2e9+20071112;
int n,m,dp[M];
struct kof{
    int ip,t,p;
    bool operator<(const kof &T)const{
        return p<T.p;
    }
};
vector<kof> v[N];
int bk[M],bkk[M];
int a[N],ans[N],ansn;
int x,y,z;
inline int ddp(int x)
{
    for(int i=1;i<=200;i++)
        dp[i]=INF;
    memset(bk,0,sizeof bk);
    memset(bkk,0,sizeof bkk);
    dp[0]=0;
    int cnt=0;
    for(auto i:v[x])
    {
        int a=i.t,b=i.p;
        for(int j=0;j<=100;j++)
        {
            int tmp=min(j+b,100ll);
            if(dp[tmp]>dp[j]+a&&bkk[j]!=i.ip)
                dp[tmp]=dp[j]+a,bk[tmp]=j,bkk[tmp]=i.ip;
        }
    }
    int ddd=100;
    while(ddd)
    {
        if(dp[ddd]==INF) return 1e9;
        if(!ddd)break;
        ans[++ansn]=bkk[ddd];
        ddd=bk[ddd];
    }
    return dp[100];
}
signed main()
{
    int T=read();
    while(T--)
    {
        n=read(),m=read();
        ansn=0;
        for(int i=1;i<=n;i++)
            a[i]=read();
        for(int i=0;i<=n;i++)
            v[i].clear();
        for(int i=1;i<=m;i++)
        {
            x=read(),y=read(),z=read();
            v[x].emplace_back((kof){i,y,z});
        }
        int t=0;
        bool fk=false;
        for(int i=1;i<=n;i++)
        {
            t+=ddp(i);
            if(t>a[i])
            {
                printf("-1\n");
                fk=true;
                break;
            }
        }
        if(!fk)
        {
            printf("%lld\n",ansn);
            for(int i=1;i<=ansn;i++)
                printf("%lld ",ans[i]);
            printf("\n");
        }
    }
}
2022/11/11 23:10
加载中...