HDU 4812

思路:

点分治

先预处理好1e6 + 3以内到逆元

然后用map 映射以分治点为起点的链的值a 成他的下标 u

然后暴力跑出以分治点儿子为起点的链的值b,然后在map里查找inv[b]*k

代码:

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pii pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int MOD = 1e6 + ;
const int INF = 0x7f7f7f7f;
const int N = 1e5 + ;
int inv[MOD + ], mp[MOD + ], head[N], mxsz[N], sz[N], v[N], cnt = , rt = , n, k, ans1, ans2;
int deep[N], dis[N], id[N], top = ;
bool vis[N];
struct edge {
int to, nxt;
}edge[N*];
void add_edge(int u, int v) {
edge[cnt].to = v;
edge[cnt].nxt = head[u];
head[u] = cnt++;
}
void init() {
inv[] = ;
for (int i = ; i < MOD; i++) inv[i] = (MOD - MOD/i) * 1LL * inv[MOD%i] % MOD;
}
void update(int x, int y) {
int t = (1LL * inv[x] * k) % MOD;
int now = mp[t];
if(!now) return ;
if(now > y) swap(now, y);
if(now < ans1 || now == ans1 && y < ans2) ans1 = now, ans2 = y;
}
void get_rt(int o, int u) {
sz[u] = , mxsz[u] = ;
for (int i = head[u]; ~i; i = edge[i].nxt) {
if(edge[i].to != o && !vis[edge[i].to]) {
get_rt(u, edge[i].to);
sz[u] += sz[edge[i].to];
mxsz[u] = max(mxsz[u], sz[edge[i].to]);
}
}
mxsz[u] = max(mxsz[u], n - sz[u]);
if(mxsz[u] < mxsz[rt]) rt = u;
}
void get_d(int o, int u) {
deep[++top] = dis[u];
id[top] = u;
for (int i = head[u]; ~i; i = edge[i].nxt) {
if(!vis[edge[i].to] && edge[i].to != o) {
dis[edge[i].to] = (1LL * dis[u] * v[edge[i].to])%MOD;
get_d(u, edge[i].to);
}
}
}
void solve(int u) {
vis[u] = true;
mp[v[u]] = u;
for (int i = head[u]; ~i; i = edge[i].nxt) {
if(!vis[edge[i].to]) {
top = , dis[edge[i].to] = v[edge[i].to];
get_d(u, edge[i].to);
for (int j = ; j <= top; j++) update(deep[j], id[j]);
top = , dis[edge[i].to] = (1LL * v[u] * v[edge[i].to])%MOD;
get_d(u, edge[i].to);
for (int j = ; j <= top; j++) {
int t = deep[j];
if(!mp[t] || id[j] < mp[t]) mp[t] = id[j];
}
}
}
mp[v[u]] = ;
for (int i = head[u]; ~i; i = edge[i].nxt) {
if(!vis[edge[i].to]) {
top = , dis[edge[i].to] = (1LL * v[u] * v[edge[i].to])%MOD;
get_d(u, edge[i].to);
for (int j = ; j <= top; j++) mp[deep[j]] = ;
}
}
for (int i = head[u]; ~i; i = edge[i].nxt) {
if(!vis[edge[i].to]) {
mxsz[] = n = sz[edge[i].to];
get_rt(rt = , edge[i].to);
solve(rt);
}
}
}
int main() {
init();
int u, V;
while(~scanf("%d%d", &n, &k)) {
mem(head, -);
mem(vis, false);
mem(mp, );
cnt = ;
ans1 = ans2 = INF;
for (int i = ; i <= n; i++) scanf("%d", &v[i]);
for (int i = ; i < n; i++) scanf("%d%d", &u, &V), add_edge(u, V), add_edge(V, u);
mxsz[] = n;
get_rt(rt = , );
solve(rt);
if(ans1 == INF) printf("No solution\n");
else printf("%d %d\n", ans1, ans2);
}
return ;
}

