AcWing 252. 树 (点分治)打卡
题目:https://www.acwing.com/problem/content/254/
题意:求一棵树上,路径<=k的有多少条
思路:点分治,我们用两个指针算solve函数,首先对算出来的路径每个排个序,我们就保证有单调性,然后l从前往后,r从后往前,如果l+r<=m 那么(l,r-1) (l,r-2)...都是可以的,直接加上总数即可,如果不满足 r--,满足l++,这个自己写个例子就能明白的
- #include<bits/stdc++.h>
- #define maxn 100005
- #define mod 1000000007
- using namespace std;
- typedef long long ll;
- ll da;
- vector<pair<ll,ll> > mp[maxn];//存下图
- bool vis[maxn];//标记曾经使用过的重心
- ll maxsize[maxn],dis[maxn],d[maxn];//maxsize 当前节点的最大子树
- ll siz[maxn],e[maxn];// dis 到重心的距离 d 出现过的距离
- ll n,m,rt,sum,qe; // siz 当前节点的子树个数 e 出现的距离 rt代表当前重心
- void find(ll x,ll f){//找出重心
- siz[x]=;
- maxsize[x]=;
- for(int i=;i<mp[x].size();i++){
- pair<ll,ll> q=mp[x][i];
- if(q.first==f||vis[q.first]) continue;//vis数组标记曾经使用过的重心
- find(q.first,x);
- siz[x]+=siz[q.first];
- maxsize[x]=max(maxsize[x],siz[q.first]);
- }
- maxsize[x]=max(maxsize[x],sum-siz[x]);//节点总数减去当前的子树数=以当前节点为根的父亲点子树数
- if(maxsize[x]<maxsize[rt]){
- rt=x;
- }
- }
- void get_dis(ll x,ll f,ll len){
- if(len<=1e7){
- e[++qe]=len;
- }
- for(int i=;i<mp[x].size();i++){
- pair<ll,ll> q=mp[x][i];
- if(q.first==f||vis[q.first]) continue;
- dis[q.first]=dis[x]+len;
- get_dis(q.first,x,len+q.second);
- }
- }
- ll solve(ll x,ll len){
- ll ee=;
- qe=;
- dis[x]=len;
- get_dis(x,,len);
- sort(e+,e+qe+);
- ll l=,r=qe;
- while(l<r){
- if(e[l]+e[r]<=m){
- ee+=r-l;
- l++;
- }
- else{
- r--;
- }
- }
- return ee;
- }
- void divide(ll x){
- da+=solve(x,);
- vis[x]=;
- for(int i=;i<mp[x].size();i++){
- pair<ll,ll> q=mp[x][i];
- if(vis[q.first]) continue;
- da-=solve(q.first,q.second);
- sum=siz[q.first];
- rt=;
- maxsize[rt]=mod;
- find(q.first,x);
- divide(rt);
- }
- }
- void init(){
- da=;
- for(int i=;i<=n;i++) mp[i].clear();
- memset(maxsize,,sizeof(maxsize));
- memset(vis,,sizeof(vis));
- }
- int main(){
- while(cin>>n>>m)
- {
- if(n==&&m==) break;
- ll a,b,c;
- init();
- for(int i=;i<n-;i++){
- cin>>a>>b>>c;
- a++;
- b++;
- mp[a].push_back(make_pair(b,c));
- mp[b].push_back(make_pair(a,c));
- }
- sum=n;//当前节点数
- rt=;
- maxsize[]=mod;//置初值
- find(,);
- divide(rt);
- printf("%lld\n",da);
- }
- }
AcWing 252. 树 (点分治)打卡的更多相关文章
- hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)
题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...
- 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治
正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- POJ 1741 Tree 树的分治
原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...
- hdu 4871 树的分治+最短路记录路径
/* 题意:给你一些节点和一些边,求最短路径树上是k个节点的最长的路径数. 解:1.求出最短路径树--spfa加记录 2.树上进行操作--树的分治,分别处理子树进行补集等运算 */ #include& ...
- hdu 4670 树的分治-求点对的个数
/* 树的分治 因为树的点权值可达到10^15,注意手动扩栈,还有int64 题意:给你一棵树,给你一些素数,给你每个点一个权值且每个权值均可由这些素数组成.现在定义任意任意两点的价值为他们路径上的权 ...
- AcWing 157. 树形地铁系统 (hash判断树同构)打卡
一些主要城市拥有树形的地铁系统,即在任何一对车站之间,有且只有一种方式可以乘坐地铁. 此外,这些城市大多数都有一个中央车站. 想象一下,你是一名在拥有树形地铁系统的城市游玩的游客,你想探索该城市完整的 ...
- 【BZOJ-4435】Juice Junctions 最小割树(分治+最小割)+Hash
4435: [Cerc2015]Juice Junctions Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 20 Solved: 11[Submi ...
- BZOJ 4025: 二分图 [线段树CDQ分治 并查集]
4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...
随机推荐
- jmeter之集合点的使用
通过jmeter并不能1秒立即达到某一并发,这时候,可以通过集合点来实现,达到某一并发时,然后再一起执行某一动作,仅作用于第一次动作的时候 目录 1.集合点元件 2.简单的概念介绍 1.集合点元件 集 ...
- Schema 与数据类型优化
这是<高性能 MySQL(第三版)>第四章<Schema 与数据类型优化>的读书笔记. 1. 选择优化的数据类型 数据类型的选择原则: 越小越好:选择满足需求的最小类型.注意, ...
- php Function ereg() is deprecated的解决方法
PHP 5.3 ereg() 无法正常使用,提示“Function ereg() is deprecated Error”.问题根源是php中有两种正则表示方法,一个是posix,一个是perl,ph ...
- [LeetCode] 461. Hamming Distance(位操作)
传送门 Description The Hamming distance between two integers is the number of positions at which the co ...
- 线程池之ThreadPoolExecutor源码解析
1.变量 ThreadPoolExecutor先定义了这几个常量,初看时一脸懵逼,其实它就是用int的二进制高三位来表示线程池的状态, 先回顾一下位运算: <<’左移:右边空出的位置补0, ...
- nodejs基础-HTTP
案例通过nodejs编写http服务程序 步骤:1,加载http模块2.创建http服务3.为http服务对象添加request事件处理程序4·开启http服务监听,准备接收客户端请求注意:1,浏览器 ...
- eclipse 从git取项目,导入为maven项目,新加的方法,报加载主类错误
eclipse 从git取项目,导入为maven项目,新加的方法,报加载主类错误 具体描述: 整体编译能够编译成功,但新加一个java,里面创建一个main方法,运行时,报无法加载主类的错误, 整体编 ...
- [CodeForces 52C]Circular RMQ
题目传送门 评分:省选/NOI-,难度:普及+/提高 这题真的和RMQ没有半点关系,只需要一个裸的线段树,连pushdown都不需要,只需要两种操作:区间修改和区间求最小值,在回溯时加上标记即可,唯一 ...
- 【freemarker】渲染列表一系列操作
数据模型: public class AddressVo implements Serializable { private static final long serialVersionUID = ...
- lmbench的使用方法
一.引言 要评价一个系统的性能,通常有不同的指标,相应的会有不同的测试方法和测试工具,一般来说为了确保测试结果的公平和权威性,会选用比较成熟的商业测试软件.但在特定情形下,只是想要简单比较不同系统或比 ...