题目链接


题目大意:

就是给你一颗树,树上每个点都有自己的权值,问你这棵树是否存在一棵子树,子树的权值和是[1,m][1,m][1,m]里面的,对于[1,m][1,m][1,m]里面的数,如果出现过就输出1,否则就输出0.


解题思路:

1.我选择的思路是点分治。
如何分治呢?因为是联通的子树嘛,那么我对每个分治的节点,我统计出经过这个节点所有子树的答案。
2.如何统计呢?看到答案的01串,我们可以想到bitset去维护结果,因为nnn很小,对于每个nnn我们可以开一个bitset,去维护每个链的sumsumsum,对于出现过的和,我们直接在运用位运算的或,去把相应的位置置111;
3.对于某个点肯定是先是继承自己父亲的bit[fa]bit[fa]bit[fa],然后把这些值加上自己,就进行逻辑左移val_node[u]val\_node[u]val_node[u]位

对于自己孩子节点肯定也要记录下来下面出现了什么值,那么就直接或孩子节点的bit[son]bit[son]bit[son]就可以了,这样答案就已经不重不漏了!


#include <bits/stdc++.h>using namespace std;
const int maxn = 3e3 + 10;
bitset<100010>bit[maxn], ans;
int max_son[maxn], root, siz[maxn];
bool vis[maxn];
vector<int> G[maxn];
int node[maxn];
int n, m, now_node;
//..............................void out(bitset<100010> a, int u) {cout << "u:" << u << " " << node[u] <<endl;for(int i = 1; i <= m; ++ i)cout << a.test(i);cout << endl;
}void getroot(int u, int fa) {bit[u].reset();siz[u] = 1;max_son[u] = 1;for(auto it : G[u]) {if(it == fa || vis[it]) continue;getroot(it,u);max_son[u] = max(max_son[u],siz[it]);siz[u] = siz[u] + siz[it];}max_son[u] = max(max_son[u],now_node-siz[u]);if(max_son[u] < max_son[root]) root = u;
}void getans(int u, int fa) {bit[u] <<= node[u];//继承了父亲节点的结果后就进行移位ans |= bit[u];//out(bit[u],u);for(auto it : G[u]) {if(it == fa || vis[it]) continue;bit[it] = bit[u];//继承父亲的结果getans(it,u);bit[u] |= bit[it];//承接儿子的结果}//out(bit[u],u);
}void div(int u) {vis[u] = true;bit[u].set(0);//对于分治节点,先把0的位置设置成1,下面就可以直接进行位移getans(u, 0);for(auto i : G[u]) {if(vis[i]) continue;now_node = siz[i];root = 0;getroot(i,u);div(root);}
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);//.........................int T;cin >> T;while(T --) { ans.reset();max_son[0] = 1e9;cin >> n >> m;for(int i = 1; i <= n; ++ i) {vis[i] = 0;G[i].clear();}for(int i = 1; i < n; ++ i) { int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}for(int i = 1; i <= n; ++ i) cin >> node[i];root = 0;now_node = n;getroot(1,0);div(root);for(int i = 1; i <= m; ++ i)cout << ans.test(i);cout << "\n";}    return 0;
}
/*
1
4 10
1 2
2 3
3 4
3 2 7 5
6 10
1 2
1 3
2 5
3 4
3 6
1 3 5 7 9 11
*/

