神秘 F 题过不了样例求调
  • 板块学术版
  • 楼主Milthm
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/9/21 21:43
  • 上次更新2024/9/21 22:32:25
查看原帖
神秘 F 题过不了样例求调
761125
Milthm楼主2024/9/21 21:43

rt,思路是把很多在一起且只连接了后面一个点的边合并,但是好像 dp 挂了,不知道为什么

#include<bits/stdc++.h>
#define int long long
#define N 400005
using namespace std;
const int mod=998244353;
int n,m,k,vis[N],h[N],num,dp[205][N],b[N],cnt;
struct edge{
	int u,v,w,nxt;
}e[N*2];
void add(int u,int v,int w){
	e[++num]={u,v,w,h[u]};h[u]=num;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=m;++i){
		int u,v;cin>>u>>v;add(u,v,1);
		vis[u]=vis[v]=1;
	}
	if(!vis[1])vis[1]=1;
	int now=1;
	while(now<=n){
		for(int i=now+1;;++i){
			int qwq=(i-1)%n+1;
			if(vis[qwq]){
				add(now,qwq,i-now);now=i;break;
			}
		}
	}
	for(int i=1;i<=num;++i)b[++cnt]=e[i].u,b[++cnt]=e[i].v;
	for(int i=1;i<=num;++i){
		e[i].u=lower_bound(b+1,b+cnt+1,e[i].u)-b;
		e[i].v=lower_bound(b+1,b+cnt+1,e[i].v)-b;
	}
	dp[1][1]=1;
	for(int i=1;i<=k;++i){
		for(int j=1;j<=cnt;++j){
			for(int l=h[j];l;l=e[l].nxt){
				int v=e[l].v,w=e[l].w;
				if(i+w<=k)dp[v][i+w]=(dp[v][i+w]+dp[j][i])%mod;
			}
		}
	}
	int ans=0;
	for(int i=1;i<=cnt;++i)ans=(ans+dp[i][k])%mod;
	cout<<ans;
	return 0;
}

2024/9/21 21:43
加载中...