一道淀粉质的模版题,开始是暴力

 #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的更多相关文章

  1. [洛谷P3806] [模板] 点分治1

    洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...

  2. 洛谷 P4721 【模板】分治 FFT 解题报告

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...

  3. luoguP4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...

  4. LG4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 $n-1$ 的数组 $g[1],g[2],..,g[n-1]$,求 $f[0],f[1],..,f[n-1]$ ...

  5. 模板·点分治(luogu P3806)

    [模板]洛谷·点分治 1.求树的重心 树的重心:若A点的子树中最大的子树的size[] 最小时,A为该树的中心 步骤: 所需变量:siz[x] 表示 x 的子树大小(含自己),msz[x] 表示 其子 ...

  6. 【洛谷4721】【模板】分治FFT(CDQ分治_NTT)

    题目: 洛谷 4721 分析: 我觉得这个 "分治 FFT " 不能算一种特殊的 FFT ,只是 CDQ 分治里套了个用 FFT (或 NTT)计算的过程,二者是并列关系而不是偏正 ...

  7. 洛谷 P3806 (点分治)

    题目:https://www.luogu.org/problem/P3806 题意:一棵树,下面有q个询问,问是否有距离为k的点对 思路:牵扯到树上路径的题都是一般都是点分治,我们可以算出所有的路径长 ...

  8. [模板] CDQ分治&&BZOJ3262:陌上花开

    简介 CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\). 它可以用来顶替一些高级(log)数据结构等. 一般地, CDQ分治 ...

  9. P4721【模板】分治 FFT

    瞎扯 虽然说是FFT但是还是写了一发NTT(笑) 然后忘了IDFT之后要除个n懵逼了好久 以及递归的时候忘了边界无限RE 思路 朴素算法 分治FFT 考虑到题目要求求这样的一个式子 \[ F_x=\S ...

  10. P4721 【模板】分治 FFT

    其实是分治ntt,因为fft会爆精度,真*裸题 分治过程和fft的一模一样,主要就是ntt精度高,用原根来代替fft中的\(w_n^k\) 1.定义:设m>1,(a,m)==1,满足\(a^r= ...

随机推荐

  1. 模拟PLC 的圆弧插补方式在VC中绘制圆弧

    最近同事想让要做一个绘图的控件.VC里面的画弧函数Arc需要提供外接矩形的坐标.同事觉得不好用,他更习惯圆弧插补的那种方式.于是看了看圆弧插补的东西.其实这种画弧方式就是提供圆弧的起点.终点和半径来画 ...

  2. v-for key

    key 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略.如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素 ...

  3. MongoDB主从复制和副本集

    MongoDB有主从复制和副本集两种主从复制模式,主从复制最大的问题就是无法自动故障转移,MongoDB副本集解决了主从模式无法自动故障转义的特点,因此是复制的首选.对于简单的主从复制无法自动故障转移 ...

  4. 【读书笔记】Segment Routing基础

  5. svn仓库迁移

    注意事项 1.仅迁移代码.日志.版本信息,(用户.权限.配置即conf目录需要手动移动或重新配置) 2.新仓库需无代码,即新建仓库后不要进行上传操作,否则迁移可能造成冲突,导致迁移失败 操作步骤 1. ...

  6. ASP.NET结合Redis实现分布式缓存

    最近一个项目ASP.NET+MySQL 有的网页打开初始化的查询需要10秒甚至更久,用户体验极差,而且并发量变大的时候网站容易崩溃 后来想了两种解决方案都不是太满意 1.数据库里建一张缓存表,后台作业 ...

  7. docker学习-常用命令1

    一.容器管理 1.1 Docker start/stop/restart/rm 命令实例:启动|停止|重启|删除 容器mydb01# docker start|stop|restart|rm mydb ...

  8. 【转】使用python实现appium的屏幕滑动

    前些日子写一个滑动手机页面的小脚本,看到大家给的内容都是swipe方法,这里对swipe方法做一个小介绍: Swipe(int start x,int start y,int end x,int y, ...

  9. VS2017 连接Linux

    喜欢测试各种工具. 注意选择 使用C++的Linux开发 ! 配置ssh连接 工具->选项 添加ssh连接. 添加头文件 我的路径是:C:\Program Files (x86)\Microso ...

  10. 20175234 2018-2019-2 《Java程序设计》第八周学习总结

    目录 20175234 2018-2019-2 <Java程序设计>第八周学习总结 教材学习内容总结 15.1泛型 15.2链表 15.3堆栈 15.4散列映射 15.5树集 15.6树映 ...