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= ...
随机推荐
- Jenkins问题笔记
1.启动docker容器权限不足 通过如下命令启动docker容器后,使用命令"docker logs -f jenkins"查看jenkins容器日志, docker run - ...
- 注意UTF-8-BOM 这个编码格式
有时候文本文件处理出现异常,找不到其他原因的时候,注意查看下文件的编码: Notepad:编码菜单 如果发现是UTF-8-BOM,需要改成UTF-8
- python视频学习笔记2(if)
一.if语句1.比较运算符,if语句语法 # 1. 输入用户年龄# 2. 判断是否满 18 岁 (**>=**)# 3. 如果满 18 岁,允许进网吧嗨皮# 4. 如果未满 18 岁,提示回家写 ...
- redis多实例和高可用
实验:多实例节点 10.220.5.65(三个实例) 高可用节点:10.220.5.67 创建目录,将三个实例文件都放在这个目录中 [root@ ~]# yum install redis -y [r ...
- echarts 技巧自己的一些记录
1.不要输出 window["echarts"].init(chart) ,会卡死. let chart = document.getElementById("chart ...
- eclipse打包java项目
参考链接:https://blog.csdn.net/heshushun/article/details/78039801
- js判断访问浏览器是安卓还是ios还是微信浏览器还是微博
var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.indexOf('Android') > - ...
- LinkedList使用方法
特有功能 void addFirst(E e);//在索引为0的位置添加指定元素 void addLast(E e);//在索引为size()-1的位置添加指定元素 E getFirst() 获取索引 ...
- 解决git中upstream丢失问题Your branch is based on 'origin/xxxx', but the upstream is gone.
转自 https://blog.csdn.net/limengke123/article/details/77850134
- FPGA-VHDL课堂学习笔记*01
FPGA-VHDL课堂学习笔记 记录说明:本文档主要记录大学期间,老师FPGA授课课堂笔记. 代码语言:VHDL 编程软件:MAX+plus II FPGA硬件:FLE-843 03月05日 理论课 ...