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

HDU 4812 D Tree

思路

点对距离相等并且要求输出字典序最小的点对,距离相等不就是点分治裸题了嘛,

照着这个思路出发我们只要记录下所有点对是满足要求的,然后再去找字典序最小的点对就行了,

接下来就是考虑如何求最小点对了,按照路径相加的原理,这里我们处理出所有路径到当前根节点的乘积出来,然后把这个数与k相除得到我们要找的点,当然,这个除法是模意义下的逆元乘法。

然后这题就变成了点分治裸题了。

代码

/*Author : lifehappy
*/
#pragma comment(linker,"/STACK:102400000,102400000")
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>#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 = 1e5 + 10, mod = 1e6 + 3;int head[N], to[N << 1], nex[N << 1], cnt;int sz[N], msz[N], value[N], visit[N], n, m, sum, root, tot;int flag[mod + 10], inv[mod + 10], now[N], pos[N], ans1, ans2;void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void init() {for(int i = 1; i <= n; i++) {visit[i] = head[i] = 0;}cnt = 1, ans1 = ans2 = inf;
}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_mult(int rt, int fa, int mult) {now[++tot] = mult, pos[tot] = rt;for(int i = head[rt]; i; i = nex[i]) {if(to[i] == fa || visit[to[i]]) continue;get_mult(to[i], rt, 1ll * mult * value[to[i]] % mod);}
}void calc(int rt) {tot = 0;for(int i = head[rt]; i; i = nex[i]) {if(visit[to[i]]) continue;int st = tot + 1;get_mult(to[i], rt, value[to[i]]);int ed = tot;for(int j = st; j <= ed; j++) {int temp = 1ll * now[j] * value[rt] % mod;temp = 1ll * m * inv[temp] % mod;int x1 = flag[temp], x2 = pos[j];if(x1 > x2) swap(x1, x2);if(x1 == inf || x2 == inf) continue;if(x1 < ans1 || (x1 == ans1 && x2 < ans2)) ans1 = x1, ans2 = x2;}for(int j = st; j <= ed; j++) {flag[now[j]] = min(pos[j], flag[now[j]]);//不断记录已有的存在的路径的点的最小编号。}}for(int i = 1; i <= tot; i++) {//最重要的重置操作。// cout << now[i] << " ";flag[now[i]] = inf;}// cout << endl;
}void solve(int rt) {// cout << rt << endl;visit[rt] = 1;flag[1] = rt;//这个flag一定要设置为当前根节点。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);inv[1] = 1;for(int i = 2; i < mod; i++) {inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;}memset(flag, 0x3f, sizeof flag);while(scanf("%d %d", &n, &m) != EOF) {init();for(int i = 1; i <= n; i++) {scanf("%d", &value[i]);}for(int i = 1; i < n; i++) {int x, y;scanf("%d %d", &x, &y);add(x, y);add(y, x);}sum = n, root = 0, msz[0] = inf;get_root(1, 0);solve(root);if(ans1 == inf || ans2 == inf) {puts("No solution");continue;}printf("%d %d\n", ans1, ans2);}return 0;
}

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

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

相关文章

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 …

ASP.NET Core on K8S深入学习(6)Health Check

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。预计阅读时间为10分钟。01—关于K8S中的健康监测所谓Health Check&#xff0c;就是健康检查&#xff0c;即防微杜渐。K8S是一个编排引擎可以帮助我们快捷地部署容器集…

Polynomial(2019南昌邀请赛)(拉格朗日插值)

Polynomial 思路 题目给的是一个nnn次多项式&#xff0c;要我们求∑ilr\sum\limits_{i l} ^{r}il∑r​&#xff0c;也就是一个累加的形式&#xff0c;容易想到转换成求前缀和。 所以我们考虑求前缀和&#xff0c;容易得到这个多项式的前缀和一定是≥n&≤n1\geq n \&…

P3356 火星探险问题(网络流)

P3356 火星探险问题 对于一个第一次经过会有价值&#xff0c;但是之后经过没有价值的点&#xff0c;我们的处理方法就是只连一条流量为1并且有费用的边&#xff0c;再连接流量为INF但是没有费用的边&#xff0c;这样我们要使得价值最大就会优先流有费用的边。