樹中點對距離(點分治)

題目

給出一棵帶邊權的樹,問有多少對點的距離<=Len

分析

這是一道點分治的經典題目,可以給點分治的初學者練手。
點分治,顧名思義就是把每個點分開了處理答案。
假設,目前做到了以x為根的子樹。
先求出子樹中每個點到根的距離\(dis\),對于兩個點\(i\)\(j\),如果\(dis_{i}+dis_{j}<=k\),那么\((i,j)\)就是一個合法的點對。
而點對的路徑就會有兩種:經過x點的和不經過x點的。
顯然,不經過x點的一定會再x的兒子的子樹中被計算過。所以,我們要減去不經過x點的。
那怎么把不經過x點的減去呢?
用以x為根的子樹的\(dis\)值(why?如果用以x的兒子為根的子樹的\(dis\),就會有些可以到達x的兒子的卻不能到達x的點對,被多減掉),來計算以x的兒子為根的子樹中的點對數量,用減去它們就可以了。

記住要找重心

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
using namespace std;
long long dis[12000],next[22000],last[20020],to[20200],n,m,tot,v[20200],d[5000],sum=0,size[20020],mx[20020],f,root,ans;
bool bz[20020];
long long bj(long long x,long long y,long long z)
{next[++tot]=last[x];last[x]=tot;to[tot]=y;v[tot]=z;
}
void findroot(long long x,long long fa)
{mx[x]=0;size[x]=1;for(long long i=last[x];i;i=next[i]){if(to[i]!=fa && (!bz[to[i]])) {findroot(to[i],x);size[x]+=size[to[i]];mx[x]=max(mx[x],size[to[i]]);}}mx[x]=max(mx[x],f-size[x]);if (mx[x]<mx[root]) root=x;return;
}
void q(long long l,long long r)
{long long i=l,j=r,mid=d[(l+r)/2],e;while(i<j){while(dis[d[i]]<dis[mid]) i++;while(dis[d[j]]>dis[mid]) j--;if(i<=j){e=d[i];d[i]=d[j];d[j]=e;i++;j--;}}if(i<r) q(i,r);if(l<j) q(l,j);
}
long long dg1(long long x,long long fa)
{d[++tot]=x;for(long long i=last[x];i;i=next[i]){long long j=to[i];if(fa!=j && (!bz[j])){dis[j]=dis[x]+v[i];dg1(j,x);}}
}
long long getsum()
{q(1,tot);int i=1,j=tot;long long y=0;while(i<j){if(dis[d[i]]+dis[d[j]]-2>m)j--;else{y+=j-i;i++;            } }return y;
}
long long dg(long long x,long long fa)
{bz[x]=true;dis[x]=1;tot=0;dg1(x,fa);ans+=getsum();for(int i=last[x];i;i=next[i]){int j=to[i];if(!bz[j]) {dis[j]=v[i]+1;tot=0;dg1(j,x);ans-=getsum();f=size[j];root=0;findroot(j,x);dg(root,x);}}
}
int main()
{scanf("%lld%lld",&n,&m);for(long long i=1;i<=n-1;i++){long long x,y,z;scanf("%lld%lld%lld",&x,&y,&z);bj(x,y,z);bj(y,x,z);          }mx[0]=maxlongint;f=n;findroot(1,0);dg(root,0);printf("%lld\n",ans);
}

轉載于:https://www.cnblogs.com/chen1352/p/9029689.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【a702】貸款利率

Time Limit: 10 second Memory Limit: 2 MB 問題描述 當一個人從銀行貸款后&#xff0c;在一段時間內他將不得不每月嘗還固定的分期付款。這個問題要求計算機出貸款者向銀行支付的利率。假設利率按月累計。 Input 輸入文件 僅一行包含三個用空格隔開的正整數。 第一個整數表示…

移動端適配--meta標簽玩的是什么

基本一直都在做移動端的開發&#xff0c;rem布局也寫了很久&#xff0c;不過對于實現的原理有些模棱兩可的盲點&#xff0c;自己總結一下留著以后回顧。 本文分以下幾個層面&#xff0c;主打用最最通俗的語言來闡述。 布局小例子viewport作用viewport和移動端適配的關系flexibl…

python-json

demjson.encode(self, obj, nest_level0) &#xff1a;用于將 Python 對象編碼成 JSON 字符串。 #!/usr/bin/python import demjsondata [ { a : 1, b : 2, c : 3, d : 4, e : 5 } ]json demjson.encode(data) print json demjson.decode(self, txt) &#xff1a;解碼 JSON 數…

計算機基礎知識--編碼知識

編碼回顧 編碼轉換 Python的bytes類型 編碼回顧 在備編碼相關的課件時&#xff0c;在知乎上看到一段關于Python編碼的回答 這哥們的這段話說的太對了&#xff0c;搞Python不把編碼徹底搞明白&#xff0c;總有一天它會猝不及防坑你一把。 不過感覺這哥們的答案并沒把編碼問題寫明…

Linux——安裝FTP服務器

1、檢查安裝vsftpd軟件 使用如下命令#rpm -qa |grep vsftpd可以檢測出是否安裝了vsftpd軟件&#xff0c; 如果沒有安裝&#xff0c;使用YUM命令進行安裝。 2、啟動服務 使用vsftpd軟件&#xff0c;主要包括如下幾個命令&#xff1a; 啟動ftp命令#service vsftpd start 停止ftp…

