NOI2020美食家不考虑美食节的部分没问题,为什么美食节的部分挂了(感觉思路没问题)请大佬帮忙看看,代码中已用分割线隔开。
#include<bits/stdc++.h>
using namespace std;
#define N 260
#define ll long long
int n,m,t,p,c[N];
struct festival
{
int t,x,w;
bool operator<(const festival &b)const
{
return t<b.t;
}
}fes[N];
struct mat{ll a[N][N];}ans,base[32];
mat mul(mat x,mat y)
{
mat z;
for(int i=1;i<=n*5;i++)
for(int j=1;j<=n*5;j++) z.a[i][j]=-1e18;
for(int i=1;i<=n*5;i++)
for(int j=1;j<=n*5;j++)
for(int k=1;k<=n*5;k++)
z.a[i][j]=max(z.a[i][j],x.a[i][k]+y.a[k][j]);
return z;
}
mat mul_ans(mat x,mat y)
{
mat z;
for(int i=1;i<=n*5;i++)
for(int j=1;j<=n*5;j++) z.a[i][j]=-1e18;
for(int j=1;j<=n*5;j++)
for(int k=1;k<=n*5;k++)
z.a[1][j]=max(z.a[1][j],x.a[1][k]+y.a[k][j]);
return z;
}
void fst_pow(int b)
{
//if(b<1) return;
int cnt=0;
while(b)
{
if(b&1) ans=mul_ans(ans,base[cnt]);
cnt++;b>>=1;
}
}
/*void test()
{
puts("================");
for(int i=1;i<=5*n;i++,puts(""))
for(int j=1;j<=n*5;j++)
printf("%d ",base.a[i][j]);
puts("================");
}*/
void init()
{
for(int i=1;i<=31;i++)
base[i]=mul(base[i-1],base[i-1]);
}
int main()
{
//freopen("delicacy3.in","r",stdin);
//freopen("ans.out","w",stdout);
cin>>n>>m>>t>>p;
for(int i=1;i<=n;i++) scanf("%d",&c[i]);
for(int i=1;i<=n*5;i++)
for(int j=1;j<=n*5;j++) base[0].a[i][j]=-1e18;
for(int i=1;i<=n;i++)
for(int j=1;j<5;j++) base[0].a[i+j*n][i+(j-1)*n]=0;
for(int i=1,u,v,w;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
base[0].a[v][u+(w-1)*n]=c[v];
}
for(int i=2;i<=5*n;i++) ans.a[1][i]=-1e18;
ans.a[1][1]=c[1];
//memcpy(tmp.a,base.a,sizeof(base.a));
init();
//===================================================
for(int i=1,time,x,w;i<=p;i++)
{
scanf("%d%d%d",&time,&x,&w);
fes[i]=((festival){time,x,w});
}
sort(fes+1,fes+1+p);
int las=0;
for(int i=1;i<=p;i++)
{
int time=fes[i].t,x=fes[i].x,w=fes[i].w;
fst_pow(time-las);
printf("time=%d x=%d ans=%lld\n",time-las,fes[i].x,ans.a[1][x]);
//memcpy(base.a,tmp.a,sizeof(tmp.a));
//test();
ans.a[1][x]+=w;
las=time;
}
fst_pow(t-las);
if(ans.a[1][1]<0) puts("-1");
else cout<<ans.a[1][1];
return 0;
}