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= ...
随机推荐
- css样式的书写顺序及原理——很重要!
记得刚开始学习前端的时候,每次写css样式都是用到什么就在样式表后添加什么,完全没有考虑到样式属性的书写顺序对网页加载代码的影响.后来逐渐才知道正确的样式顺序不仅易于查看,并且也属于css样式优化的一 ...
- python杂记二
1. 写文件可以直接使用print函数 file_name = open("file_name.txt","w") print("file conta ...
- 用word发CSDN blog,免去插图片的烦恼
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- select 选择列表传值问题
<select> <option value ="volvo">Volvo</option> <option value ="s ...
- mysql访问视图提示:找不到视图
原因: 1.不存在 2.视图区分大小写(有的不区分) 3.权限问题
- day48 前端高级选择器优先级
复习 1. 基础选择器 标签选择器(div) | 类选择器(.div1) | id选择器(#div2) <div class="div1" id="div2&quo ...
- jemter聚合报告参数指标
1.聚合报告指标含义 2.性能指标的名称与含义 1)并发: 所有用户在同一时刻对系统执行操作,一般指做同一件事情或操作.2)在线: 所有用户在一段时间内对系统执行操作.3) ...
- 用python计算圆周率Π
一.要求: 1.计算到圆周率后面越多位越好. 2.用进度条显示计算的进度. 3.要求给出圆周率Π的具体计算方法和解释. 二.算法: 1.拉马努金公式: 2.高斯-勒让德公式: 设置初始值: 反复执行以 ...
- Junit集成测试
Spring4.x高级话题(七):Spring的测试 一. 点睛 测试是开发工作中不可缺少的部分,单元测试只针对当前开发的类和方法进行测试,可以简单通过模拟依赖来实现,对运行环境没有依赖:但是仅仅单元 ...
- Linux使用yum安装JDK
安装jdk8 检查系统是否自带open-jdk输入命令: #rpm -qa|grep java #rpm -qa|grep jdk 如果没有输入信息表示没有安装,如果安装可以输入命令:#rpm -qa ...