測試開發面試準備之Selenium 工作原理

Selenium 經歷了兩個版本&#xff0c;Selenium 1.0 和 Selenium 2.0&#xff0c;本文僅介紹Selenium2的原理&#xff0c;在Selenium 2.0 主推的是WebDriver,Selenium2又名Selenium Webdriver。 Selenium2簡介 Selenium是一個用于Web應用程序測試的工具&#xff0c;支持多平臺、…

CodeForces 11D(狀壓DP 求圖中環的個數)

Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no repeated vertices or edges. Input The first line of input contains two integers n and m (1?≤?n?≤?19, 0?≤?m) – respectively the number of vertices an…

vue插槽的使用(slot)

插槽 該頁面假設你已經閱讀過了組件基礎。如果你還對組件不太了解&#xff0c;推薦你先閱讀它。 插槽內容 Vue 實現了一套內容分發的 API&#xff0c;這套 API 基于當前的 Web Components 規范草案&#xff0c;將 <slot> 元素作為承載分發內容的出口。 它允許你像這樣合成…

圖片與二進制流轉換

#region//圖片轉換為二進制流 public void PictureToBinaryStream() { //獲取當前程序運行路徑 string path Application.StartupPath; //拼接成測試圖片路徑 string fullPath path "\\images\\test.png"; //初始化類 Bitmap bmp…

仿MIUI彈性列表

前言 最近去小米之家體驗了下小米9&#xff0c;發現MIUI有一個挺特別的列表動畫效果&#xff0c;在系統上的各種應用上都能見到它的身影。 網上查了下&#xff0c;小米早在幾個系統版本前就有這個&#xff0c;網上也有了實現這個效果的控件庫。實現方法大同小異&#xff0c;大多…

10、angular的全部api

1、lowercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.lowercase(AbCdEf))}); 2、uppercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.uppercas…

JavaScript快速入門-ECMAScript本地對象(String)

一、String對象 String對象和python中的字符串一樣&#xff0c;也有很多方法&#xff0c;這些方法大概分為以下種類&#xff1a; 1、索引和查找 1、charAt() 返回指定位置的字符。 2、charCodeAt() 返回指定位置的字符的 Unicode 編碼。這個返回值是 0 - 65535 之間的整數。 …

8、angular的select

1、數據源為數組 x for x in names第一個x代表在下拉框內顯示的數據 第二個x指的是在names里數據 <!DOCTYPE html><html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0…

ZOJ4116 Game on a Graph

給一個含n個點 m條邊的連通圖 把k個人分成兩組 輪流拿掉一條邊 當取走一條邊后圖不再連通 這個隊就輸了 水題啦 邊為n-1時 下一個拿掉邊的那個組就輸啦 AC代碼&#xff1a; 1 #include<bits/stdc.h>2 using namespace std;3 typedef long long ll;4 typedef unsigned lon…

集美大學1414班軟件工程個人作業2——個人作業2:APP案例分析

一、作業鏈接 個人作業2&#xff1a;APP案例分析 二、博文要求 通過分析你選中的產品&#xff0c;結合閱讀《構建之法》&#xff0c;寫一篇隨筆&#xff0c;包含下述三個環節的所有要求。 第一部分 調研&#xff0c; 評測 下載軟件并使用起來&#xff0c;描述最簡單直觀的個人第…

全局eslint不生效的處理

react項目里能用上 eslint 的 airbnb 規范真是的&#xff0c;對自己的編碼有很好的幫助&#xff0c;不經可以養成良好的代碼風格&#xff0c;而且還能檢測出 state或者變量 是否 使用過&#xff0c; 然而&#xff0c;所在團隊的小伙伴們&#xff0c;卻并未使用&#xff0c;或者…

IP通信基礎

源端口和目的端口字段--各占2字節。端口是傳輸層與應用層的服務接口。傳輸層的復用和分用功能都要通過端口才能實現。序號字段--占4字節。TCP連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段所發送的數據的第一個字節的序號轉載于:https://www.…

回溯算法 ------回溯算法的幾個例子

1.回溯算法的小結 2.回溯算法的幾個例子 2.1 ------ 4后問題 搜索空間&#xff1a; 2.2 ------01背包問題 01背包問題的算法設計 01背包問題的實例分析 01背包問題的搜索空間 2.3 ------- 貨郎問題 貨郎問題實例 貨郎問題的搜索空間 最后再來個小結 轉載于:https://www.cnb…

Phaserjs V2的state狀態解析及技巧

用phaserjs開發了好多游戲了&#xff0c;但是對phaser還是了解不深&#xff0c;只知道怎么去用&#xff0c;今天就特意花點時間研究下phaser的狀態管理到底是怎么回事。 首先&#xff0c;new Phaser.Game&#xff0c;以下是Phaser.Game的部分源碼&#xff1a; Phaser.Game fun…

JAVA_出神入化學習路線大綱

注&#xff1a;參考GitHub上的項目&#xff08;toBeTopJavaer&#xff09;總結出來 也是自己的目標。 基礎篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899066.html 進階篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899841.html 高級篇&#xff1a;https://www…