P3806 【模板】点分治1
一道淀粉质的模版题,开始是暴力
#include <bits/stdc++.h>
#define up(i,l,r) for(register int i = (l); i <= (r); ++i)
#define dn(i,l,r) for(register int i = (l); i >= (r); --i)
#define ll long long
#define re register
using namespace std; template <typename T> void in(T &x) {
x = ; T f = ; char ch = getchar();
while(!isdigit(ch)) {if(ch == '-') f = -; ch = getchar();}
while( isdigit(ch)) {x = * x + ch - ; ch = getchar();}
x *= f;
} template <typename T> void out(T x) {
if(x < ) x = -x , putchar('-');
if(x > ) out(x/);
putchar(x% + );
}
//--------------------------------------------------------- const int N = ; int n,m; struct edge {
int v,w,nxt;
}e[N<<]; int tot,head[N]; void add(int u,int v,int w) {
e[++tot].v = v; e[tot].w = w; e[tot].nxt = head[u]; head[u] = tot;
} int Tsize,f[N],rt;
int size[N];
bool vis[N]; void get_rt(int u,int fa) {
size[u] = ; f[u] = ;
for(re int i = head[u];i ;i = e[i].nxt) {
int v = e[i].v; if(v == fa || vis[v]) continue;
get_rt(v,u);
size[u] += size[v]; f[u] = max(f[u],size[v]);
}
f[u] = max(f[u],Tsize - size[u]);
if(f[u] < f[rt]) rt = u;
} int dis[N],cdis[N];
int ans[];
int cnt; void get_dis(int u,int fa) {
cdis[++cnt] = dis[u];
for(re int i = head[u]; i; i = e[i].nxt) {
int v = e[i].v; if(v == fa || vis[v]) continue;
dis[v] = dis[u] + e[i].w; get_dis(v,u);
}
} void calc(int u,int w) {
cnt = ; get_dis(u,);
up(i,,cnt) {
up(j,,cnt) {
if(i != j)
ans[cdis[i] + cdis[j]] += w;
}
}
} void solve(int u) {
vis[u] = ; dis[u] = ; calc(u,);
for(re int i = head[u]; i; i = e[i].nxt) {
int v = e[i].v; if(vis[v]) continue;
dis[v] = e[i].w; calc(v,-);
Tsize = size[v]; rt = ;
get_rt(v,); solve(rt);
}
} int main() {
in(n); in(m); int x,y,w;
up(i,,n-) {
in(x); in(y); in(w);
add(x,y,w); add(y,x,w);
}
Tsize = n,f[] = n+,rt = ;
get_rt(,); solve(rt);
int k;
up(i,,m) {
in(k);
if(ans[k]) printf("AYE\n");
else printf("NAY\n");
}
return ;
}
然后我用了二分
#include <bits/stdc++.h>
#define up(i,l,r) for(register int i = (l); i <= (r); ++i)
#define dn(i,l,r) for(register int i = (l); i >= (r); --i)
#define ll long long
#define re register
using namespace std; template <typename T> void in(T &x) {
x = ; T f = ; char ch = getchar();
while(!isdigit(ch)) {if(ch == '-') f = -; ch = getchar();}
while( isdigit(ch)) {x = * x + ch - ; ch = getchar();}
x *= f;
} template <typename T> void out(T x) {
if(x < ) x = -x , putchar('-');
if(x > ) out(x/);
putchar(x% + );
}
//--------------------------------------------------------- const int N = ; int n,m; struct edge {
int v,w,nxt;
}e[N<<]; int tot,head[N]; void add(int u,int v,int w) {
e[++tot].v = v; e[tot].w = w; e[tot].nxt = head[u]; head[u] = tot;
} int Tsize,f[N],rt;
int size[N];
bool vis[N]; void get_rt(int u,int fa) {
size[u] = ; f[u] = ;
for(re int i = head[u];i ;i = e[i].nxt) {
int v = e[i].v; if(v == fa || vis[v]) continue;
get_rt(v,u);
size[u] += size[v]; f[u] = max(f[u],size[v]);
}
f[u] = max(f[u],Tsize - size[u]);
if(f[u] < f[rt]) rt = u;
} int dis[N];
int cnt;
int belong; struct cur {
int dis,bl;
bool operator < (const cur &x) const {
return dis < x.dis;
}
}c[N]; void get_dis(int u,int fa) {
c[++cnt] = (cur){dis[u],belong};
for(re int i = head[u]; i; i = e[i].nxt) {
int v = e[i].v; if(v == fa || vis[v]) continue;
dis[v] = dis[u] + e[i].w; get_dis(v,u);
}
} int binary(int x) {
int l = ,r = cnt; int res = ;
while(l <= r) {
int mid = (l+r)>>;
if(x <= c[mid].dis) res = mid,r = mid - ;
else l = mid + ;
}
return res;
} bool test[];
int flag;
int k[]; void calc(int u) {
cnt = ; for(re int i = head[u];i;i = e[i].nxt) {
int v = e[i].v; if(vis[v]) continue;
dis[v] = e[i].w; belong = v; get_dis(v,u);
} c[++cnt] = (cur){,};//自己也算一个; sort(c+,c+cnt+); up(i,,m) {
up(j,,cnt) {
if(flag == ) return;
if(test[i]) break;
int r = binary(k[i]-c[j].dis);
if(c[j].bl != c[r].bl && c[j].dis + c[r].dis == k[i]) {
test[i] = ; flag -= i; break;
}
}
}
} void solve(int u) {
if(flag == ) return;
vis[u] = ; dis[u] = ;
calc(u);
for(re int i = head[u]; i; i = e[i].nxt) {
int v = e[i].v; if(vis[v]) continue;
Tsize = size[v]; rt = ;
get_rt(v,); solve(rt);
}
} int main() {
in(n); in(m); int x,y,w; up(i,,n-) {
in(x); in(y); in(w);
add(x,y,w); add(y,x,w);
}
up(i,,m) in(k[i]); flag = (m*(m+))/; Tsize = n,f[] = n+,rt = ;
get_rt(,); solve(rt); up(i,,m) {
if(test[i]) printf("AYE\n");
else printf("NAY\n");
} return ;
}
虽然还可以更快,但我不想打了
P3806 【模板】点分治1的更多相关文章
- [洛谷P3806] [模板] 点分治1
洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...
- 洛谷 P4721 【模板】分治 FFT 解题报告
P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...
- luoguP4721 【模板】分治 FFT
P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...
- LG4721 【模板】分治 FFT
P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 $n-1$ 的数组 $g[1],g[2],..,g[n-1]$,求 $f[0],f[1],..,f[n-1]$ ...
- 模板·点分治(luogu P3806)
[模板]洛谷·点分治 1.求树的重心 树的重心:若A点的子树中最大的子树的size[] 最小时,A为该树的中心 步骤: 所需变量:siz[x] 表示 x 的子树大小(含自己),msz[x] 表示 其子 ...
- 【洛谷4721】【模板】分治FFT(CDQ分治_NTT)
题目: 洛谷 4721 分析: 我觉得这个 "分治 FFT " 不能算一种特殊的 FFT ,只是 CDQ 分治里套了个用 FFT (或 NTT)计算的过程,二者是并列关系而不是偏正 ...
- 洛谷 P3806 (点分治)
题目:https://www.luogu.org/problem/P3806 题意:一棵树,下面有q个询问,问是否有距离为k的点对 思路:牵扯到树上路径的题都是一般都是点分治,我们可以算出所有的路径长 ...
- [模板] CDQ分治&&BZOJ3262:陌上花开
简介 CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\). 它可以用来顶替一些高级(log)数据结构等. 一般地, CDQ分治 ...
- P4721【模板】分治 FFT
瞎扯 虽然说是FFT但是还是写了一发NTT(笑) 然后忘了IDFT之后要除个n懵逼了好久 以及递归的时候忘了边界无限RE 思路 朴素算法 分治FFT 考虑到题目要求求这样的一个式子 \[ F_x=\S ...
- P4721 【模板】分治 FFT
其实是分治ntt,因为fft会爆精度,真*裸题 分治过程和fft的一模一样,主要就是ntt精度高,用原根来代替fft中的\(w_n^k\) 1.定义:设m>1,(a,m)==1,满足\(a^r= ...
随机推荐
- UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转
Android的基本控件和图形有限,难以满足所有的实际需要和设计需求,好在Android给出了相对完善的图形绘制和自定义控件的API,利用这些API,可以基本满足设计的需求. 自定义图像和控件的方法: ...
- 【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6
解决办法: Option >Debugger >Download>勾选 Use flash loader 即可,后续取消勾也不再出现报错!
- Oracle 11gR2 客户端windows 10安装后PL/SQL配置
操作系统:windows 10 软件:Oracle 11gR2 客户端 (64 bit) PLSQL Developer 13 (64 bit) 注意:PLSQL与oracle客户端版本要一致 1. ...
- .net 语音,视频等格式转换
最近在做微信公众号开发的时候遇到一个问题,就是微信接收到语音消息的格式为amr,在网页上通常不能直接播放,需要先转为mp3,于是找到了一个办法,使用ffmpeg.exe,网上可以搜一下ffmpeg.e ...
- 多功能网页刷新工具,刷pv工具
多功能网页刷新工具,刷pv工具,在线刷流量,刷PV,刷UV小牛刷新助手功能介绍:1.设置多个刷新网页地址.2.设置刷新时间3.开始工作4.其他操作:老板键:打开时自动刷新:置系统托盘5.可手动输入地址 ...
- spring boot + apache camel 传输文件
一 sftp搭建略 这里简单说一下为什么使用sftp.ftp和sftp各有优点,差别并不是太大.sftp安全性好,性能比ftp低.ftp对于java来说并不复杂,效率也高.之所以使用sftp主要是可以 ...
- 大数据学习笔记4 - Hadoop的优化与发展(Hadoop 2.0)
前面介绍了Hadoop核心组件HDFS和MapReduce,Hadoop发展之初在架构设计和应用性能方面仍然存在不足,Hadoop的优化与发展一方面体现在两个核心组件的架构设计改进,一方面体现在Had ...
- paloalto防火墙的优势
1.所有 Palo Alto Networks 防火墙提供一个可用于执行防火墙管理功能的带外管理端口 (MGT).通过使用该 MGT 端口,可以将防火墙的管理功能与数据处理功能分开,从而保护对防火墙的 ...
- grid布局
display: grid; //行 //每一行中有几块,每块所占的width的百分比(1) grid-template-columns: 70% 30%; //每个div的width 100px,自 ...
- SQL Server数据库中的系统数据库?
SQL Server的系统数据库分为:master,model,msdb和tempdb 1.Master数据库 Master数据库记录SQL Server系统的所有系统级别信息(表sysobjects ...