题目链接:点这里

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

数据范围:\(n\le1e5\,,p\le100\,,长度\le1e5\)

Solution:

点分治裸题,没什么好讲的。不过注意当询问0时,答案应该是Yes。

Code:

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define ll long long
#define inf 2147483647
using namespace std;
const int N=1e4+1;
int rt,rtu,cnt,szt,head[N],sz[N],mx[N],rtt[N];
int n,m,k,ans,l,r,tot,dis[N],vis[N];
struct Edge{int nxt,to,val;}edge[N<<1];
void ins(int x,int y,int z){edge[++cnt].nxt=head[x];edge[cnt].to=y;edge[cnt].val=z;head[x]=cnt;
}
void getrt(int x,int f){sz[x]=1,mx[x]=0;for(int i=head[x];i;i=edge[i].nxt){int y=edge[i].to;if(y==f||vis[y]) continue;getrt(y,x);sz[x]+=sz[y];mx[x]=max(mx[x],sz[y]);}mx[x]=max(mx[x],szt-sz[x]);if(mx[x]<mx[rt]) rt=x;
}
void getdis(int x,int f,int d){dis[++tot]=d;for(int i=head[x];i;i=edge[i].nxt){int y=edge[i].to;if(y==f||vis[y]) continue;getdis(y,x,d+edge[i].val);}
}
int find(int x,int l,int r){while(l<r){int mid=(l+r)>>1;if(dis[mid]+x<k) l=mid+1;else r=mid;}return l;
}
int calc(int x,int d){tot=0;getdis(x,0,d);sort(dis+1,dis+tot+1);int num=0,l=1,r=tot;while(l<r){if(dis[l]+dis[r]>k) --r;else if(dis[l]+dis[r]<k) ++l;else{if(dis[l]==dis[r]){num+=(r-l+1)*(r-l)/2;break;}int u1=l,u2=r;while(dis[u1]==dis[l]) ++u1;while(dis[u2]==dis[r]) --u2;num+=(u1-l)*(r-u2);l=u1,r=u2;}}return num;
}
void divide(int x){ans+=calc(x,0);vis[x]=1;for(int i=head[x];i;i=edge[i].nxt){int y=edge[i].to;if(!vis[y]){ans-=calc(y,edge[i].val);divide(rtt[++rtu]);}}
}
void getrtt(int x){vis[x]=1;for(int i=head[x];i;i=edge[i].nxt){int y=edge[i].to;if(!vis[y]){rt=0,szt=sz[y],getrt(y,0);rtt[++rtu]=rt;getrtt(rt);}}
}
int solve(){memset(vis,0,sizeof(vis));ans=0;divide(rtt[rtu=0]);return ans;
}
int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
int main(){n=read(),m=read();for(int i=1;i<n;i++){int x=read(),y=read(),z=read();ins(x,y,z);ins(y,x,z);}szt=n;mx[rt]=inf;ans=0;getrt(1,0);rtt[0]=rt;getrtt(rt);for(int i=1;i<=m;i++){k=read();if(!k){puts("Yes");continue;}solve();if(ans) puts("Yes");else puts("No");}return 0;
}

转载于:https://www.cnblogs.com/NLDQY/p/10827215.html

BZOJ1460: Pku2114 Boatherds相关推荐

  1. BZOJ 1460 Pku2114 Boatherds

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1460 思路 点分治. (题面居然不说询问的最大值为106106) Naive的O(qnl ...

  2. poj2114 Boatherds(好久没翻译的说)

    译文: 时间限制: 2000MS   空间限制: 65536K 问题描述 Boatherds inc是一家在Trabantustan的帆船公司,在Trabantian rivers提供河上旅行.所有的 ...

  3. POJ 2114 - Boatherds

    原题地址:http://poj.org/problem?id=2114 题目大意: 给定一棵点数为\(n~(n \le 10000)\)的无根树,路径上有权值,给出m组询问($m \le 100$), ...

  4. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  5. 【poj2114】点分治(离线)

    boatherds 2s 64M by czy 求一颗树上距离为K的点对是否存在 输入数据 n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行每行询问一个K 输出数据 对于每 ...

  6. POJ2114-Boatherds-树分治

    题目描述 Boatherds Inc. is a sailing company operating in the country of Trabantustan and offering boat ...

  7. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  8. mysql 伪表查询语句_Oracle-05:伪表dual

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 此乃这张表里的全部字段信息,此表无法做修改操作 为什么有伪表这个概念?????????? 因为sql92的一个 ...

  9. Linux语法格式是什么,linux命令语法格式

    一.命令的一般格式 command [option]... [argument]... command [options] [arguments] 具体说明: 1.command: 表示命令的名称,如 ...

最新文章

  1. javascript a 标签打开相对路径,绝对路径
  2. pip 20.3 新版本发布!即将抛弃 Python 2.x
  3. 2021-02-07 接口测试工具-Postman使用详解
  4. 端计算(3)-kotlin(1)
  5. vue 开发2017年变化回顾及2018年展望
  6. python自动爬取更新电影网站_python爬取电影网站信息
  7. 3.eclipse对mysql云数据库编程增删改查
  8. ios assetlibrary
  9. oracle一体机诊断内存,Oracle内存诊断
  10. 2017《面向对象程序设计》课程作业五
  11. 抓包工具之MitmProxy
  12. 软考--软件设计师--下午题数据库设计
  13. 用计算机输出日历,怎样从电脑上打印2021年的日历
  14. matlab 太阳系仿真,三维仿真太阳系
  15. unity mono编译
  16. 贪心 + 优先队列:程序员PIPI
  17. 常见的Web服务器、应用服务器(Apache、tomcat、jetty、Nginx)简介及优缺点总结
  18. 终生学习者,永远劳苦命!
  19. 三门问题的扩展用c++模拟
  20. 企业智能化管理固定资产的新思路

热门文章

  1. SoapUi测试,测试相关问答知识
  2. ORACLE 体系结构知识总结
  3. Tutorial——使用Maven开发Cloud Driver
  4. 程序设计分析(开篇)——混沌初开,顿悟设计
  5. else 策略模式去掉if_设计模式(三)——简单的状态模式代替if-else
  6. deno使用rust_如何在Deno和Oak中使用MySQL
  7. 测试驱动开发 测试前移_测试驱动开发简介
  8. c# 数据可视化_#OpenVisConf上的22位数据可视化从业者的10点收获
  9. 【廖雪峰Python学习笔记】面向对象编程OOP
  10. 蜜蜂实训平台c语言考试答案,北理c语言上机答案(全)