zoukankan      html  css  js  c++  java
  • 点分治成品

    https://www.luogu.org/problemnew/show/P2664

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define INF 0x3f3f3f3f
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define pqueue priority_queue
    #define NEW(a,b) memset(a,b,sizeof(a))
    #define lowbit(x) (x&(-x))
    #define si(x) scanf("%d",&x)
    #define sl(x) scanf("%lld",&x)
    #define lc (d<<1)
    #define rc (d<<1|1)
    const double pi=4.0*atan(1.0);
    const double e=exp(1.0);
    const int maxn=1e4+8;
    typedef long long LL;
    typedef unsigned long long ULL;
    const LL mod=1e9+7;
    const ULL base=1e7+7;
    using namespace std;
    struct node{
        int to,nxt;
        LL val;
    }g[maxn*2];
    LL q[maxn];
    int head[maxn],cnt=0;
    int Siz[maxn],son[maxn];
    int Size,mx,root,num;
    bool vis[maxn],used[maxn*1000];
    LL ans,kk;
    void add(int x,int y,LL val){
        g[cnt].to=y;
        g[cnt].nxt=head[x];
        g[cnt].val=val;
        head[x]=cnt++;
    }
    //求重心
    void Findroot(int u,int fa){
        Siz[u]=1;
        son[u]=0;
        int t=head[u];
        while(t!=-1){
            if(g[t].to!=fa&&!vis[g[t].to]){
                Findroot(g[t].to,u);
                Siz[u]+=Siz[g[t].to];
                son[u]=max(son[u],Siz[g[t].to]);
            }
            t=g[t].nxt;
        }
        son[u]=max(son[u],Size-Siz[u]);
        if(son[u]<mx) mx=son[u],root=u;
    }
    LL solve(int u,int fa,int k,int v){
        if(k<=kk)
            q[++num]=k;
        if(u==v) used[k]=1;
        int gg=num;
        int t=head[u];
        while(t!=-1){
            if(g[t].to!=fa&&!vis[g[t].to]){
                solve(g[t].to,u,k+g[t].val,v);
                if(u==v){
                    for(int i=gg+1;i<=num;i++){
                        if(kk-q[i]>=0&&used[kk-q[i]]){
                            return 1;
                        }
                    }
                    for(int i=gg+1;i<=num;i++){
                        used[q[i]]=1;
                    }
                    gg=num;
                }
            }
            t=g[t].nxt;
        }
        return 0;
    }
    //点分治
    void Divide(int u){
        for(int i=1;i<=num;i++){
            used[q[i]]=0;
        }
        num=0;
        ans+=solve(u,0,0,u);
        if(ans) return ;
        int t=head[u];
        vis[u]=1;
        while(t!=-1){
            if(vis[g[t].to]){
                t=g[t].nxt;
                continue;
            }
            mx=INF;
            Size=Siz[g[t].to];
            root=u;
            Findroot(g[t].to,u);
            Divide(root);
            t=g[t].nxt;
        }
    }
    int main(){
        int n,m;
        int x,y;
        LL val;
        memset(head,-1,sizeof(head));
        scanf("%d%d",&n,&m);
        for(int i=1;i<n;i++){
            scanf("%d%d%lld",&x,&y,&val);
            add(x,y,val);
            add(y,x,val);
        }
        for(int i=1;i<=m;i++){
            scanf("%lld",&kk);
            ans=0;
            for(int j=1;j<=n;j++) vis[j]=0;
            Size=n;
            mx=INF;
            Findroot(1,0);
            Divide(root);
            if(ans) cout<<"AYE"<<endl;
            else cout<<"NAY"<<endl;
        }
    }
  • 相关阅读:
    二分查找
    转:归并排序
    C++ STL stack和queue
    spring-第十九篇AOP面向切面编程之增强处理的优先级
    spring-第十八篇之spring AOP基于XML配置文件的管理方式
    spring-第十七篇之spring AOP基于注解的零配置方式
    spring-第十一篇之SpEL表达式
    spring-第八篇之容器中的bean的生命周期
    spring-第七篇之深入理解容器中的bean
    spring-第二篇ApplicationContext国际化及事件机制
  • 原文地址:https://www.cnblogs.com/Profish/p/10452266.html
Copyright © 2011-2022 走看看