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 * ...
随机推荐
- C语言的第0次作业
你认为大学的学习生活.同学关系.师生关系应该是怎样? 1.我觉得大学生活应该充实而富有意义,不荒废学业,合理分配时间,让自己有一技之长,与时代接轨. 2.同学之间应该顺其自然的相处,不做作,不矫情,真 ...
- 201621123060《JAVA程序设计》第一周学习总结
1.本周学习总结 1.讲述了JAVA的发展史,关于JDK.JRE.JVM的联系和区别 2.JDK是用JAVA开发工具.做项目的关键.JRE是JAVA的运行环境(JAVA也是JAVA语言开发的).JVM ...
- 第十一条:谨慎的覆盖clone()方法
一个类要想实现克隆,需要实现Cloneable接口,表明这个类的对象具有克隆的功能. Cloneable接口是一个mixin接口,它里面并没有任何的抽象方法,类似的接口有Serializable接口, ...
- 2017-2018-1 我爱学Java 第六七周 作业
团队六七周作业 完善版需求规格说明书 制定团队编码规范 数据库设计 后端架构设计 TODOList 参考资料 完善版需求规格说明书 <需求规格说明书>初稿不足之处: 1.开发工具写错 2. ...
- sys模块的使用
import sys,time ''' if sys.argv[1]=='sleepy': print('nongsi') else: print('....')''' #进度条 for i in r ...
- SourceTree 实现 git flow 流程
为什么使用 git 和 git flow,这篇文章 深入理解学习Git工作流 的内容相信能够给你一个完整的答案. 我们以使用SVN的工作流来使用git有什么不妥? git 方便的branch在哪里,团 ...
- 不看就亏了:DELL EqualLogic PS6100详解及数据恢办法
DELL EqualLogic PS6100采用虚拟ISCSI SAN阵列,为远程或分支办公室.部门和中小企业存储部署带来企业级功能.智能化.自动化和可靠性,支持VMware.Solaris.Linu ...
- 延迟确认和Nagle算法
前篇文章介绍了三次握手和四次挥手,了解了TCP是如何建立和断开连接的,文末还提到了抓包挥手时的一个“异常”现象,当时无法解释,特地查了资料,知道了数据传输中的延迟确认策略. 何谓延迟确认策略? WIK ...
- Spring AOP AspectJ
本文讲述使用AspectJ框架实现Spring AOP. 再重复一下Spring AOP中的三个概念, Advice:向程序内部注入的代码. Pointcut:注入Advice的位置,切入点,一般为某 ...
- 【原创】自己动手实现JDK动态代理
项目结构如下图所示,maven项目 1.JDK动态代理 先来一段jdk动态代理的demo, 首先创建一个接口,Person package bean; public interface Person ...