zoukankan      html  css  js  c++  java
  • 点分治模板

    #include <bits/stdc++.h>
    
    const int MaxN = 100010;
    const int lim = 10000010;
    
    struct edge
    {
        int to, next, dis;
    };
    
    edge e[MaxN << 1];
    int query[1010], sum, root, ans, n, m;
    int cnt, head[MaxN], vis[MaxN], test[lim], ok[lim];
    int maxp[MaxN], size[MaxN], dis[MaxN], rem[MaxN], q[MaxN];
    
    inline void add_edge(int u, int v, int d)
    {
        ++cnt;
        e[cnt].to = v;
        e[cnt].dis = d;
        e[cnt].next = head[u];
        head[u] = cnt;
    }
    
    void getroot(int u, int fa)
    {
        size[u] = 1, maxp[u] = 0;
        for (int i = head[u]; i; i = e[i].next)
        {
            int v = e[i].to;
            if (v == fa || vis[v])
                continue;
            getroot(v, u);
            size[u] += size[v];
            maxp[u] = std::max(maxp[u], size[v]);
        }
        maxp[u] = std::max(maxp[u], sum - size[u]);
        if (maxp[u] < maxp[root])
            root = u;
    }
    
    void getdis(int u, int fa)
    {
        rem[++rem[0]] = dis[u];
        for (int i = head[u]; i; i = e[i].next)
        {
            int v = e[i].to;
            if (v == fa || vis[v])
                continue;
            dis[v] = dis[u] + e[i].dis;
            getdis(v, u);
        }
    }
    
    void calc(int u)
    {
        int p = 0;
        for(int i = head[u]; i; i = e[i].next)
        {
            int v = e[i].to;
            if(vis[v])
                continue;
            rem[0] = 0;
            dis[v] = e[i].dis;
            getdis(v, u);
            for(int j = rem[0]; j; --j)
                for(int k = 1; k <= m; ++k)
                    if(query[k] >= rem[j])
                        test[k] |= ok[query[k] - rem[j]];
            for(int j = rem[0]; j; --j)
                q[++p] = rem[j], ok[rem[j]] = 1;
        }
        for(int i = 1; i <= p; ++i)
            ok[q[i]] = 0;
    }
    void solve(int u)
    {
        vis[u] = ok[0] = 1;
        calc(u);
        for(int i = head[u]; i; i = e[i].next)
        {
            int v = e[i].to;
            if(vis[v])
                continue;
            sum = size[v];
            maxp[root = 0] = lim;
            getroot(v, 0);
            solve(root);
        }
    }
    
    int main()
    {
        scanf("%d%d", &n, &m);
        for(int i = 1; i < n; i++)
        {
            int u, v, d;
            scanf("%d%d%d", &u, &v, &d);
            add_edge(u, v, d);
            add_edge(v, u, d);
        }
        for(int i = 1; i <= m; i++)
            scanf("%d", &query[i]);
        maxp[root] = sum = n;
        getroot(1, 0);
        solve(root);
        for(int i = 1; i <= m; i++)
        {
            if(test[i])
                printf("AYE
    ");
            else 
                printf("NAY
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    PHP字符串
    PHP第四章数组2
    oop soa cbd
    spring 时间组件
    IReport 常见问题整理
    maven 与 jenkins 集成的时候,打包出现错误处理
    Mybatis 传递参数中的_paramter 的理解
    JS 之表单特殊控制
    JQuery 中设置AJAX 的全局函数
    spring + ehcache 整合
  • 原文地址:https://www.cnblogs.com/little-sun0331/p/10314754.html
Copyright © 2011-2022 走看看