zoukankan      html  css  js  c++  java
  • CF570D Tree Requests(树上启发式合并)

    比较常规的套路,是我做的第二道模板题

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<ll,ll> pll;
    const int N=1e6+10;
    const int M=2e6+10;
    const int inf=0x3f3f3f3f;
    const ll mod=998244353;
    int ans[N];
    int h[N],ne[N],e[N],idx;
    int cnt[N][27];
    int son[N],sz[N];
    int flag;
    int depth[N];
    int w[N];
    struct node{
        int id,d;
    };
    vector<node> s[N];
    void add(int a,int b){
        e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }
    void dfs1(int u,int fa){
        int i;
        sz[u]=1;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa)
                continue;
            depth[j]=depth[u]+1;
            dfs1(j,u);
            sz[u]+=sz[j];
            if(sz[j]>sz[son[u]]){
                son[u]=j;
            }
        }
    }
    void cal(int u,int fa,int k){
        cnt[depth[u]][w[u]]+=k;
        int i;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa||j==flag)
                continue;
            cal(j,u,k);
        }
    }
    bool check(int d){
        int i;
        int res=0;
        for(i=0;i<26;i++){
            res+=(cnt[d][i]%2);
        }
        return res<=1;
    }
    void dfs(int u,int fa,int keep){
        int i;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa||j==son[u])
                continue;
            dfs(j,u,0);
        }
        if(son[u]){
            dfs(son[u],u,1);
            flag=son[u];
        }
        cal(u,fa,1);
        flag=0;
        for(auto x:s[u]){
            int a=x.id;
            int b=x.d;
            ans[a]=check(b);
        }
        if(!keep){
            cal(u,fa,-1);
        }
    }
    int main(){
        ios::sync_with_stdio(false);
        memset(h,-1,sizeof h);
        int n,m;
        cin>>n>>m;
        int i;
        for(i=2;i<=n;i++){
            int x;
            cin>>x;
            add(i,x);
            add(x,i);
        }
        depth[1]=1;
        dfs1(1,-1);
        for(i=1;i<=n;i++){
            char c;
            cin>>c;
            w[i]=c-'a';
        }
        for(i=1;i<=m;i++){
            int x,y;
            cin>>x>>y;
            s[x].push_back({i,y});
        }
        dfs(1,-1,0);
        for(i=1;i<=m;i++){
            if(ans[i]){
                cout<<"Yes
    ";
            }
            else{
                cout<<"No
    ";
            }
        }
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    JS数组去重
    正则表达式验证邮箱手机号等
    js中的事件委托
    c++刷题(6/100)最长上升子序列
    c++刷题(3/100)数独,栈和队列
    在express中HMR(合并express和webpack-dev-server)
    面试整理(3)js事件委托
    面试整理(2)跨域:jsonp与CORS
    面试整理(1):原生ajax
    styled-components真的好吗?
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13610931.html
Copyright © 2011-2022 走看看