[POJ 1316] 树上的询问
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=1316
[算法]
点分治
由于边权较大,笔者在计算时使用了STL-set
注意当询问为0时,要输出"Yes"
[代码]
- #include<bits/stdc++.h>
- using namespace std;
- #define MAXN 10010
- #define MAXQ 110
- struct Edge
- {
- int to,w,nxt;
- } e[MAXN<<];
- int i,n,q,tot,root,u,v,w,len;
- int size[MAXN],head[MAXN],weight[MAXN],sum[MAXN],val[MAXN],a[MAXQ];
- bool visited[MAXN],ans[MAXQ];
- inline void addedge(int u,int v,int w)
- {
- tot++;
- e[tot] = (Edge){v,w,head[u]};
- head[u] = tot;
- }
- inline void getroot(int u,int fa,int total)
- {
- int i,v;
- size[u] = ;
- weight[u] = ;
- for (i = head[u]; i; i = e[i].nxt)
- {
- v = e[i].to;
- if (fa != v && !visited[v])
- {
- getroot(v,u,total);
- size[u] += size[v];
- weight[u] = max(weight[u],size[v]);
- }
- }
- weight[u] = max(weight[u],total - size[u]);
- if (weight[u] < weight[root]) root = u;
- }
- inline void dfs(int u,int fa)
- {
- int i,v,w;
- val[++len] = sum[u];
- for (i = head[u]; i; i = e[i].nxt)
- {
- v = e[i].to;
- w = e[i].w;
- if (v != fa && !visited[v])
- {
- sum[v] = sum[u] + w;
- dfs(v,u);
- }
- }
- }
- inline void calc(int u)
- {
- int i,j,k,v,w;
- set< int > s;
- s.clear();
- s.insert();
- for (i = head[u]; i; i = e[i].nxt)
- {
- v = e[i].to;
- w = e[i].w;
- if (!visited[v])
- {
- sum[v] = w;
- len = ;
- dfs(v,u);
- for (j = ; j <= len; j++)
- {
- for (k = ; k <= q; k++)
- {
- if (s.find(a[k] - val[j]) != s.end())
- ans[k] = true;
- }
- }
- for (j = ; j <= len; j++) s.insert(val[j]);
- }
- }
- }
- inline void work(int u)
- {
- int i,v;
- visited[u] = true;
- calc(u);
- for (i = head[u]; i; i = e[i].nxt)
- {
- v = e[i].to;
- if (!visited[v])
- {
- root = ;
- getroot(v,,size[v]);
- work(root);
- }
- }
- }
- int main()
- {
- scanf("%d%d",&n,&q);
- for (i = ; i < n; i++)
- {
- scanf("%d%d%d",&u,&v,&w);
- addedge(u,v,w);
- addedge(v,u,w);
- }
- for (i = ; i <= q; i++) scanf("%d",&a[i]);
- root = ;
- size[] = weight[] = n;
- getroot(,,n);
- work(root);
- for (i = ; i <= q; i++) printf((ans[i] || a[i] == ) ? "Yes\n" : "No\n");
- return ;
- }
[POJ 1316] 树上的询问的更多相关文章
- BZOJ 1316: 树上的询问( 点分治 + 平衡树 )
直接点分治, 用平衡树(set就行了...)维护. -------------------------------------------------------------------------- ...
- BZOJ 1316: 树上的询问 (点分治+set)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1316 因为只要求存在某条路径长度为K,所以点分,然后用set判断差值是否在set中就可以了. ...
- BZOJ 1316: 树上的询问
挺裸的点分治 刚开始想用map水过去,然后做p次点分治,然后T到自闭 最后发现可以sort一遍,然后去重,记录每个数出现的次数,这样就可以双指针,不会漏掉了 #include <bits/std ...
- [BZOJ1316]树上的询问 点分治
1316: 树上的询问 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1017 Solved: 287[Submit][Status][Discus ...
- BZOJ_1316_树上的询问_点分治
BZOJ_1316_树上的询问_点分治 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整 ...
- 【BZOJ1316】树上的询问 点分治+set
[BZOJ1316]树上的询问 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整数n, ...
- [bzoj1316]树上的询问_点分治
树上的询问 bzoj-1316 题目大意:一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 注释:$1\le n\le 10^4$,$1\ ...
- POJ 1741 单次询问树上距离<=K的点对数 点分治
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ; ], ...
- OpenJudge/Poj 1316 Self Numbers
1.链接地址: http://poj.org/problem?id=1316 http://bailian.openjudge.cn/practice/1316 2.题目: 总时间限制: 1000ms ...
随机推荐
- 登录linux,输入ls显示anaconda-ks.cfg cobbler.ks ....., 原因在于root@ ~ / 区别
今天登录linux测试机,想要创建目录,ls的时候,找不到之前的的目录,才发现是目录不对的问题. 首先,先要弄清楚 [root@330c353813ea ~] 和 [root@330c353813ea ...
- android随手记
Linearlayout: gravity:本元素中所有子元素的重力方向 layout_gravity:本元素对于父元素的重力方向 自定义权限:http://www.cnblogs.com/i ...
- 安装pywin32
1.下载pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/ 2.安装: 安装过程中报错:Python version 2.7 ...
- Functor、Applicative 和 Monad(重要)
Functor.Applicative 和 Monad Posted by 雷纯锋Nov 8th, 2015 10:53 am Functor.Applicative 和 Monad 是函数式编程语言 ...
- Language Integrated Query
Language Integrated Query (LINQ, pronounced "link") is a Microsoft .NET Framework componen ...
- C# 获得指定路径扩展名 , 去除扩展名
//指定扩展名的文件 private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; st ...
- Fear No More歌词
"Fear No More" Every anxious thought that steals my breath It's a heavy weight upon my ...
- 三维地图中的A*寻路
跟二维地图原理一样,只不过搜索方向多了,二维只搜8个方向,而三维要搜26个方向. 不懂的看我以前写的文章,这里直接贴代码: #include <iostream> #include < ...
- Python笔记11------一个K-means聚类的小例子
#导入scipy库,库中已经有实现的kmeans模块,直接使用, #根据六个人的分数分为学霸或者学渣两类 import numpy as np from scipy.cluster.vq import ...
- nyoj329-循环小数
329-循环小数 内存限制:64MB时间限制:3000msSpecial Judge: No accepted:1submit:1 题目描述: 我们可爱的 c小加 近段儿正在潜心研究数学,当他学习到循 ...