hdu6268 Master of Subgraph(点分治+连通块背包+bitset优化)

news/2024/11/17 5:47:11/

题意:

在这里插入图片描述

解法:

一开始肯定考虑树形dp,
任取一个点作为根,令d[x][i]表示x的子树是否可以组合成i,
复杂度O(n* m^2),bitset优化的话也还是要O(n* m^2 /64),
主要问题在于dp[v]合并到dp[x]上每次需要O(m),没什么办法优化.可以考虑不进行背包dp[v]和背包dp[x]的合并,
而是用点a[v]和背包dp[x]合并,
这样有点像求数链的背包数组,
但是如果我们回溯点v的时候不删除a[v]的贡献,
那么就变成求连通块的背包数组了,
这样的计算方法需要固定一个点x,
这个点x必须选使得连通块不断开,
可以用点分治做,因为点分治过程中重心是必选的..

code:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=3e3+5;
bitset<100005>d[maxm],ans;
vector<int>g[maxm];
int sz[maxm],son[maxm];
int mark[maxm];
int size,root;
int a[maxm];
int n,m;
void getroot(int x,int fa){sz[x]=1;son[x]=0;for(int v:g[x]){if(v==fa||mark[v])continue;getroot(v,x);sz[x]+=sz[v];son[x]=max(son[x],sz[v]);}son[x]=max(son[x],size-sz[x]);if(son[root]>son[x]){root=x;}
}
void dp(int x,int fa){for(int v:g[x]){if(v==fa||mark[v])continue;d[v]=(d[x]<<a[v]);dp(v,x);d[x]|=d[v];}
}
void divide(int x){mark[x]=1;d[x].reset();d[x][a[x]]=1;dp(x,-1);ans|=d[x];for(int v:g[x]){if(mark[v])continue;son[root=0]=size=sz[v];getroot(v,-1);divide(root);}
}
void solve(){cin>>n>>m;for(int i=1;i<=n;i++)g[i].clear();for(int i=1;i<=n;i++)mark[i]=0;ans.reset();for(int i=1;i<n;i++){int a,b;cin>>a>>b;g[a].push_back(b);g[b].push_back(a);}for(int i=1;i<=n;i++)cin>>a[i];son[root=0]=size=n;getroot(1,-1);divide(root);for(int i=1;i<=m;i++){cout<<ans[i];}cout<<endl;
}
signed main(){ios::sync_with_stdio(0);int T;cin>>T;while(T--){solve();}return 0;
}


http://www.ppmy.cn/news/177077.html

相关文章

[LOJ#6268] 分拆数 [多项式求ln][多项式exp]

Link LOJ - https://loj.ac/problem/6268 G ( x ) ∑ n 0 ∞ p r ( n ) x n ∏ k 1 n ( 1 x k x 2 k ⋯ x ⌊ n k ⌋ k ) G(x)\sum\limits_{n0}^\infty p_r(n)x^n\prod\limits_{k1}^{n}(1x^kx^{2k}\cdotsx^{\lfloor\frac{n}{k}\rfloor k}) G(x)n0∑∞​pr​(n)xnk1∏n​…

题解 P6268 【[SHOI2002]舞会】

题目链接 某学校要召开一个舞会。已知学校所有 nn 名学生中&#xff0c;有些学生曾经互相跳过舞。当然跳过舞的学生一定是一个男生和一个女生。在这个舞会上&#xff0c;要求被邀请的学生中的任何一对男生和女生互相都不能跳过舞。求这个舞会最多能邀请多少个学生参加。 这道题…

MTK6268-FAT

1. MBR(Master Boot Record) 高亮前的446个字节为MBR引导代码, 之后为DPT(Disk Patition Table)占64个字节, 再之后两位(55 AA(101010110101010))位结束符.(第1扇区结束) DPT结构: 表1 分区表第1字段(第一分区) 字节位移 字段长度 值 字段名和定义 0x01BE BYTE 0x80 …

P6268 [SHOI2002]舞会 题解

博客园同步 原题链接 前置知识&#xff1a; 匈牙利算法 简要题意&#xff1a; 求图的二分图最大独立集。 二分图最大独立集指&#xff1a;最大的一个点集使得每两个点都不在同一边上的这个点集的大小。 你会发现&#xff0c;这和 二分图最大匹配 似乎是有联系的。 给出…

洛谷 P6268 [SHOI2002]舞会(二分图最大独立集)

[SHOI2002]舞会 题目描述 某学校要召开一个舞会。已知学校所有 n n n 名学生中&#xff0c;有些学生曾经互相跳过舞。当然跳过舞的学生一定是一个男生和一个女生。在这个舞会上&#xff0c;要求被邀请的学生中的任何一对男生和女生互相都不能跳过舞。求这个舞会最多能邀请多…

[HDU6268]Master of Subgraph

[HDU6268]Master of Subgraph 题目大意&#xff1a; 一棵\(n(n\le3000)\)个结点的树&#xff0c;每个结点的权值为\(w_i\)。给定\(m(m\le10^5)\)&#xff0c;对于任意\(i\in[1,m]\)&#xff0c;问书中是否有一个连通子图的权值和等于\(i\)。 思路&#xff1a; 重心剖分。考虑处…

【力扣周赛#324】6266. 使用质因数之和替换后可以取到的最小值+6267. 添加边使所有节点度数都为偶数+6268. 查询树中环的长度

目录 6265. 统计相似字符串对的数目 - ac 6266. 使用质因数之和替换后可以取到的最小值 分解质因数 1、tle代码 2、优化ac代码 6267. 添加边使所有节点度数都为偶数 - 建图分类讨论 关于建图 6268. 查询树中环的长度 - LCA最近公共祖先 6265. 统计相似字符串对的数目…

LOJ6268拆分数

/*相当于每种物品都有无限个的背包毕竟考场上写exp是个比较危险的行为对数据进行根号分治是个比较好的方法对于小于等于根号的部分暴力背包转移 对于大于根号的 最多只会拿根号个 dp一下就好了*/ #include<cstdio> #include<algorithm> #include<cstring> #i…