【bzoj1316】【树上的询问】【点分治+map】

2024-02-20 15:08

本文主要是介绍【bzoj1316】【树上的询问】【点分治+map】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No.

Input

第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行三个数x, y, c,表示有一条树边x→y,长度为c. 接下来p行每行一个数Len,表示询问树中是否存在一条长度为Len的路径.

Output

输出有p行,Yes或No.

Sample Input

6 4
1 2 5
1 3 7
1 4 1
3 5 2
3 6 3
1
8
13
14

Sample Output

Yes
Yes
No
Yes


HINT

30%的数据,n≤100. 
100%的数据,n≤10000,p≤100,长度≤1000000. 

做完此题可看下POJ 3237 Tree

题解:

         用map记录一下某长度是否出现过,然后正常点分治即可.

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#define N 10010
#define M 110
using namespace std;
set<int>s;
int n,m,x,y,v,cnt,sum,point[N],next[N<<1],ans[M],q[M],vis[N],dis[N],root,size[N],h[N];
struct edge{int st,en,v; 
}e[N<<1];
int read(){int x(0);char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x;
}
void add(int x,int y,int v){next[++cnt]=point[x];point[x]=cnt;e[cnt].st=x;e[cnt].en=y;e[cnt].v=v;
}
void dfs(int x,int fa){size[x]=1;h[x]=0;//cout<<x<<endl;for (int i=point[x];i;i=next[i])if (e[i].en!=fa&&!vis[e[i].en]){dfs(e[i].en,x);size[x]+=size[e[i].en];h[x]=max(h[x],size[e[i].en]);}h[x]=max(sum-size[x],h[x]);if (h[x]<h[root]) root=x; 
}
void getrace(int x,int fa,int v){s.insert(v);for (int i=point[x];i;i=next[i])if (!vis[e[i].en]&&e[i].en!=fa)getrace(e[i].en,x,v+e[i].v);  
}
void check(int x,int fa,int v){for (int i=1;i<=m;i++)if (s.find(q[i]-v)!=s.end()) ans[i]=1;for (int i=point[x];i;i=next[i])if (!vis[e[i].en]&&e[i].en!=fa)check(e[i].en,x,v+e[i].v);
}
void solve(int x){//cout<<x<<endl;vis[x]=1;s.clear();for (int i=point[x];i;i=next[i])if (!vis[e[i].en]){check(e[i].en,x,e[i].v);getrace(e[i].en,x,e[i].v);}for (int i=1;i<=m;i++) if (s.find(q[i])!=s.end()) ans[i]=1;for (int i=point[x];i;i=next[i])if (!vis[e[i].en]){root=0;sum=size[e[i].en];dfs(e[i].en,0);solve(root);}
}
int main(){//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);n=read();m=read();h[0]=n;for (int i=1;i<n;i++){x=read();y=read();v=read();add(x,y,v);add(y,x,v);} for (int i=1;i<=m;i++) q[i]=read();sum=n;dfs(1,0);//cout<<root<<endl;//for (int i=1;i<=n;i++) cout<<h[i]<<endl;solve(root);for (int i=1;i<=m;i++) if (ans[i]||q[i]==0) puts("Yes");else puts("No");
} 


这篇关于【bzoj1316】【树上的询问】【点分治+map】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728616

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

Map

Map 是 Java 中用于存储键值对的集合接口。以下是对 Map 的详细介绍: 特点 键值对存储:每个元素包含一个键和一个值。 键唯一:键不能重复,但值可以重复。 无序/有序:根据具体实现,键值对的顺序可能无序(如 HashMap)或有序(如 TreeMap、LinkedHashMap)。 主要实现类 HashMap 基于哈希表,无序存储。 允许一个 null 键和多个 null 值。

Java中集合类Set、List和Map的区别

Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。那么它们有什么区别呢? Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对

C++数据结构重要知识点(5)(哈希表、unordered_map和unordered_set封装)

1.哈希思想和哈希表 (1)哈希思想和哈希表的区别 哈希(散列、hash)是一种映射思想,本质上是值和值建立映射关系,key-value就使用了这种思想。哈希表(散列表,数据结构),主要功能是值和存储位置建立映射关系,它通过key-value模型中的key来定位数组的下标,将value存进该位置。 哈希思想和哈希表数据结构这两个概念要分清,哈希是哈希表的核心思想。 (2)unordered

【C++STL(十四)】一个哈希桶简单模拟实现unordered_map/set

目录 前言 一、改造哈希桶 改造结点类 改造主体  模板参数改造  迭代器(重点) 改造完整哈希桶 unordered_map模拟实现 unordered_set模拟实现 前言 前面的文章都有说unordered_map/set的底层结构就是哈希表,严格来说是哈希桶,那么接下来我们就尝试使用同一个哈希桶来模拟实现一下。整体的逻辑和一棵红黑树封装map/set类似,所以

Java中Map取值转String Null值处理

Map<String, Object> 直接取值转String String value = (String)map.get("key") 当map.get(“key”)为Null值时会报错。 使用String类的valueOf静态方法可以解决这个问题 String value = String.valueOf(map.get("key"))

Creating OpenAI Gym Environment from Map Data

题意:从地图数据创建 OpenAI Gym 环境 问题背景: I am just starting out with reinforcement learning and trying to create a custom environment with OpenAI gym. However, I am stumped with trying to create an enviro

【Java编程的逻辑】Map和Set

HashMap Map有键和值的概念。一个键映射到一个值,Map按照键存储和访问值,键不能重复。 HashMap实现了Map接口。 基本原理 HashMap的基本实现原理:内部有一个哈希表,即数组table,每个元素table[i]指向一个单向链表,根据键存取值,用键算出hash值,取模得到数组中的索引位置index,然后操作table[index]指向的单向链表。 存取的时候依据键的