ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[P3806] 【模板】点分治 - 点分治

2020-02-01 09:54:49  阅读:226  来源: 互联网

标签:return int 分治 long bl vector buc P3806 模板


辣鸡蒟蒻怎么今天才来敲这个模板题
好像还敲了很久的样子
(大雾)

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 10005;

vector<pair<int,int> > g[N];
int dis[N],siz[N],msiz[N],n,m,k[N],ans[N],u[N];
vector <int> st;
int buc[10000005];
vector <int> bl;
vector <int> wl;

void buc_push(int x) {
    if(x>1e+7) return;
    buc[x]=1;
    bl.push_back(x);
}
int buc_query(int x) {
    if(x<0 || x>1e+7) return 0;
    return buc[x];
}
void buc_clear() {
    for(int i=0;i<bl.size();i++)
        buc[bl[i]]=0;
    bl.clear();
}

void dfs1(int p,int from) {
    siz[p]=1;
    msiz[p]=0;
    st.push_back(p);
    for(int i=0;i<g[p].size();i++) {
        int q=g[p][i].first, w=g[p][i].second;
        if(q!=from && u[q]==0) {
            dfs1(q,p);
            siz[p]+=siz[q];
            msiz[p]=max(msiz[p],siz[q]);
        }
    }
}

void dfs2(int p,int from) {
    for(int i=0;i<g[p].size();i++) {
        int q=g[p][i].first, w=g[p][i].second;
        if(q!=from && u[q]==0) {
            dis[q]=dis[p]+w;
            dfs2(q,p);
        }
    }
}

void dfs3(int p,int from) {
    for(int i=1;i<=m;i++) {
        if(buc_query(k[i]-dis[p])) ans[i]=1;
    }
    for(int i=0;i<g[p].size();i++) {
        int q=g[p][i].first, w=g[p][i].second;
        if(q!=from && u[q]==0) {
            dfs3(q,p);
        }
    }
    wl.push_back(dis[p]);
}

int findroot(int p) {
    st.clear();
    dfs1(p,0);
    int r=0,rv=1e+9;
    for(int i=0;i<st.size();i++) {
        msiz[st[i]]=max(msiz[st[i]],siz[p]-siz[st[i]]);
        if(msiz[st[i]]<rv) r=st[i],rv=msiz[st[i]];
    }
    return r;
}

void calc(int p) {
    dis[p]=0;
    dfs2(p,0);
    buc_clear();
    buc_push(0);
    for(int i=0;i<g[p].size();i++) {
        int q=g[p][i].first, w=g[p][i].second;
        if(u[q]==0) {
            dfs3(q,0);
            for(int j=0;j<wl.size();j++) {
                buc_push(wl[j]);
            }
            wl.clear();
        }
    }
}

void solve(int p) {
    int r=findroot(p);
    u[r]=1;
    calc(r);
    for(int i=0;i<g[r].size();i++) {
        int q=g[r][i].first, w=g[r][i].second;
        if(u[q]==0) {
            solve(q);
        }
    }
}

signed main() {
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<n;i++) {
        int t1,t2,t3;
        scanf("%lld%lld%lld",&t1,&t2,&t3);
        g[t1].push_back(make_pair(t2,t3));
        g[t2].push_back(make_pair(t1,t3));
    }
    for(int i=1;i<=m;i++) scanf("%lld",&k[i]);
    solve(1);
    for(int i=1;i<=m;i++) {
        cout<<(ans[i]?"AYE":"NAY")<<endl;
    }
}

标签:return,int,分治,long,bl,vector,buc,P3806,模板
来源: https://www.cnblogs.com/mollnn/p/12247590.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有