HDU D Tree [点分治]
题意:找路径积$\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 [点分治]的更多相关文章
- hdu 4812 DTree (点分治)
D Tree Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- hdu 5909 Tree Cutting [树形DP fwt]
hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...
- hdu 5830 FFT + cdq分治
Shell Necklace Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- HDU 5044 Tree(树链剖分)
HDU 5044 Tree field=problem&key=2014+ACM%2FICPC+Asia+Regional+Shanghai+Online&source=1&s ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
- HDU 4812 D Tree 树分治+逆元处理
D Tree Problem Description There is a skyscraping tree standing on the playground of Nanjing Unive ...
- HDU - 4812 D Tree 点分治
http://acm.hdu.edu.cn/showproblem.php?pid=4812 题意:有一棵树,每个点有一个权值要求找最小的一对点,路径上的乘积mod1e6+3为k 题解:点分治,挨个把 ...
- hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...
- hdu 5909 Tree Cutting —— 点分治
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治,每次的 rt 是必选的点: 考虑必须选根的一个连通块,可以DP,决策就是在每个子树中决定选不 ...
随机推荐
- 将id传过去,根据id显示下面的详情页面
官方demo:http://dev.dcloud.net.cn/mui/event/ 假设如下场景:从新闻列表页面进入新闻详情页面,新闻详情页面为共用页面,通过传递新闻ID通知详情页面需要显示具体哪个 ...
- 调用webService的几种方式
转自:http://blog.csdn.net/u011165335/article/details/51345224 一.概览 方式1: HttpClient:可以用来调用webservie服务,也 ...
- TI-RTOS 之 PWM
TI-RTOS 之 PWM CC1310 有4个定时器,8个PWM通道,在TI-RTOS它的驱动是写好的,引用时需要包含 PWM.h头文件即可. 一般是任务主体之前,或者主函数进行初始化. Board ...
- [国嵌笔记][017][Makefile工程管理]
Makefile的用途 1.make能够使整个程序的编译.链接只需一个命令就可以完成 2.make的工作主要依赖于Makefile的文件.Makefile文件描述了整个程序的编译.链接等规则,使之自动 ...
- HDU 1232 畅通工程(模板——并查集)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1232 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出 ...
- Tomcat服务器的下载及安装
Tomcat服务器的下载及安装 1)到apache官网.www.apache.org http://jakarta.apache.org(产品的主页) 2) 安装版:window (exe.m ...
- 通过Xshell如何从Linux服务器下载文件(亲测可行)
到网上下载lrzsz安装包,这里以lrzsz-0.12.20.tar.gz为例 2 打开终端 cd 到安装包所在目录 tar zxvf lrzsz-0.12.20.tar.gz 解压安装包 3 进入解 ...
- iphone开发笔记目录
http://www.cnblogs.com/syxchina/archive/2012/10/20/2732731.html#2653802
- struts配置json需要的jar包
- jQuery --- 实现 checkbox 样式的单选框
早就想写点博客了 一直懒着动 最近发现一些写过的东西都不记得了,下决心把自己平时遇到的问题.得到的经验记录下来,希望能大家一点帮助 这是之前写的一个模态框 要求单选 但是 要求radio的默认样式 ...