HDU - 6268: Master of Subgraph (分治+bitset优化背包)

题意:T组样例,给次给出一个N节点的点权树,以及M,问连通块的点权和sum的情况,输出sum=1到M,用0或者1表示。

思路:背包,N^2,由于是无向的连通块,所以可以用分治优化到NlgN。 然后背包可以用bitset优化。注意不要想着背包合并背包,背包只能合并单点。

#include<bits/stdc++.h>
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Gv G[u][i]
#define feach(i,u) for(int i=0;i<G[u].size();i++)
using namespace std;
const int maxn=3010;
vector<int>G[maxn];
bitset<100010>s[maxn],ans;
int a[maxn],sz[maxn],son[maxn],vis[maxn],rt;
void dfs(int u,int f,int n){
    sz[u]=1; son[u]=0;
    feach(i,u){
        if(Gv==f||vis[Gv]) continue;
        dfs(Gv,u,n);
        sz[u]+=sz[Gv];
        son[u]=max(son[u],sz[Gv]);
    }
    son[u]=max(son[u],n-son[u]);
    if(son[u]<son[rt]) rt=u;
}
void getdp(int u,int f){
    sz[u]=1; s[u]<<=a[u];
    feach(i,u){
        if(Gv==f||vis[Gv]) continue;
        s[Gv]=s[u];
        getdp(Gv,u);
        sz[u]+=sz[Gv];
        s[u]|=s[Gv];
    }
}
void solve(int u){
    vis[u]=1; s[u].reset();s[u][0]=1;
    getdp(u,-1); ans|=s[u];
    feach(i,u){
        if(!vis[Gv]){
            rt=0; dfs(Gv,-1,sz[Gv]);
            solve(rt);
        }
    }
}
int main()
{
    int T,N,M;
    scanf("%d",&T); son[0]=4010;
    while(T--){
        scanf("%d%d",&N,&M);
        rep(i,1,N) G[i].clear(),vis[i]=0;
        ans.reset();
        rep(i,1,N-1){
            int u,v; scanf("%d%d",&u,&v);
            G[u].pb(v); G[v].pb(u);
        }
        rep(i,1,N) scanf("%d",&a[i]);
        rt=0; dfs(1,-1,N);
        solve(rt);
        rep(i,1,M) printf("%d",(int)ans[i]);
        puts("");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hua-dong/p/9694774.html

时间: 2024-11-05 15:54:51

HDU - 6268: Master of Subgraph (分治+bitset优化背包)的相关文章

hdu 6268 Master of Subgraph(点分治+bitset)

You are given a tree with n nodes. The weight of the i-th node is wi. Given a positive integer m, now you need to judge that for every integer i in [1,m] whether there exists a connected subgraph which the sum of the weights of all nodes is equal to

HDU5890:Eighty seven(Bitset优化背包)

Mr. Fib is a mathematics teacher of a primary school. In the next lesson, he is planning to teach children how to add numbers up. Before the class, he will prepare NN cards with numbers. The number on the ii-th card is aiai. In class, each turn he wi

HDU 3842 Machine Works cdq分治 斜率优化

本题是利用cdq分治  实现斜率优化的一个题目 斜率优化之前做的几个题都是斜率单调,并且插入点时由于点在某一维单调,所以仅仅操作队首和队尾就能完成优化了 但是本题显然不是 主要参考了两个东西 从<Cash>谈一类分治算法的应用 (Day1)cdq分治相关 这两个直接在百度上搜 ,第一个出来的就是 本题的题意是 一个公司获得了一个厂房n(10^5)天的使用权 和一笔启动资金C(10^9),准备在n天里租借机器生产来获得收益 可以租借的机器有M(10^5)个,每个机器有四个值,D,P,R,G (D

HDU 5890 Eighty seven(DP+bitset优化)

题目链接 Eighty seven 背包(用bitset预处理)然后对于每个询问O(1)回答即可. 预处理的时候背包. 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i, a, b) for(int i(a); i <= (b); ++i) 6 #define dec(i, a, b) for(int i(a); i >= (b); --i) 7 8 const int N = 52; 9 1

hdu 5890 Eighty seven 暴力+bitset优化背包

Eighty seven Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Problem Description Mr. Fib is a mathematics teacher of a primary school. In the next lesson, he is planning to teach children how to add numbers up. B

HDU 5279 YJC plays Minecraft (分治NTT优化DP)

题目传送门 题目大意:有$n$个小岛,每个小岛上有$a_{i}$个城市,同一个小岛上的城市互相连接形成一个完全图,第$i$个小岛的第$a_{i}$个城市和第$i+1$个小岛的第$1$个城市连接,特别地,第$n$个小岛的第$a_{n}$个城市和第$1$个小岛的第$1$个城市连接.现在要断掉图中的一些边,保证任意两个城市只有一条路径或者不连通,求合法的断边方案总数,$n,a_{i}<=1e5$ 完全不会(喷血 我们对每个小岛单独讨论 如果任意两个城市只有一条路径或者不连通,那么这张图只能是一个森林

POJ1014 Diving bitset优化背包

dp小水题,结果我还WA了一遍qwq 1 #include <cstdio> 2 #include <bitset> 3 #define maxn 120010 4 using namespace std; 5 bitset<maxn> bit; 6 int a[20],tot,T; 7 void work(){ 8 bit.reset(); 9 bit[0]=1,tot/=2; 10 for(int i=1;i<=6;i++){ 11 int k=1; 12 w

hdu 5036 Explosion bitset优化floyd

http://acm.hdu.edu.cn/showproblem.php?pid=5036 题意就是给定一副有向图,现在需要走遍这n个顶点,一开始出发的顶点是这n个之中的随便一个. 如果走了1,那么1能联通的顶点就可以直接走过去,其他不和1连通的,就需要炸坏.问需要炸弹的期望. 比如一副图是1-->2-->3的.那么期望是11 / 6 假如从1号点开始,1/3概率选中1号点开始,那么需要炸弹数是1(炸开一号),贡献是1/3 假如从2号点开始,1/3概率选中2号点开始,那么需要炸开2号点,然后

XJOI NOIP2015模拟赛Day1 T2 ctps bitset优化 或 排序+cdq分治+树状数组+平衡树

题意: 4维空间中有1个点集A,|A|=n,用(a,b,c,d)表示每个点. 共有m个询问,每次询问输入一个点(a,b,c,d),求最大的S,其中S={p|p∈A且ap<=a,bp<=b,cp<=c,dp<=d},输出|S| 输入格式: 第一行n 接下来n行有n个4维点对 第n+2行有一个数m 再接下来m行每行有一个四维点对,表示每个询问 输出格式: 对于每个询问输出一个数 **方法:**bitset优化 或 排序+cdq分治+树状数组+平衡树 解析: 神题,考场不会,暴力骗40,