hdu 4812 DTree (点分治)
D Tree
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)
Total Submission(s): 3876 Accepted Submission(s): 743
Can you help them in solving this problem?
Each test case starts with a line containing two integers N(1 <= N <= 105) and K(0 <=K < 106 + 3). The following line contains n numbers vi(1 <= vi < 106 + 3), where vi indicates the integer on vertex i. Then follows N - 1 lines. Each line contains two integers x and y, representing an undirected edge between vertex x and vertex y.
For more information, please refer to the Sample Output below.
2 5 2 3 3
1 2
1 3
2 4
2 5
5 2
2 5 2 3 3
1 2
1 3
2 4
2 5
No solution
/*
hdu 4812 DTree (点分治) problem:
求最小的点对使 u->v的点权的乘积%mod=limit. solve:
每次求过当前树根节点的情况. 每次可以计算出 一点到当前根节点的情况temp,所以只需要找出其它子树中是否有limit/temp
因为有取余,所以先预处理出所有的逆元. hhh-2016-08-23 10:52:26
*/
#pragma comment(linker,"/STACK:124000000,124000000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>
#include <math.h>
#include <map>
#define lson i<<1
#define rson i<<1|1
#define ll long long
#define clr(a,b) memset(a,b,sizeof(a))
#define key_val ch[ch[root][1]][0]
#define inf 0x3FFFFFFFFFFFFFFFLL
#define mod 1000003
using namespace std;
const int maxn = 100010;
ll val[maxn],d[maxn],limit;
int head[maxn];
int n,k,s[maxn],f[maxn],root;
int Size,tot;
bool vis[maxn];
vector<ll> ta; struct node
{
int to,w,next;
}edge[maxn<<2]; void add_edge(int u,int v)
{
edge[tot].to=v,edge[tot].next=head[u],head[u]=tot++;
} void get_root(int now,int fa)
{
int v;
s[now] = 1,f[now] = 0;
for(int i = head[now];~i;i = edge[i].next)
{
if( (v=edge[i].to) == fa || vis[v])
continue;
get_root(v,now);
s[now] += s[v];
f[now] = max(f[now],s[v]);
}
f[now] = max(f[now],Size - s[now]);
if(f[now] < f[root]) root = now;
}
int id[maxn];
int idnum;
void dfs(int now,int fa)
{
int v;
ta.push_back(d[now]);
id[idnum++] = now;
s[now] = 1;
for(int i = head[now];~i;i = edge[i].next)
{
if( (v=edge[i].to) == fa || vis[v])
continue;
d[v] = (d[now] * val[v])%mod;
dfs(v,now);
s[now] += s[v];
}
}
int flag[mod + 10];
int mp[mod + 10];
int cur = 0;
ll ni[mod+10];
int ans[2];
void to_ans(int a, int b)
{ if (a > b) swap(a,b);
if (ans[0] == -1 || ans[0] > a) ans[0] = a, ans[1] = b;
else if (ans[0] == a && ans[1] > b) ans[1] = b;
// cout <<"a:"<<ans[0] << " b:" <<ans[1] <<endl;
} void work(int now,int cnt)
{
f[0] = Size = cnt;
get_root(now,root = 0);
int v;
vis[root] = 1;
for(int i = head[root];~i;i = edge[i].next)
{
if(!vis[v = edge[i].to])
{
ta.clear(),d[v] = val[v],idnum = 0;
dfs(v,0); for(int j = 0; j < ta.size();j++)
{
if(val[root]*ta[j] % mod == limit && root != id[j])
to_ans(root,id[j]);
ll t = (ll)limit*ni[val[root]*ta[j]%mod]%mod;
if(flag[t] != cur)
continue;
if(mp[t] == id[j])
continue;
to_ans(mp[t],id[j]);
}
for(int j = 0; j < ta.size(); j++)
{
int t = ta[j];
if(flag[t] != cur || mp[t] > id[j]) mp[t] = id[j],flag[t] = cur;
}
}
}
cur ++;
for(int i = head[root];~i;i = edge[i].next)
{
if(vis[edge[i].to])
continue;
work(edge[i].to,s[edge[i].to]);
}
} ll egcd(ll a,ll b, ll &x, ll &y)
{
ll temp,tempx;
if (b == 0)
{
x = 1;
y = 0;
return a;
}
temp = egcd(b,a % b, x, y);
tempx = x;
x = y;
y = tempx - a / b * y;
return temp;
} int main()
{ ll y;
for (int i = 0; i < mod; i++)
{
egcd(i*1ll, mod*1ll, ni[i], y);
ni[i] %= mod, ni[i] = (ni[i]+mod)%mod;
}
while(scanf("%d%I64d",&n,&limit)!=EOF)
{
if(!n && !limit)
break;
clr(vis,0),clr(flag,0);
clr(head,-1),tot = 0;
ans[0] = ans[1] = -1;
int a,b;
for(int i = 1; i <= n; i++)
{
scanf("%I64d",&val[i]);
}
for(int i = 1; i < n; i++)
{
scanf("%d%d",&a,&b);
add_edge(a,b);
add_edge(b,a);
}
cur = 1;
work(1,n);
if(ans[0] == -1)
printf("No solution\n");
else
printf("%d %d\n",ans[0],ans[1]);
}
return 0;
}
hdu 4812 DTree (点分治)的更多相关文章
- HDU 4812 D Tree
HDU 4812 思路: 点分治 先预处理好1e6 + 3以内到逆元 然后用map 映射以分治点为起点的链的值a 成他的下标 u 然后暴力跑出以分治点儿子为起点的链的值b,然后在map里查找inv[b ...
- hdu 5830 FFT + cdq分治
Shell Necklace Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 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 树分治
题意: 给出一棵树,每个节点上有个权值.要找到一对字典序最小的点对\((u, v)(u < v)\),使得路径\(u \to v\)上所有节点权值的乘积模\(10^6 + 3\)的值为\(k\) ...
- HDU 4812 (点分治)
题目:https://vjudge.net/contest/307753#problem/E 题意:给你一颗树,树上每个点都有个权值,现在问你是否存在 一条路径的乘积 mod 1e6+3 等于 k的 ...
- E - D Tree HDU - 4812 点分治+逆元
这道题非常巧妙!!! 我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是 当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点,所有绿色的子树节 ...
- HDU 4812:D Tree(树上点分治+逆元)
题目链接 题意 给一棵树,每个点上有一个权值,问是否存在一条路径(不能是单个点)上的所有点相乘并对1e6+3取模等于k,输出路径的两个端点.如果存在多组答案,输出字典序小的点对. 思路 首先,(a * ...
随机推荐
- 2017-2018-1 1623 bug终结者 冲刺005
bug终结者 冲刺005 by 20162323 周楠 今日任务:理清游戏运行逻辑,GameView类为游戏核心代码 简要介绍 游戏中整个地图都是由数组组成 1.整个地图为16×16格,主要元素有墙. ...
- HTTP协议形象展现
关于http协议:我们分成几个模块说: http协议: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统. HTTP协议的主要特点可概括如下: 1.支持客户 ...
- iOS开发之UITextView,设置textViewplaceholder
一.设置textView的placeholder UITextView上如何加上类似于UITextField的placeholder呢,其实在UITextView上加上一个UILabel或者UITex ...
- Css之导航栏下拉菜单
Css: /*下拉菜单学习-2017.12.17 20:17 added by ldb*/ ul{ list-style-type:none; margin:; padding:; overflow: ...
- 前端双引号单引号,正则反向引用,js比较jq
1.js,jq,css,html属性必须双,如果同时出现需要嵌套使用,属性的规范是双但是也可以用单测试有效 单引号现象举例:jq中获取元素标签是单引号:$('input').click:弹出也是单引号 ...
- JavaScript 实现二叉树
JavaScript 实现二叉树: // JavaScript 实现二叉树 function BinaryTree () { var Node = function (key) { this.key ...
- Linux--初次体验
关于Linux已经听闻很久的大名了,但是一直没有机会来使用,这次趁着放假的机会,来体验一把Linux吧. 之前使用visuabox和Ubuntu16,但是虚拟机总是不能连接互联网,在虚拟机上面无法上网 ...
- ( 转 ) WebApiTestClient 的使用
注意点:需要修改api路由规则,加上action: "api/{controller}/{action}/{id}" 1.如何引入组件 首先,我们需要定义一个API项目 然后通过N ...
- 新概念英语(1-59)Is that all
Does the lady buy any chalk? A:I want some envelopes, please. B:Do you want the large size or the sm ...
- Android WebView那些坑之上传文件
最近公司项目需要在WebView上调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片. 解决问题之前我们先来说说WebView上传文件的逻辑:当我们在Web页面上点击 ...