求调
查看原帖
求调
796667
ZY_jiang楼主2024/4/11 13:48

本蒟蒻是用trajan做的,样例过了,但WA

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lulu pair<ll,int>
#define ls u/2
#define rs (u/2)+1
#define F(i,j,n) for(int i=(j);i<=(n);i++)
const int N=3e5+10;
const int mod=998244353;
vector <ll> adj[N];
vector <lulu> asked[N];
priority_queue< lulu , vector<lulu> , greater<lulu> > maxpairq;
priority_queue< ll , vector<ll> , greater<ll> > maxq;
priority_queue< lulu ,vector <lulu> > minpairq;
priority_queue< ll ,vector <ll> > minq;
queue <ll> q;
deque <ll> pq;
ll dep[N],sum1,sum2,sum3,n,m,a[N],sum[N],ans[N],k[N];
int vis[N];
struct node{
	ll u,v,k;
}scan[N];
ll dp[110][110],fa[N],root;
string s1,s2,s3,s;
char ch[N],chara;
ll powMod(ll a, ll b) {
    ll res = 1;
    a %= mod;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
void init(){
	F(i,1,N){
		fa[i]=i;
	}
}
ll find(ll x){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
} 
void trajan(ll u){
	vis[u]=1;
	for(auto v:adj[u]){
		if(vis[v]==1) continue;
		trajan(v);
		fa[v]=u; 	
	}
	for(auto q:asked[u]){
		ll v=q.first,i=q.second;
		if(vis[v]==1){
			ans[i]=find(v);
		} 
	}
}
void dfs(ll u,ll f){
	dep[u]=dep[f]+1;
	for(ll v:adj[u]){
		if(v==f) continue;
		dfs(v,u);
	}
}
int main(){
	init();
	cin>>n;
	for(int i=1;i<=n-1;i++){
		ll u,v;
		cin>>u>>v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	dep[0]=-1;
	dfs(1,0);
	cin>>m; 
	for(int i=1;i<=m;i++){
		ll u,v;
		cin>>u>>v>>scan[i].k;
		scan[i].u=u;
		scan[i].v=v;
		asked[u].push_back({v,i});
		asked[v].push_back({u,i});
	}
	trajan(1);
	for(int ti=1;ti<=m;ti++){
		ll cnt=0;
		ll u=scan[ti].u;
		ll v=scan[ti].v;
		ll k=scan[ti].k;
		for(int i=dep[ans[ti]]+1;i<=dep[u];i++){
			cnt=(cnt+powMod(i,k)+2*mod)%mod;
		}
		for(int j=dep[ans[ti]]+1;j<=dep[v];j++){
			cnt=(cnt+powMod(j,k)+2*mod)%mod;
		}
		cnt=(cnt+dep[ans[ti]]+2*mod)%mod;
		cout<<cnt<<endl;
	}
	return 0;
}
2024/4/11 13:48
加载中...