• 点分治模板


    题目链接

    #include <bits/stdc++.h>
    using namespace std;
    
    #define RG register int
    #define LL long long
    
    template<typename elemType>
    inline void Read(elemType &T){
        elemType X=0,w=0; char ch=0;
        while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
        while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        T=(w?-X:X);
    }
    
    struct Graph{
        struct edge{int Next,to,w;};
        edge G[20010];
        int head[10010];
        int cnt;
    
        Graph():cnt(2){}
        void clear(int node_num=0){
            cnt=2;
            if(node_num==0) memset(head,0,sizeof(head));
            else fill(head,head+node_num+5,0);
        }
        void add_edge(int u,int v,int w){
            G[cnt].w=w;
            G[cnt].to=v;
            G[cnt].Next=head[u];
            head[u]=cnt++;
        }
    };
    Graph G;
    const int maxn=10010;
    vector<pair<int,int> > ask;
    vector<int> CurDis;
    int Size[maxn],Dis[maxn],ans[maxn];
    bool vis[maxn];
    int N,M,Root,CurSize,MaxSize;
    
    void GetRoot(int u,int fa){
        Size[u]=1;
        int mx=0;
        for(int i=G.head[u];i;i=G.G[i].Next){
            int v=G.G[i].to;
            if(v==fa || vis[v]) continue;
            GetRoot(v,u);
            Size[u]+=Size[v];
            mx=max(mx,Size[v]);
        }
        mx=max(mx,CurSize-Size[u]);
        if(mx<MaxSize){MaxSize=mx;Root=u;}
    }
    
    void GetDis(int u,int fa){
        Size[u]=1;
        CurDis.push_back(Dis[u]);
        for(int i=G.head[u];i;i=G.G[i].Next){
            int v=G.G[i].to;
            if(vis[v] || v==fa) continue;
            Dis[v]=Dis[u]+G.G[i].w;
            GetDis(v,u);
            Size[u]+=Size[v];
        }
    }
    
    void Calc(int u,int len,int add){
        CurDis.clear();
        Dis[u]=len;
        GetDis(u,0);
        sort(CurDis.begin(),CurDis.end());
        for(auto it:ask){
            int k=it.first;
            for(int L=0,R=CurDis.size()-1;L<R;++L){
                while(L<R && CurDis[L]+CurDis[R]>k) --R;
                if(CurDis[L]+CurDis[R]==k) ans[it.second]+=add;
            }
        }
        return;
    }
    
    void Divide(int u){
        Calc(u,0,1);
        vis[u]=true;
        for(int i=G.head[u];i;i=G.G[i].Next){
            int v=G.G[i].to;
            if(vis[v]) continue;
            Calc(v,G.G[i].w,-1);
            CurSize=MaxSize=Size[v];
            Root=0;GetRoot(v,0);
            Divide(Root);
        }
    }
    
    int main(){
        Read(N);Read(M);
        for(int i=1;i<=N-1;++i){
            int u,v,w;
            Read(u);Read(v);Read(w);
            G.add_edge(u,v,w);
            G.add_edge(v,u,w);
        }
        for(int i=1;i<=M;++i){
            int k;Read(k);
            ask.push_back(make_pair(k,i));
        }
        sort(ask.begin(),ask.end());
        CurSize=MaxSize=N;
        Root=0;GetRoot(1,0);Divide(Root);
        for(int i=1;i<=M;++i){
            if(ans[i]) printf("AYE
    ");
            else printf("NAY
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    JAVA-初步认识-第八章-继承-概述
    JAVA-初步认识-第八章-单例设计模式-懒汉式
    JAVA-初步认识-第八章-单例设计模式-内存图解
    JAVA-初步认识-第八章-单例设计模式-概述体现
    JAVA-初步认识-第八章-数组工具类文档注释
    JAVA-初步认识-第八章-数组工具类中静态的使用
    JAVA-初步认识-第八章-数组工具对象建立
    JAVA-初步认识-第七章-this关键字-静态代码块
    CUTE FTP 控制连接已关闭
    两个List,第二个List根据第一个List排序
  • 原文地址:https://www.cnblogs.com/AEMShana/p/14007675.html
Copyright © 2020-2023  润新知