85pts TLE #18~20
查看原帖
85pts TLE #18~20
536745
WaTleZero_pt楼主2024/8/8 21:35

求助,为什么会超时,我的代码是 O(125n3log⁡T)O(125n^{3}\log T) 的啊

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,T,k,c[550];
struct Node{
	int u,v,w;
}edge[510];
bool cmp(Node a,Node b){return a.u==b.u?a.w<b.w:a.u<b.u;}
struct Node2{
	int t,x,w;
}req[210];
bool cmp2(Node2 a,Node2 b){return a.t<b.t;}
int cnt;
struct Matrix{ll a[255][255];}A,Graph,G[33],DP[210];
Matrix mul(Matrix a,Matrix b){
	Matrix ans;
	memset(ans.a,0xD0,sizeof(ans.a));
	for(int i=1;i<=cnt;i++){
		for(int j=1;j<=cnt;j++){
			for(int k=1;k<=cnt;k++){
				ans.a[i][k]=max(ans.a[i][k],a.a[i][j]+b.a[j][k]);
			}
		}
	}
	return ans;
}
Matrix mul2(Matrix a,Matrix b){
	Matrix ans;
	memset(ans.a[1],0xD0,sizeof(ans.a[1]));
	for(int j=1;j<=cnt;j++){
		for(int k=1;k<=cnt;k++){
			ans.a[1][k]=max(ans.a[1][k],a.a[1][j]+b.a[j][k]);
		}
	}
	return ans;
}
Matrix pow(Matrix a,ll b){
	Matrix ans;
	memset(ans.a,0xD0,sizeof(ans.a));
	for(int i=1;i<=cnt;i++) ans.a[i][i]=0;
	while(b){
		if(b&1) ans=mul(ans,a);
		b>>=1; a=mul(a,a);
	}
	return ans;
}
int main(){
	for(int i=1;i<=250;i++) A.a[i][i]=1;
	scanf("%d%d%d%d",&n,&m,&T,&k);
	for(int i=1;i<=n;i++) scanf("%d",&c[i]);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
	cnt=n; int cur,len=1;
	memset(Graph.a,0xD0,sizeof(Graph.a));
	sort(edge+1,edge+m+1,cmp);
	for(int i=1;i<=m;i++){
		if(edge[i].u!=edge[i-1].u) cur=edge[i].u,len=1;
//		printf("%d\n",edge[i].u);
		while(edge[i].w>len) Graph.a[cur][++cnt]=0,cur=cnt,len++;
		Graph.a[cur][edge[i].v]=c[edge[i].v];
	}
	for(int i=1;i<=k;i++)
		scanf("%d%d%d",&req[i].t,&req[i].x,&req[i].w);
	++k; req[k].t=T; req[k].x=0; req[k].w=0;
	sort(req+1,req+k+1,cmp2);
	for(int i=0;i<=30;i++)
		G[i]=pow(Graph,(1<<i));
	memset(DP[0].a,0xD0,sizeof(DP[0].a));
	for(int i=1;i<=cnt;i++)
		DP[0].a[i][i]=c[i];
	for(int i=1;i<=k;i++){
		DP[i]=DP[i-1];
		for(int j=30;j>=0;j--){
			if((req[i].t-req[i-1].t)&(1<<j)) DP[i]=mul2(DP[i],G[j]);
		}
		DP[i].a[1][req[i].x]+=req[i].w;
	}
	if(DP[k].a[1][1]>=0) printf("%lld",DP[k].a[1][1]);
	else printf("-1");
}
2024/8/8 21:35
加载中...