传送门

题意:找路径积$\mod 1e6+3 = k$的字典序最小点对


作为一个点分治蒟蒻,写这道题花了两节课....

显然只要开一个桶$c[i]$记录当前路径积为$i$的最小点

然后处理一个子树时一个个子树遍历更新答案再更新$c$就行了

最后再把$c$复原

可以用一个栈记下更改过的$c$,但貌似比在遍历一遍树更慢?

然后注意更新和复原$c[w[u]]$

好了回教室上数学课啦

#pragma comment(linker,"/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+,M=1e6+,P=1e6+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n;ll k,w[N];
struct edge{
int v,ne;
}e[N<<];
int h[N],cnt;
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
int inv[M];
void iniInv(){
inv[]=;
for(int i=;i<P;i++)
inv[i]=(ll)(P-P/i)*inv[P%i]%P;
} int size[N],f[N],vis[N],root,allSize;
void dfsRt(int u,int fa){
size[u]=;f[u]=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(vis[v]||v==fa) continue;
dfsRt(v,u);
size[u]+=size[v];
f[u]=max(f[u],size[v]);
}
f[u]=max(f[u],allSize-size[u]);
if(f[u]<f[root]) root=u;
}
int c[M],ans[];
int st[N],top;
void dfsDee(int u,int fa,int now){
if(!c[now]) c[now]=u;//,st[++top]=now;
else c[now]=min(c[now],u);
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(!vis[v]&&v!=fa) dfsDee(v,u,now*w[v]%P);
}
}
void dfsAns(int u,int fa,int now){
int x=c[k*inv[now]%P],y=u;
if(x){
if(x>y) swap(x,y);
if(x<ans[]||(x==ans[]&&y<ans[])) ans[]=x,ans[]=y;
}
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(!vis[v]&&v!=fa) dfsAns(v,u,now*w[v]%P);
}
}
void dfsRec(int u,int fa,int now){
c[now]=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(!vis[v]&&v!=fa) dfsRec(v,u,now*w[v]%P);
}
}
void dfsSol(int u){
vis[u]=;
c[w[u]]=u;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(!vis[v]){
dfsAns(v,u,w[v]);
dfsDee(v,u,w[u]*w[v]%P);
}
}
//while(top) c[st[top]]=0,top--;
for(int i=h[u];i;i=e[i].ne) if(!vis[e[i].v]) dfsRec(e[i].v,u,w[u]*w[e[i].v]%P);
c[w[u]]=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(!vis[v]){
root=;allSize=size[v];
dfsRt(v,);
dfsSol(root);
}
}
}
int main(){
freopen("in","r",stdin);
iniInv();
while(scanf("%d%lld",&n,&k)!=EOF){
memset(vis,,sizeof(vis));
cnt=;memset(h,,sizeof(h));
memset(c,,sizeof(c));
for(int i=;i<=n;i++) w[i]=read();
for(int i=;i<=n-;i++) ins(read(),read());
ans[]=ans[]=INF;
f[]=INF;
root=;allSize=n;
dfsRt(,);
dfsSol(root);
if(ans[]!=INF) printf("%d %d\n",ans[],ans[]);
else puts("No solution");
}
}

HDU D Tree [点分治]的更多相关文章

  1. hdu 4812 DTree (点分治)

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

  2. hdu 5909 Tree Cutting [树形DP fwt]

    hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...

  3. hdu 5830 FFT + cdq分治

    Shell Necklace Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  4. HDU 5044 Tree(树链剖分)

    HDU 5044 Tree field=problem&key=2014+ACM%2FICPC+Asia+Regional+Shanghai+Online&source=1&s ...

  5. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

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

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

  7. HDU - 4812 D Tree 点分治

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

  8. hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...

  9. hdu 5909 Tree Cutting —— 点分治

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治,每次的 rt 是必选的点: 考虑必须选根的一个连通块,可以DP,决策就是在每个子树中决定选不 ...

随机推荐

  1. 将id传过去,根据id显示下面的详情页面

    官方demo:http://dev.dcloud.net.cn/mui/event/ 假设如下场景:从新闻列表页面进入新闻详情页面,新闻详情页面为共用页面,通过传递新闻ID通知详情页面需要显示具体哪个 ...

  2. 调用webService的几种方式

    转自:http://blog.csdn.net/u011165335/article/details/51345224 一.概览 方式1: HttpClient:可以用来调用webservie服务,也 ...

  3. TI-RTOS 之 PWM

    TI-RTOS 之 PWM CC1310 有4个定时器,8个PWM通道,在TI-RTOS它的驱动是写好的,引用时需要包含 PWM.h头文件即可. 一般是任务主体之前,或者主函数进行初始化. Board ...

  4. [国嵌笔记][017][Makefile工程管理]

    Makefile的用途 1.make能够使整个程序的编译.链接只需一个命令就可以完成 2.make的工作主要依赖于Makefile的文件.Makefile文件描述了整个程序的编译.链接等规则,使之自动 ...

  5. HDU 1232 畅通工程(模板——并查集)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1232 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出 ...

  6. Tomcat服务器的下载及安装

    Tomcat服务器的下载及安装 1)到apache官网.www.apache.org     http://jakarta.apache.org(产品的主页) 2) 安装版:window (exe.m ...

  7. 通过Xshell如何从Linux服务器下载文件(亲测可行)

    到网上下载lrzsz安装包,这里以lrzsz-0.12.20.tar.gz为例 2 打开终端 cd 到安装包所在目录 tar zxvf lrzsz-0.12.20.tar.gz 解压安装包 3 进入解 ...

  8. iphone开发笔记目录

    http://www.cnblogs.com/syxchina/archive/2012/10/20/2732731.html#2653802

  9. struts配置json需要的jar包

  10. jQuery --- 实现 checkbox 样式的单选框

    早就想写点博客了 一直懒着动  最近发现一些写过的东西都不记得了,下决心把自己平时遇到的问题.得到的经验记录下来,希望能大家一点帮助 这是之前写的一个模态框 要求单选 但是 要求radio的默认样式 ...