POJ 1741 Tree(点分治)

POJ 1741 Tree

思路

男人八题中的一题,写完这题算是18\frac{1}{8}81个男人了!

这题是树上距离的计数问题,能够通过巧妙地排序加双指针来解决,
统计距离应该大家都会地,我就来说明一下如何计数吧。
假设我们已经求得距离并且排好序之后是这样的:
1335671\ 3\ 3\ 5\ 6\ 71 3 3 5 6 7,我们要求的距离是小于等于777的,
初始设置i=1,j=6i = 1, j= 6i=1j=6,也就是一头一尾,
接下来我们判断如果dis[i]+dis[j]>7dis[i] + dis[j] > 7dis[i]+dis[j]>7就不断让j−−j--j这个时候答案的贡献就是j−ij - iji了,
简单模拟一下:
i=1,j=6,value[1]+value[6]=8>7,j−−value[1]+value[5]=7i = 1, j = 6, value[1] + value[6] = 8 > 7, j--value[1] + value[5] = 7i=1,j=6,value[1]+value[6]=8>7,jvalue[1]+value[5]=7,答案贡献j−ij - iji
然后就是i++i++i++,接下来就是上面的重复步骤了。直到i==ji == ji==j
然后这题就这样水过了。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <stdlib.h>
#include <map>#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}const int N = 1e4 + 10;int head[N], to[N << 1], nex[N << 1], value[N << 1], cnt;int sz[N], visit[N], msz[N], dis[N], pre[N], now[N], tot, root, n, m, sum, ans;void add(int x, int y, int w) {to[cnt] = y;nex[cnt] = head[x];value[cnt] = w;head[x] = cnt++;
}void get_root(int rt, int fa) {sz[rt] = 1, msz[rt] = 0;for(int i = head[rt]; i; i = nex[i]) {if(to[i] == fa || visit[to[i]]) continue;get_root(to[i], rt);sz[rt] += sz[to[i]];msz[rt] = max(msz[rt], sz[to[i]]);}msz[rt] = max(msz[rt], sum - sz[rt]);if(msz[rt] < msz[root]) root = rt;
}void get_dis(int rt, int fa) {now[++tot] = dis[rt];for(int i = head[rt]; i; i = nex[i]) {if(to[i] == fa || visit[to[i]]) continue;dis[to[i]] = dis[rt] + value[i];get_dis(to[i], rt);}
}int calc(int rt) {tot = 0;now[++tot] = 0;int ans = 0;for(int i = head[rt]; i; i = nex[i]) {if(visit[to[i]]) continue;dis[to[i]] = value[i];int st = tot + 1;get_dis(to[i], rt);sort(now + st, now + tot + 1);for(int j = st, k = tot; j <= tot && j <= k; j++) {while(now[j] + now[k] > m && j < k) {k--;}ans += k - j;}}ans = -ans;sort(now + 1, now + tot + 1);for(int i = 1, j = tot; i <= tot && i <= j; i++) {while(now[j] + now[i] > m && j > i) {j--;}ans += j - i;}return ans;
}void solve(int rt) {visit[rt] = 1;ans += calc(rt);for(int i = head[rt]; i; i = nex[i]) {if(visit[to[i]]) continue;sum = sz[to[i]];root = 0, msz[0] = inf;get_root(to[i], rt);solve(root);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);while(scanf("%d %d", &n, &m) && (n + m)) {memset(head, 0, sizeof head), cnt = 1, ans = 0;memset(visit, 0, sizeof visit);for(int i = 1; i < n; i++) {int x, y, w;scanf("%d %d %d", &x, &y, &w);add(x, y, w);add(y, x, w);}root = 0, msz[0]  = inf, sum = n;get_root(1, 0);solve(root);printf("%d\n", ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1975 [国家集训队]排队(三维偏序)

P1975 [国家集训队]排队 查询逆序对数目&#xff0c;交换两个数的位置 首先逆序对是一个经典的二维偏序问题&#xff0c;然后现在问题变为静态&#xff0c;我们可以使用三维偏序来处理多出来的限制。或者也可以使用带修主席树处理。

Mercurial黄昏,Bitbucket宣布全面转向Git

源代码托管平台 Bitbucket 宣布将逐步放弃对版本控制系统 Mercurial 的支持。Bitbucket 推出于 2008 年&#xff0c;当时集中式版本控制是比较普遍的&#xff0c;Mercurial 是其中的典型代表&#xff0c;但是当前 Git 才是主流&#xff0c;它已经成为了大部分开源项目的首选版本…

HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)

HDU 4812 D Tree 思路 点对距离相等并且要求输出字典序最小的点对&#xff0c;距离相等不就是点分治裸题了嘛&#xff0c; 照着这个思路出发我们只要记录下所有点对是满足要求的&#xff0c;然后再去找字典序最小的点对就行了&#xff0c; 接下来就是考虑如何求最小点对了&…

P2754 [CTSC1999]家园 / 星际转移问题(网络流)

P2754 [CTSC1999]家园 / 星际转移问题 经典问题&#xff0c;利用分层图来跑网络流。

使用 Azure DevTest Lab 搭建云端开发测试环境

点击上方蓝字关注“汪宇杰博客”导语程序员和测试工程师经常需要自己搭环境用于开发和测试目的&#xff0c;这些机器可能只会使用很短一段时间。通常我们会在本机使用 Hyper-V、VMWare 之类的虚拟机产品&#xff0c;或者使用企业IT管理员分配的虚拟机去完成这项工作。然而安装配…

dotNET Core WebAPI 统一处理(返回值、参数验证、异常)

现在 Web 开发比较流行前后端分离现在 Web 开发比较流行前后端分离&#xff0c;我们的产品也是一样&#xff0c;前端使用Vue&#xff0c;后端使用 dotNet Core WebAPI &#xff0c;在写 API 的过程中有很多地方需要统一处理文档参数验证返回值异常处理本文就说说 API 的统一处理…

HDU 4059 The Boss on Mars (容斥)(2011 Asia Dalian Regional Contest)

The Boss on Mars 思路 显然我们可以求得∑i1ni46n515n410n3−n30\sum_{i 1} ^{n} i ^ 4 \frac{6n^5 15n^4 10n ^3 - n}{30}∑i1n​i4306n515n410n3−n​&#xff0c;接下来就是考虑把其中不与nnn互质的数给踢出去了&#xff0c;显然我们可以考虑容斥。 假设np1a1p2a2p3…

P2764 最小路径覆盖问题(网络流)

P2764 最小路径覆盖问题 最小链覆盖问题&#xff0c;关键在于怎么转化为网络流问题&#xff0c;我们可以发现网络流的常见套路就是将一个点拆成出点和入点来处理&#xff0c;对于一条链恰好满足出点和入点匹配的性质&#xff0c;所以可以拆点然后对应连边&#xff0c;这样跑最…

.net测试篇之单元测试/集成测试神器Autofixture

autofixture简介有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixture并且它能与moq,rhinomock等框架结合,对单元测试带来的便捷性,可维护性和扩展性更是难以言表,只有用用了…

杜教筛入门详解

杜教筛入门 前置知识 迪利克雷卷积&#xff08;*&#xff09;&#xff1a; 先介绍三个重要的函数&#xff1a; 元函数ϵ(n)[n1]\epsilon(n) [n 1]ϵ(n)[n1] 原函数可以看成是迪利克雷卷积里的单位元&#xff0c;即(ϵ∗f)(n)f(n)(\epsilon * f)(n) f(n)(ϵ∗f)(n)f(n)&am…

P2765 魔术球问题(网络流)

P2765 魔术球问题 给出n根柱子&#xff0c;求解可以将最多多少编号的球放在上面&#xff0c;并且满足相邻的编号和为完全平方数。 n<50 这个数据范围我们可以选择网络流&#xff0c;然后将对应点连边&#xff0c;然后每次枚举编号&#xff0c;将其加入残量网络&#xff0c…

DotNetCore 3.0 助力 WPF本地化

概览随着我们的应用程序越来越受欢迎&#xff0c;我们的下一步将要开发多语言功能。方便越来越多的国家使用我们中国的应用程序&#xff0c;基于 WPF 本地化&#xff0c;我们很多时候使用的是系统资源文件&#xff0c;可是动态切换本地化&#xff0c;就比较麻烦了。实现思路现在…

#6229. 这是一道简单的数学题(反演 + 杜教筛)

#6229. 这是一道简单的数学题 推式子 ∑i1n∑j1ilcm(i,j)gcd(i,j)(∑i1n∑j1nlcm(i,j)gcd(i,j)n)∗inv2所以重点求∑i1n∑j1nlcm(i,j)gcd(i,j)∑i1n∑j1nijgcd(i,j)2∑d1n∑i1nd∑j1ndij(gcd(i,j)1)∑d1n∑k1ndμ(k)k2(∑i1nkdi)2我们另tkd&#xff0c;得到∑t1n(∑i1nti)2∑k…

P2766 最长不下降子序列问题(网络流)

P2766 最长不下降子序列问题 求解LIS长度k求解长度为k的不下降子序列个数&#xff0c;并且一个数只能使用一次求解长度为k的不下降子序列个数&#xff0c;第一个数和第n个数可以使用任意次 首先利用dp可以求解出以每个点开始的最长不下降子序列&#xff0c;然后可以类似于最短…

开源题材征集 + MVCEF Core 完整教程小结

到目前为止&#xff0c;我们的MVCEF Core 完整教程的理论部分就全部结束了&#xff0c;共20篇&#xff0c;覆盖了核心的主要知识点。下一阶段是实战部分&#xff0c;我们将会把这些知识点串联起来&#xff0c;用10篇(天)来完成一个开源项目。现向园友征集题材&#xff0c;你提需…

P2770 航空路线问题(网络流)

P2770 航空路线问题 似乎是一个经典的双调路径问题&#xff0c;然后这里使用网络流解决了&#xff0c;本质上要求两条路径没有经过同一个点&#xff0c;并且总长度最大&#xff0c;所以我们实际上可以跑网络流&#xff0c;然后拆点限制路径没有交点。

欧拉心算(反演 + 积性函数筛)

欧拉心算 推式子 ∑i1n∑j1nϕ(gcd(i,j))∑d1nϕ(d)∑i1nd∑j1nd[gcd(i,j)1]∑d1nϕ(d)∑k1ndμ(k)(⌊nkd⌋)2另tkd∑t1n(⌊nt⌋)2∑d∣tϕ(d)μ(td)另f(n)∑d∣nϕ(d)μ(nd)我们考虑如何得到这个函数的前缀和&#xff0c;显然这是一个积性函数有如下性质f(1)1f(p)ϕ(1)μ(p)ϕ…

对微软的敌视何时休? 从一篇语言评论文章对C#的评价说起

看到一篇公众号文章《2020年什么编程语言最受欢迎&#xff0c;待遇最高&#xff1f;》&#xff0c;其中对C#的描述如下&#xff1a;点击阅读原文&#xff0c;看到这是一篇翻译文章&#xff1a;https://codinginfinite.com/top-programming-languages-2020-stats-surveys/这篇文…

1 ~ n的k次方求和模板

∑i1nik\sum\limits_{i 1} ^{n} i ^ ki1∑n​ik /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h>using namespace std;typedef long long ll;const int inf 0x3f3f3f3f; const double eps 1e-7;const int N 1e6 …