洛谷P3806 【模板】点分治1
时间:2022-05-08
本文章向大家介绍洛谷P3806 【模板】点分治1,主要内容包括题目背景、题目描述、输入输出格式、输入输出样例、说明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目背景
感谢hzwer的点分治互测。
题目描述
给定一棵有n个点的树
询问树上距离为k的点对是否存在。
输入输出格式
输入格式:
n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径
接下来m行每行询问一个K
输出格式:
对于每个K每行输出一个答案,存在输出“AYE”,否则输出”NAY”(不包含引号)
输入输出样例
输入样例#1:
2 1
1 2 2
2
输出样例#1:
AYE
说明
对于30%的数据n<=100
对于60%的数据n<=1000,m<=50
对于100%的数据n<=10000,m<=100,c<=1000,K<=10000000
自己YY出来的一种做法
慢的跟暴力一样
我们考虑点分治的过程,
用点分治可以快速计算出一个点到其他点的距离
在这些距离中,不同子树的可以相加,同一子树的不能相加,需要特判
对于查询操作,直接用数组记录权值为$k$的点是否出现过
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=1e6+10;
const int INF=1e7+10;
inline char nc()
{
static char buf[MAXN],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
char c=nc();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();}
return x*f;
}
struct node
{
int u,v,w,nxt;
}edge[MAXN];
int head[MAXN];
int num=1;
inline void AddEdge(int x,int y,int z)
{
edge[num].u=x;
edge[num].v=y;
edge[num].w=z;
edge[num].nxt=head[x];
head[x]=num++;
}
int F[MAXN],sum,siz[MAXN],vis[MAXN],root=0,cnt=0,deep[MAXN],can[MAXN];
struct Ans
{
int v,id;
}tot[MAXN];
void GetRoot(int now,int fa)
{
siz[now]=1;
for(int i=head[now];i!=-1;i=edge[i].nxt)
{
if(vis[edge[i].v]||edge[i].v==fa) continue;
GetRoot(edge[i].v,now);
siz[now]+=siz[edge[i].v];
F[now]=max(F[now],siz[edge[i].v]);
}
F[now]=max(F[now],sum-F[now]);
if(F[now]<F[root]) root=now;
}
void GetDeep(int now,int fa,int NowDeep,int num)
{
int cur=0;
tot[++cnt].v=deep[now];
tot[cnt].id=num;
for(int i=head[now];i!=-1;i=edge[i].nxt)
{
if(vis[edge[i].v]||edge[i].v==fa) continue;
deep[edge[i].v]=deep[now]+edge[i].w;
if(NowDeep!=1) GetDeep(edge[i].v,now,NowDeep+1,num);
else GetDeep(edge[i].v,now,NowDeep+1,cur++);
}
}
void Work(int now)
{
cnt=0;deep[now]=0;
GetDeep(now,0,1,1);
for(int i=1;i<=cnt;i++)
for(int j=i+1;j<=cnt;j++)
if(tot[i].id!=tot[j].id)
can[tot[i].v+tot[j].v]=1;
else can[tot[i].v]=1,can[tot[j].v]=1;
}
void Solve(int now)
{
Work(now);
vis[now]=1;
for(int i=head[now];i!=-1;i=edge[i].nxt)
{
if(vis[edge[i].v]) continue;
root=0;
sum=siz[edge[i].v];
GetRoot(edge[i].v,0);
Solve(edge[i].v);
}
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
memset(head,-1,sizeof(head));
int N=read(),M=read();
for(int i=1;i<=N-1;i++)
{
int x=read(),y=read(),z=read();
AddEdge(x,y,z);
AddEdge(y,x,z);
}
root=0;
F[0]=INF;
sum=N;
GetRoot(1,0);
Solve(root);
for(int i=1;i<=M;i++)
{
int p=read();
if(can[p]) printf("AYEn");
else printf("NAYn");
}
return 0;
}
- 基于加密货币和区块链,AR游戏也有新玩法
- 一次数据库的整理的sql语句
- 谷歌想让人工智能具有人的意识?
- 数据库范式
- [原创]CI持续集成系统环境---部署Jenkins完整记录
- setInterval与clearInterval使用示例
- jenkins配置记录(1)--添加用户权限
- jenkins忘记管理员登陆密码的补救措施
- openstack虚拟机迁移的操作记录
- 从MapX到MapXtreme2004[11]-坐标概论
- 动态控件的新思路
- 独家分享 腾讯大神教你如何学习一门新的编程语言-以Python 为例
- 连续打印问题的解决
- 分布式监控系统Zabbix--完整安装记录-批量添加主机和自动发现端口
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用laravel的migrate创建数据表的方法
- 解决laravel session失效的问题
- php7下的filesize函数
- PHP-FPM 设置多pool及配置文件重写操作示例
- laravel实现登录时监听事件,添加登录用户的记录方法
- php更新cookie内容的详细方法
- php实现映射操作实例详解
- Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
- yii框架数据库关联查询操作示例
- laravel-admin的多级联动方法
- Laravel数据库读写分离配置的方法
- php给数组赋值的实例方法
- php实现分页功能的详细实例方法
- 浅谈Laravel中的三种中间件的作用
- laravel 使用auth编写登录的方法