rt,P6772 中提交以下代码能过 4 个点,而本地怎么直接运行错误啊,就是不输入就 RE 了
把快速幂部分注释掉就行了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=250;
int n,m,T,k,l;
int c[N];
int read() {
int x=0; char c=0; while (!isdigit(c) ) c=getchar();
while (isdigit(c) ) x=(x<<3)+(x<<1)+(c&15),c=getchar();
return x;
}
struct Matrix
{
ll a[N][N];
Matrix() { memset(a,0xcf,sizeof a); }
void I() { for (int i=0;i<l;i++) a[i][i]=0; }
Matrix friend operator *(Matrix a,Matrix b)
{
Matrix c;
for (int i=0;i<l;i++)
for (int j=0;j<l;j++)
for (int k=0;k<l;k++)
c.a[i][j]=max(c.a[i][j],a.a[i][k]+b.a[k][j]);
return c;
}
}ans,base;
int main()
{
n=read(),m=read(),T=read(),k=read(),l=n*5;
for (int i=0;i<n;i++) c[i]=read();
while (m--) {
int x=read()-1,y=read()-1;
base.a[x][n*(read()-1)+y]=c[y];
}
ans.I();
for (int i=0;i<n;i++)
for (int j=1;j<5;j++)
base.a[n*j+i][n*(j-1)+i]=0;
while (T) {
if (T&1) ans=ans*base;
base=base*base,T>>=1;
}
if (ans.a[0][0]<0) printf("-1");
else printf("%lld",ans.a[0][0]+c[0]);
return 0;
}