HDU 4812 D Tree
思路:
点分治
先预处理好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的更多相关文章
- HDU - 4812 D Tree 点分治
http://acm.hdu.edu.cn/showproblem.php?pid=4812 题意:有一棵树,每个点有一个权值要求找最小的一对点,路径上的乘积mod1e6+3为k 题解:点分治,挨个把 ...
- HDU 4812 D Tree 树分治+逆元处理
D Tree Problem Description There is a skyscraping tree standing on the playground of Nanjing Unive ...
- hdu 4812 D Tree(树的点分治)
D Tree Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) Total ...
- HDU 4812 D Tree 树分区+逆+hash新位置
意甲冠军: 特定n点树 K 以下n号码是正确的点 以下n-1行给出了树的侧. 问: 所以,如果有在正确的道路点图的路径 % mod = K 如果输出路径的两端存在. 多条路径则输出字典序最小的一条. ...
- HDU 4812 D Tree 树分治
题意: 给出一棵树,每个节点上有个权值.要找到一对字典序最小的点对\((u, v)(u < v)\),使得路径\(u \to v\)上所有节点权值的乘积模\(10^6 + 3\)的值为\(k\) ...
- HDU 4871 Shortest-path tree 最短路 + 树分治
题意: 输入一个带权的无向连通图 定义以顶点\(u\)为根的最短路生成树为: 树上任何点\(v\)到\(u\)的距离都是原图最短的,如果有多条最短路,取字典序最小的那条. 然后询问生成树上恰好包含\( ...
- hdu 4812 DTree (点分治)
D Tree Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- HDU 5513 Efficient Tree
HDU 5513 Efficient Tree 题意 给一个\(N \times M(N \le 800, M \le 7)\)矩形. 已知每个点\((i-1, j)\)和\((i,j-1)\)连边的 ...
- HDU 4925 Apple Tree(推理)
HDU 4925 Apple Tree 题目链接 题意:给一个m*n矩阵种树,每一个位置能够选择种树或者施肥,假设种上去的位置就不能施肥,假设施肥则能让周围果树产量乘2.问最大收益 思路:推理得到肯定 ...
随机推荐
- mysql优化之使用iotop+pt-ioprofile定位具体top io文件
今天,将一个环境切换成行情优化后的版本后,发现io等待还是挺高,这还是第一次出现的.其他很多套环境都没有这个问题了,故iotop看了下,基本可以确定为是mysql进程的问题,如下: 但是iotop只能 ...
- vue2.0子组件修改父组件props数据的值
从vue1.0升级至2.0之后 prop的.sync被去除 因此直接在子组件修改父组件的值是会报错的如下: 目的是为了阻止子组件影响父组件的数据那么在vue2.0之后 如何在子组件修改父组件props ...
- bzoj 3325 密码 - Manacher
题目传送门 需要root权限的传送点 题目大意 已知一个串,以每个字符为中心的最长回文串长,以及每两个字符中间为中心的最长回文串长.求字典序最小的这样一个串.题目保证有解. 考虑Manacher的过程 ...
- Codeforces 750E New Year and Old Subsequence - 线段树 - 动态规划
A string t is called nice if a string "2017" occurs in t as a subsequence but a string &qu ...
- 螺旋折线(可能是最简单的找规律)【蓝桥杯2018 C/C++ B组】
标题:螺旋折线 如图p1.png所示的螺旋折线经过平面上所有整点恰好一次. 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度. 例如dis(0 ...
- docker 安装redis
https://blog.csdn.net/chenjianandiyi/article/details/78962709 运行镜像redis: docker run --name redis1 - ...
- 比原链设计思考: 扩展性UTXO模型
用户模型是比原链在最初就需要确定的重要数据结构, 团队的选择还是聚焦在两种典型的模型系统中,Account模型和UTXO模型,和其他大多数区块链设计一样, 选择了模型就决定了协议层的重要实现,两种模型 ...
- bootstrap图片上传功能
重点: fileupload .loadImage 引用js: <!-- Bootstrap CSS --> <link href="~/lib/bootstrap/ ...
- CAS Client集群环境的Session问题及解决方案介绍,下篇介绍作者本人项目中的解决方案代码
CAS Client集群环境的Session问题及解决方案 程序猿讲故事 2016-05-20 原文 [原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 之前写过一篇文章,介绍单点登 ...
- 5、web站点架构模式简介及Nginx
LB Cluster: 提升系统容量的方式: scale up:向上扩展 scale out:向外扩展 LVS工作在内核中,本身的数量不受套接字数量限制,利用LVS做调度器,优化得当的话,并发数量可以 ...