codeforces825G Tree Queries

来源:互联网 发布:怎么做淘宝客服兼职 编辑:程序博客网 时间:2024/05/16 13:53

我们可以将第一个黑点作为树的根。
fi表示点i到根路径上点编号的最小值。那么因为根是黑点,每个点的答案一定包括fi
接下来考虑黑点ji的贡献:

  • ijlca是根,由于fi已经统计过了,ji的贡献就是fj
  • ijlca不是jji的贡献就是jlca路径上点编号的最小值与ilca路径上点编号的最小值。因为lca一定在i到根的路径上,贡献就是fj

那么黑点j对答案的贡献一定是fjdfs一次求出f,每次修改时更新答案就可以了。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;#define N 1000010vector<int>g[N];int i,j,k,n,m,p,a[N],q,x,y,Ans=1e9,Last;inline int Min(int x,int y){    return x<y?x:y;}inline void Dfs(int x,int f){    a[x]=Min(a[f],x);    for(int i=0;i<g[x].size();i++)    if(g[x][i]!=f)Dfs(g[x][i],x);}int main(){    scanf("%d%d",&n,&q);q--;    memset(a,127,sizeof(a));    for(i=1;i<n;i++)scanf("%d%d",&x,&y),g[x].push_back(y),g[y].push_back(x);    scanf("%d%d",&x,&y);y=y%n+1;    Dfs(y,0);    while(q--){        scanf("%d%d",&x,&y);        y=(y+Last)%n+1;        if(x==1)Ans=Min(Ans,a[y]);else Last=Min(Ans,a[y]),printf("%d\n",Last);    }    return 0;}
原创粉丝点击