CCPC 2016 杭州 E. Master of Subgraph(点分治+bitset优化DP)
题目链接:http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf
题意:给定一棵有 n 个结点的树和一个数 m,对于 i ∈ [1,m] 问是否存在一个子图结点的权值和为 i 。
题解:一个显然的思路是树上做背包,但显然会 T。要遍历全部子图,考虑进行点分治,然后合并的时候用 bitset 优化背包,时间复杂度O(nmlogn / 64),且时限给了 8s。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int maxn = 3e3 + ;
const int maxm = 1e5 + ;
const ll mod = ; int n,m;
vector<int>vec[maxn];
bool used[maxn];
int a[maxn],root,sz[maxn],son[maxn],all; void getroot(int u,int fa) {
sz[u] = , son[u] = ;
for(int i = ; i < vec[u].size(); i++) {
int v = vec[u][i];
if(used[v] || v == fa) continue;
getroot(v,u);
sz[u] += sz[v];
son[u] = max(son[u],sz[v]);
}
son[u] = max(son[u],all - son[u]);
if(son[u] < son[root]) root = u;
} bitset<maxm>bit[maxn],ans; void calc(int u,int fa) {
sz[u] = , bit[u] <<= a[u];
for(int i = ; i < vec[u].size(); i++) {
int v = vec[u][i];
if(used[v] || v == fa) continue;
bit[v] = bit[u];
calc(v,u);
sz[u] += sz[v];
bit[u] |= bit[v];
}
} void solve(int u) {
used[u] = true;
bit[u].reset(), bit[u].set();
calc(u,);
ans |= bit[u];
for(int i = ; i < vec[u].size(); i++) {
int v = vec[u][i];
if(used[v]) continue;
root = ;
all = sz[v];
getroot(v,);
solve(root);
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
scanf("%d",&t);
while(t--) {
ans.reset();
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++) vec[i].clear(),used[i] = false;
for(int i = ; i < n; i++) {
int u,v;
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
for(int i = ; i <= n; i++) scanf("%d",&a[i]);
root = ;
son[] = 1e9;
all = n;
getroot(,);
solve(root);
for(int i = ; i <= m; i++) printf("%d",(int)ans[i]);
printf("\n");
}
return ;
}
CCPC 2016 杭州 E. Master of Subgraph(点分治+bitset优化DP)的更多相关文章
- HDU - 6268: Master of Subgraph (分治+bitset优化背包)
题意:T组样例,给次给出一个N节点的点权树,以及M,问连通块的点权和sum的情况,输出sum=1到M,用0或者1表示. 思路:背包,N^2,由于是无向的连通块,所以可以用分治优化到NlgN. 然后背包 ...
- 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, no ...
- [HDU6268]Master of Subgraph
[HDU6268]Master of Subgraph 题目大意: 一棵\(n(n\le3000)\)个结点的树,每个结点的权值为\(w_i\).给定\(m(m\le10^5)\),对于任意\(i\i ...
- 算法学习分析-点分治 HDU 6269 Master of Subgraph
首先给出定义 点分治是一种处理树上路径的工具 挂出一道题目来:Master of Subgraph 这道题目让你求所有联通子图加和所能产生数字,问你1到m之间,那些数字可以被产生 这道题目,假如我们利 ...
- Master of Subgraph
Problem E. Master of SubgraphYou are given a tree with n nodes. The weight of the i-th node is wi. G ...
- HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)
题目链接 2017 CCPC Harbin Problem K 题意 给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...
- HDU 6268 Master of Subgraph (2017 CCPC 杭州 E题,树分治 + 树上背包)
题目链接 2017 CCPC Hangzhou Problem E 题意 给定一棵树,每个点有一个权值,现在我们可以选一些连通的点,并且把这点选出来的点的权值相加,得到一个和. 求$[1, m] ...
- HDU5934 Bomb(2016杭州CCPC第二题)(强连通缩点)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- ccpc 2016 省赛
1.configuration if ide. 2.file import and export. 3.check your program more than once. ============= ...
随机推荐
- 脉脉的一道网红Java面试题
题目如下: public class Test { public static void main(String[] args) { int a = 10; int b = 10; // 需要在met ...
- HNUSTOJ-1617 Graph(费马数)
1617: Graph 时间限制: 1 Sec 内存限制: 32 MB提交: 31 解决: 5[提交][状态][讨论版] 题目描述 Your task is to judge whether a ...
- pandas数据结构之基础运算笔记
import pandas as pd import numpy as np s = pd.Series([1,3,5,6,8],index=list('acefh')) s.index # 读取行索 ...
- [Tensorflow]激励函数tf.nn.relu样例
代码: import tensorflow as tf import numpy as np ### 定义添加神经网络层函数 START ### def add_layer(inputs,in_siz ...
- (二)发布第一个WebService服务与DSWL文档解析
1. 编写接口 package service; import javax.jws.WebService; /** * 第一个webservice服务, * @WebService注解表示这是一个we ...
- 3、java基础:抽象类与接口的区别
抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...
- oracle学习笔记:字符串替换 replace、regexp_replace、translate函数
1.replace 函数 语法:replace(char, search_string, replacement_string) --针对字符串替换 功能: 将char中的字符串替换. 当re ...
- 关于NSOperationQueue,一个容易让初学者误解的问题
凡是学习NSOperationQueue的人,都会遇到setMaxConcurrentOperationCount这个函数.在网上的许多博文中,都将setMaxConcurrentOperationC ...
- 阿里高级架构师教你如何使用Spring Cloud Ribbon重试请求
在微服务调用中,一些微服务圈可能调用失败,通过再次调用以达到系统稳定性效果,本文展示如何使用Ribbon和Spring Retry进行请求再次重试调用. 在Spring Cloud中,使用load b ...
- HTML5 canvas 在线涂鸦
插件地址 http://bencentra.github.io/jq-signature/ 采用技术 jq-signature.min.js Developed using jQuery 2.1.4. ...