WA on test 6 求调
查看原帖
WA on test 6 求调
856004
Grammar_hbw楼主2025/1/24 13:19

真的不能用一个类表示 a+2b1a+2^b-1,然后做一次分层图dij吗?

#include <bits/stdc++.h>
using namespace std;
const int N=200007,mod=998244353;
int pw[N<<1];
vector<int> to[N<<1];
struct num{
	int a,b;
	bool operator<(const num o)const{
		if(max(b,o.b)>21){
			if(b==o.b) return a<o.a;
			return b<o.b;
		}
		return a+pw[b]<o.a+pw[o.b];
	}
	operator int()const{int u=a+pw[b]-1;if(u>=mod)u-=mod;if(u<0)u+=mod;return u;}
} f[N<<1];
struct node{
	int pos;
	num val;
	bool operator<(const node o)const{return o.val<val;}
}; priority_queue<node> q;
bool vis[N<<1];
int main(){
	cin.tie(0)->sync_with_stdio(0);
	int n,m;
	cin>>n>>m;
	pw[0]=1;
	for(int i=1;i<(N<<1);i++) if((pw[i]=pw[i-1]<<1)>=mod) pw[i]-=mod;
	for(int i=1,u,v;i<=m;i++) cin>>u>>v,to[u*2].push_back(v*2),to[v*2+1].push_back(u*2+1);
	for(int i=1;i<=n;i++) to[i*2].push_back(i*2+1),to[i*2+1].push_back(i*2);
	memset(f,'?',sizeof(f));
	q.push({2,f[2]={0,0}});
	while(!q.empty()){
		int u=q.top().pos;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(auto i:to[u]) if((i^u)&1){
			num v=f[u];v.b++;
			if(v<f[i]) q.push({i,f[i]=v});
		}else{
			num v=f[u];v.a++;
			if(v<f[i]) q.push({i,f[i]=v});
		}
	}
	cout<<int(min(f[n*2],f[n*2+1]))<<'\n';
	return 0;
}
2025/1/24 13:19
加载中...