求助,为什么会TLE
  • 板块P5888 传球游戏
  • 楼主lytqwq
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/2/26 23:11
  • 上次更新2025/8/5 16:20:45
查看原帖
求助,为什么会TLE
104319
lytqwq楼主2020/2/26 23:11

我觉着这是O(mk)O(mk) 的啊QAQ

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
namespace lyt{
	const int N=100001;
	int n,m,k,x[N],y[N],top;
	unordered_map<int,int> qwq;
	long long int dp[N],dp2[N];
	long long int sum,p=998244353;
	void main(){
		scanf("%d%d%d",&n,&m,&k);
		for(int i=1;i<=k;i++){
			scanf("%d%d",&x[i],&y[i]);
			if(qwq[y[i]]==0){
				qwq[y[i]]=top++;
			}
		}
		if(qwq[1]==0){
			qwq[1]=top++;
		}
		dp[qwq[1]]=1;
		sum=1;
		for(int i=1;i<=m;i++){
			dp2[top]=(sum-dp[top]+p)%p;
			dp2[qwq[1]]=(sum-dp[qwq[1]]+p)%p;
			for(int o=1;o<=k;o++){
				dp2[qwq[y[o]]]=sum-dp[qwq[y[o]]];
			}
			for(int o=1;o<=k;o++){
				if(x[o]==y[o]){
					continue;
				}
				if(qwq[x[o]]==0){
					dp2[qwq[y[o]]]-=dp[top];
				}
				else{
					dp2[qwq[y[o]]]-=dp[qwq[x[o]]];
				}
				dp2[qwq[y[o]]]=(dp2[qwq[y[o]]]+p)%p;
			}
			sum=0;
			for(int o=1;o<=k;o++){
				if(dp2[qwq[y[o]]]==-1){
					continue;
				}
				dp[qwq[y[o]]]=dp2[qwq[y[o]]];
				dp2[qwq[y[o]]]=-1;
				sum+=dp[qwq[y[o]]];
				sum%=p;
			}
			if(dp2[qwq[1]]!=-1){
				dp[qwq[1]]=dp2[qwq[1]];
				sum=(sum+dp[qwq[1]])%p;
			}
			dp[top]=dp2[top];
			sum=(sum+1LL*(n-top)*dp[top])%p;
		}
		printf("%lld\n",dp[qwq[1]]%p);
	}
}
int main(){
	lyt::main();
	return 0;
}
2020/2/26 23:11
加载中...