[luogu 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

首先这是点分裸题啊。。刷过点分的dalao都知道。

但似乎这题我只会calc里面n^2暴力扫?用不来m的100?

没事,让我们证明一下复杂度。。

T(n)=2T(n/2)+n^2。

然后我并不会主定理。。画了下二叉树图。

然后发现T(n)=2n^2(n^2+(1/2)n^2+(1/4)n^2+...)。

然后,因为n=10000,把常数写小一点,有点信仰就可以了。

code:

 #include <cstdio>
 #include <cstring>
 #include <algorithm>
 #define ms(a,x) memset(a,x,sizeof a)
 using namespace std;
 ,D=;
 ],son[N<<],w[N<<];
 int ro,subn,cnt,siz[N],mxs[N],dep[N],d[N];
 int m,c[D]; bool vis[N];
 void add (int x,int y,int z) {
     nxt[++tot]=lnk[x],lnk[x]=tot;
     son[tot]=y,w[tot]=z;
 }
 void dfs_size(int x,int p) {
     siz[x]=,mxs[x]=;
     for (int j=lnk[x]; j; j=nxt[j]) {
         if (son[j]==p||vis[son[j]]) continue;
         dfs_size(son[j],x);
         siz[x]+=siz[son[j]];
         if (mxs[x]<siz[son[j]]) mxs[x]=siz[son[j]];
     }
     if (mxs[x]<subn-mxs[x]) mxs[x]=subn-mxs[x];
     if (mxs[x]<mxs[ro]) ro=x;
 }
 void dfs_depth (int x,int p) {
     dep[++cnt]=d[x];
     for (int j=lnk[x]; j; j=nxt[j]) {
         if (son[j]==p||vis[son[j]]) continue;
         d[son[j]]=d[x]+w[j];
         dfs_depth(son[j],x);
     }
 }
 void calc (int x,int v) {
     cnt=,dfs_depth(x,);
     ; i<cnt; ++i) {
         ; j<=cnt; ++j) {
             c[dep[i]+dep[j]]+=v;
         }
     }
 }
 void node_divide (int x) {
     ro=,dfs_size(x,),vis[ro]=;
     d[ro]=,calc(ro,);
     for (int j=lnk[ro]; j; j=nxt[j]) {
         if (vis[son[j]]) continue;
         calc(son[j],-);
         subn=siz[son[j]];
         node_divide(son[j]);
     }
 }
 int main() {
     int x,y,z;
     scanf("%d%d",&n,&m);
     ; i<n; ++i) {
         scanf("%d%d%d",&x,&y,&z);
         add(x,y,z),add(y,x,z);
     }
     ro=,mxs[]=n,subn=n;
     node_divide();
     ; i<=m; ++i) {
         scanf("%d",&x);
         printf(?"AYE":"NAY");
     }
     ;
 }

[luogu P3806] 【模板】点分治1的更多相关文章

  1. [洛谷P3806] [模板] 点分治1

    洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...

  2. luoguP4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...

  3. [luogu P3384] [模板]树链剖分

    [luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点 ...

  4. 洛谷 P4721 【模板】分治 FFT 解题报告

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...

  5. Luogu P2742 模板-二维凸包

    Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...

  6. LG4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 $n-1$ 的数组 $g[1],g[2],..,g[n-1]$,求 $f[0],f[1],..,f[n-1]$ ...

  7. luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)

    luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...

  8. 模板·点分治(luogu P3806)

    [模板]洛谷·点分治 1.求树的重心 树的重心:若A点的子树中最大的子树的size[] 最小时,A为该树的中心 步骤: 所需变量:siz[x] 表示 x 的子树大小(含自己),msz[x] 表示 其子 ...

  9. Luogu P3806 点分治模板1

    题意: 给定一棵有n个点的树询问树上距离为k的点对是否存在. 分析: 这个题的询问和点数都不多(但是显然暴力是不太好过的,即使有人暴力过了) 这题应该怎么用点分治呢.显然,一个模板题,我们直接用套路, ...

随机推荐

  1. GridView用法

    首先,gridview是封装好的,直接在设计界面使用,基本不需要写代码: 1.绑定数据源 GridView最好与LinQDatasourse配合使用,相匹配绑定数据: 2.外观控制 整体控制 自动选择 ...

  2. Winform 图片预览列表+分页显示

    针对图片列表展示信息,一开始没有做过相关类似的功能,大多都是以表格行显示为主,所以刚开始实现这个功能的时候是懵逼的.无从下口.在网上搜索一时半会也没找到合适的解决方案.大致就是类似于下图这样,每条数据 ...

  3. Spring Boot 指定某个依赖的版本

    Spring Boot 是个很好的框架,他为了他的一些功能生效,定义了一些依赖的版本. 比如说:Spring Boot 1.5.x 中elasticSearch是2.4.x的,这个是他本身就定义好的. ...

  4. VC++ 实现程序重启

    转载:https://blog.csdn.net/what951006/article/details/72729448 一.创建一个Win32项目 二.窗口处理函数中,Create窗口时创建一个按钮 ...

  5. SAP 查询分析器,查询报表自动生成,SQL查询测试实现说明(转)

    在日常的SAP开发和应用中,经常需要通过查询SAP数据表来处理日常业务,比如:数据对账.报表SQL测试.SAP查询功能开发等.通过开发SAP查询分析器,SAP实施和开发人员,可以在较短的时间内查询到需 ...

  6. 机器学习总结(二)bagging与随机森林

    一:Bagging与随机森林 与Boosting族算法不同的是,Bagging和随机森林的个体学习器之间不存在强的依赖关系,可同时生成并行化的方法. Bagging算法 bagging的算法过程如下: ...

  7. Oracle错误——ORA-39002:操作无效、ORA-39070:无法打开日志文件、ORA-06512:在“SYS.UTL_FILE”,line

    错误 在使用数据泵impdp导入文件时,出现错误,无法导入数据 Next 问题原因 初步猜测,应该是Oracle用户权限出现问题,是对Directory目录无操作权限所致,经过一番修改和测试,发现使用 ...

  8. Manjaro 安装svn客户端,以及checkout使用命令

    安装svn sudo pacman -S svn checkout操作指令 svn co http://xxxxxxx /home/xx update 更新版本 svn up [文件/目录] 直接使用 ...

  9. Vue-admin工作整理(四):路由组件传参

    路由组件传参:如果在一个页面中,需要根据路由去获得参数,去对页面进行一些逻辑处理,首先可以通过this.$router来获取路由实例的参数,这样页面组件和路由就进行了耦合,为了进行分离,更大程度复用, ...

  10. 关于Struts2自动装配和访问Servlet API

    自动装配 1.根据属性的getter和setter获取值  index.jsp <s:form action="hello" method="POST"& ...