HDU 4812 D Tree的更多相关文章

  1. HDU - 4812 D Tree 点分治

    http://acm.hdu.edu.cn/showproblem.php?pid=4812 题意:有一棵树,每个点有一个权值要求找最小的一对点,路径上的乘积mod1e6+3为k 题解:点分治,挨个把 ...

  2. HDU 4812 D Tree 树分治+逆元处理

    D Tree Problem Description   There is a skyscraping tree standing on the playground of Nanjing Unive ...

  3. hdu 4812 D Tree(树的点分治)

    D Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total ...

  4. HDU 4812 D Tree 树分区+逆+hash新位置

    意甲冠军: 特定n点树 K 以下n号码是正确的点 以下n-1行给出了树的侧. 问: 所以,如果有在正确的道路点图的路径 % mod  = K 如果输出路径的两端存在. 多条路径则输出字典序最小的一条. ...

  5. HDU 4812 D Tree 树分治

    题意: 给出一棵树,每个节点上有个权值.要找到一对字典序最小的点对\((u, v)(u < v)\),使得路径\(u \to v\)上所有节点权值的乘积模\(10^6 + 3\)的值为\(k\) ...

  6. HDU 4871 Shortest-path tree 最短路 + 树分治

    题意: 输入一个带权的无向连通图 定义以顶点\(u\)为根的最短路生成树为: 树上任何点\(v\)到\(u\)的距离都是原图最短的,如果有多条最短路,取字典序最小的那条. 然后询问生成树上恰好包含\( ...

  7. hdu 4812 DTree (点分治)

    D Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total S ...

  8. HDU 5513 Efficient Tree

    HDU 5513 Efficient Tree 题意 给一个\(N \times M(N \le 800, M \le 7)\)矩形. 已知每个点\((i-1, j)\)和\((i,j-1)\)连边的 ...

  9. HDU 4925 Apple Tree(推理)

    HDU 4925 Apple Tree 题目链接 题意:给一个m*n矩阵种树,每一个位置能够选择种树或者施肥,假设种上去的位置就不能施肥,假设施肥则能让周围果树产量乘2.问最大收益 思路:推理得到肯定 ...

随机推荐

  1. forever 用法

    安装过Node.js后再安装forever,需要加-g参数,因为forever要求安装到全局环境下: npm install forever -g 常用指令: npm install forever ...

  2. Java基础——javaMail:使用心得

    想要做一个java发送邮件小功能. 使用的maven搭建的项目. <!-- https://mvnrepository.com/artifact/javax.mail/mail -->&l ...

  3. uniGUI试用笔记(七)

    uniGUI的文件下载由于TUniSession的存在而变得非常简单,最典型的一个例子就是将列表中的所有数据导出到Excel中.服务器上采用TMS FlexCel控件,先将数据集中的记录导入到Exce ...

  4. ZOJ 3593 One Person Game(ExGcd + 最优解)题解

    思路:题意转化为求 (ax+by=dis) || (ax+cy=dis) || (bx+cy=dis) 三个式子有解时的最小|x| + |y|.显然求解特解x,y直接用扩展欧几里得,那么怎么求|x| ...

  5. (转)Awsome Domain-Adaptation

    Awsome Domain-Adaptation 2018-08-06 19:27:54 This blog is copied from: https://github.com/zhaoxin94/ ...

  6. 论文笔记:Capsules for Object Segmentation

    Capsules for Object Segmentation 2018-04-16  21:49:14 Introduction: ----

  7. 【Hadoop 分布式部署 四:配置Hadoop 2.x 中主节点(NN和RM)到从节点的SSH无密码登录】

    *******************                一定要使这三台机器的用户名相同,安装目录相同          ************* SSH 无密钥登录的简单介绍(之前再搭 ...

  8. js 模块化规范

    模块规范 CommonJS module.exports, exports 导出模块 require 加载模块, CommonJS 同步,服务端.实践者: nodejs ES6 export, exp ...

  9. Highlight.js语法突出显示

    正如我在这个博客开始之前所说的最小可行产品,因此我在几个小时内就开始运行了.这种方法在初始推动之后会减慢你的速度.最新的例子是要提供语法高亮的代码片段. 规格由于使用静态网站生成器,我的狩猎的开始立即 ...

  10. BZOJ 1037: [ZJOI2008]生日聚会Party(区间dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1037 题意: 思路: 四维数组进行dp,dp[i][j][a][b]表示进行到第i个座位时已经有j个 ...