100 pts 但被 hack 数据叉出去了球条
查看原帖
100 pts 但被 hack 数据叉出去了球条
973540
Kun_is_Me楼主2025/7/25 11:20

Rt。评测记录

#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
struct Edge{int to,next;}edges[114514*3*2]; 
int head[114514*3],tot=0,fa[114514*3][20],lg[114514*3],dep[114514*3],n,m;
bool v[114514*3]={0};
void adde(int from,int to)
{
    edges[tot]={to,head[from]};
    head[from]=tot++;
}
void dfs(int nde,int d) 
{
    v[nde]=1;
    dep[nde]=d;
    if(nde==1) fa[nde][0]=0;  
    for (int i=1;i<=lg[dep[nde]];i++) fa[nde][i]=fa[fa[nde][i-1]][i-1];
    for (int i=head[nde];i!=-1; i=edges[i].next) 
	{
        int nxt=edges[i].to;
        if (!v[nxt]) 
		{
            fa[nxt][0]=nde;
            dfs(nxt,d+1);
        }
    }
}
int lca(int x,int y) 
{
    if (dep[x]<dep[y]) swap(x, y);
    for (int i=lg[dep[x]];i>=0;i--) if (dep[x] - (1<<i) >= dep[y]) x = fa[x][i];
    if (x == y) return x;
    for (int i=lg[dep[x]];i>=0;i--) 
        if (fa[x][i] != fa[y][i]) 
		{
            x = fa[x][i];
            y = fa[y][i];
        }
    
    return fa[x][0];
}
int fpow(int a,int n) 
{
    int ans=1;
    a%=mod;
    while(n) 
	{
        if(n&1)ans=1LL*ans*a%mod;
        a=1LL*a*a%mod;
        n>>=1;
    }
    return ans;
}
void pth(int x,int l,vector<int>& nodes) 
{
    while(x != l) nodes.push_back(x),x=fa[x][0];
    nodes.push_back(l);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    lg[0]=-1;
    for (int i=1;i<=200000;i++) lg[i]=lg[i/2]+1;
    memset(head,-1,sizeof(head));
    cin>>n;
    for(int i=1;i<n;i++) 
	{
        int u,v;
        cin>>u>>v;
        adde(u,v),adde(v,u);
    }
    dfs(1,0);
    cin>>m;
    while(m--) 
	{
        int x,y,z;
        cin>>x>>y>>z;
        int l=lca(x,y);
        vector<int>nodes;
        pth(x,l,nodes);
        pth(y,l,nodes);
        if(nodes.size()>1&&nodes.back()==l) nodes.pop_back();
        int sum=0;
        for(int node:nodes) sum=(sum+fpow(dep[node],z))%mod;
        cout<<sum<<endl;
    }
    return 0;
}
2025/7/25 11:20
加载中...