点分治问题 ----------- 2017杭州CCPC E.Master of Subgraph[bitset+点分治]相关推荐

  1. 2017杭州·云栖大会全纪实

    10月11日,2017杭州·云栖大会在云栖小镇会展中心如期展开,8年进化,云栖大会成长为全球最具影响力的科技展会之一. [云栖大会全纪实] 多图预警,别眨眼 先来一张马老师镇楼 马总艺术细胞的小马达 ...

  2. 2017杭州_考驾照笔记

    2017杭州_考驾照笔记 手动挡技术操作中的坑: 1) 起步 慢抬离合,感受半联动,慢松刹车,走动后,速度达到5码,运行平稳,可以直接松开离合,不会熄火. 2)加减档 减档: 一定要轻带刹车,速度降到 ...

  3. 开发者论坛一周精粹(第二十期) :晒往期云栖大会的照片或感想,赢2017杭州云栖大会门票...

    第二十期(2017年8月21日-2017年8月27日 ) 2017杭州云栖大会即将震撼来袭,如果你参与过往期的云栖大会,不妨晒出你的参会照片和感想,我们将挑选10个优秀的分享送出2017杭州云栖大会的 ...

  4. 10月12日云栖精选夜读:【直击2017杭州·云栖大会】TECH INSIGHT企业迁云实战专场...

    10月10日,Tech Insight·杭州峰会,在2017杭州云栖大会举办前夕拉开帷幕.作为"一扇云计算与技术人员的任意门",本次Tech Insight更是针对"迁云 ...

  5. 2017杭州云栖大会FAQ(持续更新中)

    2017杭州云栖大会将于10月11-14日在杭州云栖小镇举办,作为全球最具影响力的科技展会之一,今年的云栖大会规模更大,内容也更丰富.为了帮助大家解决报名.参会中的一些问题,小编专门整理了下大会相关的 ...

  6. 10月24日云栖精选夜读:2017杭州·云栖大会完美收官 虚拟化平台精彩回顾

    阿里云飞天八部虚拟化平台普及了 虚拟化技术从1998年到现在的发展史.异构计算助力新一代人工智能加速发展,虚拟化技术专场"黑科技"解读. 会上,神龙云服务器深度解析带来新一代技术革 ...

  7. 叮咚!您有一份2017杭州云栖大会参会指南待签收【持续更新中】

    点击查看全文 10月11-14日,为期四天的2017杭州云栖大会将再度在杭州云栖小镇举办,作为全球最具影响力的科技展会之一,本届大会不仅有阿里集团专家以及各企业行业领袖的精彩演讲,众多让人耳目一新的黑 ...

  8. 2017杭州云栖大会展商一览表

    2017杭州云栖大会展览吸引了来自16个国家与地区超过400家企业参展,总面积超过30000平方米,精心打造涵盖人工智能.大数据.自动驾驶.智慧家居.智能制造.城市大脑.医疗与生命科学.FinTech ...

  9. 这场不一样的2017杭州云栖大会!我们在等你!

    连续4天, 140+技术专场, 1000+主题分享, 还有云栖夜跑&音乐节, 史无前例的 2017杭州云栖大会, 10月11日-14日精彩不断! 原文链接:https://mp.weixin. ...

最新文章

  1. hdu 6579 Operation (在线线性基)
  2. [转]基于 aspnet 的自动合并输出js和css的解决方案
  3. 亿些模板【数论数学】
  4. 用指针完成函数参数的调用
  5. matlab怎么编写数据处理程序,【悬赏--已结束】求编写一个基于Matlab的数据处理程序...
  6. 《Linux系统编程(第2版)》——2.6 关闭文件
  7. 洛谷——P1144 最短路计数
  8. kdiff3的主窗口说明 Base Local Remote 分别代表什么分支
  9. Mac操作指南:访问Windows共享文件
  10. Cutting Bamboos
  11. 与贸易有关的知识产权协议 (转)
  12. 计算机拼歌曲,抖音你这辈子有没有为别人拼过命是什么歌
  13. 22年最后一次PMP考试时间定了-11月27日,进来了解相关内容信息
  14. 报告显示:2023年,电信区块链业产值将达10亿美元
  15. Ubuntu系统镜像下载(清华大学开源软件镜像站)(ubuntu-20.04-desktop-amd64.iso
  16. 信号频谱、幅度、功率谱和能量谱
  17. springmvc + mybatis + ehcache + redis 分布式 架构
  18. html 栏目切换幻灯片效果,很酷的切换效果 纯CSS3幻灯片实现
  19. AE学习笔记(2):关键帧动画与技法
  20. SQL 数据定义赋值、输出

热门文章

  1. 网络工程师_记录的一些真题_2016上半年上午
  2. ACMNO.38 C语言-报数 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
  3. 约瑟夫死亡游戏算法问题
  4. 收藏 | 多目标跟踪(MOT)入门
  5. 轻松学Pytorch–环境搭建与基本语法
  6. 用css打印html
  7. 项目CPU异常高分析
  8. fusionchart图表遮挡Ext下拉控件或日期控件解决办法(IE下有问题firefox与chrome正常)...
  9. mac开启sshserver
  10. linux c语言工具,Linux下C语言编程环境的工具.doc