能帮忙看看哪里有问题吗?
  • 板块学术版
  • 楼主LSG_waterlyf
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/9/26 18:20
  • 上次更新2023/11/5 12:34:15
查看原帖
能帮忙看看哪里有问题吗?
285069
LSG_waterlyf楼主2020/9/26 18:20

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;
}
2020/9/26 18:20
加载中...