洛谷P4149 [IOI2011]Race

点分治作用(目前只知道这个):

求一棵树上满足条件的节点二元组(u,v)个数,比较典型的是求dis(u,v)(dis表示距离)满足条件的(u,v)个数。

算了自己懒得写了,安利几个blog吧:

https://www.cnblogs.com/LadyLex/p/8006488.html

https://blog.csdn.net/qq_39553725/article/details/77542223

https://blog.csdn.net/zzkksunboy/article/details/70244945

#include<iostream>
#include<cstring>
#include<cstdio>
#define int long long
#define MAXN 200010
#define INF 100000000
using namespace std;
struct edge
{
int u,v,w,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define w(x) ed[x].w
#define n(x) ed[x].nxt
}ed[MAXN*2];
int first[MAXN],num_e;
#define f(x) first[x]
int sum,mn,root;
int siz[MAXN],mxsiz[MAXN];
bool v[MAXN];
int n,k;
int ans=INF,t[1000010];
int dis[MAXN],dep[MAXN];
void getroot(int x,int fa)//查找根节点,没什么可说的。
{
siz[x]=1,mxsiz[x]=0;
for(int i=f(x);i;i=n(i))
if(!v[v(i)]&&v(i)!=fa)
{
getroot(v(i),x);
siz[x]+=siz[v(i)];
mxsiz[x]=max(siz[v(i)],mxsiz[x]);
}
mxsiz[x]=max(mxsiz[x],sum-siz[x]);
if(mxsiz[x]<mn)mn=mxsiz[x],root=x;
}
void cal(int x,int fa)//更新答案
{
if(dis[x]<=k)ans=min(ans,dep[x]+t[k-dis[x]]);
for(int i=f(x);i;i=n(i))
if(!v[v(i)]&&v(i)!=fa)
{
dep[v(i)]=dep[x]+1;
dis[v(i)]=dis[x]+w(i);
cal(v(i),x);
}
}
int add(int x,int fa,int flag)//更新桶
{
if(dis[x]<=k)
{
if(flag)t[dis[x]]=min(t[dis[x]],dep[x]);
else t[dis[x]]=INF;
}
for(int i=f(x);i;i=n(i))
if(v(i)!=fa&&!v[v(i)])
add(v(i),x,flag);
}
void divide(int x)
{
v[x]=1;t[0]=0;
for(int i=f(x);i;i=n(i))
if(!v[v(i)])
{
dep[v(i)]=1,dis[v(i)]=w(i);
cal(v(i),0);//先用这个儿子更新答案,因为更新答案时要用到之前的儿子的信息,有点类似树p。
add(v(i),0,1);//先用这个儿子更新答案,再将这个儿子合并,确保不会出错。
}
for(int i=f(x);i;i=n(i))
if(!v[v(i)])
add(v(i),0,0);//清空桶。
for(int i=f(x);i;i=n(i))
if(!v[v(i)])
{
sum=siz[v(i)],mn=INF;
getroot(v(i),0);
divide(root);//分治树递归。
}
}
inline void adde(int u,int v,int w);
signed main()
{
// freopen("in.txt","r",stdin);
// freopen("1.in","r",stdin); scanf("%lld%lld",&n,&k);
int u,v,w;
for(int i=1;i<n;i++)
{
scanf("%lld%lld%lld",&u,&v,&w);
u++,v++;
adde(u,v,w),adde(v,u,w);
}
memset(t,0x7f,sizeof(t));
sum=n,mn=INF;
getroot(1,0);
divide(root);
if(ans==INF)puts("-1");
else printf("%lld\n",ans);
}
inline void adde(int u,int v,int w)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
w(num_e)=w;
n(num_e)=f(u);
f(u)=num_e;
}

模板—点分治B(合并子树)(洛谷P4149 [IOI2011]Race)的更多相关文章

  1. 洛谷P4149 [IOI2011]Race(点分治)

    题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK ,且边的数量最小. 输入输出格式 输入格式:   第一行:两个整数 n,kn,k . 第二至 nn 行:每行三个整数,表示一条无向边的 ...

  2. 洛谷$P4149\ [IOI2011]\ Race$ 点分治

    正解:点分治 解题报告: 传送门$QwQ$ 昂先不考虑关于那个长度的限制考虑怎么做? 就开个桶,记录所有边的取值,每次加入边的时候查下是否可行就成$QwQ$ 然后现在考虑加入这个长度的限制?就考虑把这 ...

  3. [洛谷P4149][IOI2011]Race

    题目大意:给一棵树,每条边有边权.求一条简单路径,权值和等于$K$,且边的数量最小. 题解:点分治,考虑到这是最小值,不满足可减性,于是点分中的更新答案的地方计算重复的部分要做更改,就用一个数组记录前 ...

  4. 洛谷 P4149 [IOI2011]Race-树分治(点分治,不容斥版)+读入挂-树上求一条路径,权值和等于 K,且边的数量最小

    P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行 ...

  5. 洛谷 4149 [IOI2011]Race——点分治

    题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之 ...

  6. 最短路(模板)【CodeChef CLIQUED,洛谷P3371】

    自TG滚粗后咕咕咕了这么久,最近重新开始学OI,也会慢慢开始更博了.... 最短路算法经典的就是SPFA(Bellman-Ford),Dijkstra,Floyd: 本期先讲两个经典的单源最短路算法: ...

  7. 洛谷 P4149 [ IOI 2011 ] Race —— 点分治

    题目:https://www.luogu.org/problemnew/show/P4149 仍然是点分治: 不过因为是取 min ,所以不能用容斥,那么子树之间就必须分开算,记录桶时注意这个: 每次 ...

  8. LCT模板(学习笔记)(洛谷3690)(加边,删边,修改点权)

    最近学习了一波LCT qwq 强势安利Flashhu的博客!!!!! 真的特别详细(可惜我不会弄链接) 如果有想要学习\(LCT\)的同学,可以直接看他的博客 我这里就简单写一点自己的体会啊. \(L ...

  9. (贪心 优先队列)P1090合并果子 洛谷

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

随机推荐

  1. JEECMS二次开发 -------标签使用说明

    转载:https://blog.csdn.net/u012176984/article/details/45501771 一:标签套用结构说明 登录后台管理页面,这些嵌套在html中的标签 以[@标签 ...

  2. ROWID的使用——快速删除重复的记录

    ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置.ROWID可以分为物理rowid和逻辑rowid两种.普通的表中的rowid是物理rowid,索引组织表(I ...

  3. Linux监听的网络服务$ netstat -ntlp$ netstat -nulp$ netstat -nxlp

    我一般都分开运行这三个命令,不想一下子看到列出一大堆所有的服务.netstat -nalp倒也可以.不过我绝不会用 numeric 选项 (鄙人一点浅薄的看法:IP 地址看起来更方便). 找到所有正在 ...

  4. 如何解决Firefox浏览器地址栏中文搜索速度很慢

    一.插件安装 之前使用Chrome浏览器,习惯在地址栏中直接进行中文搜索.转到Firefox之后,突然发现在地址栏进行中文搜索,访问速度会很慢. 可以使用插件解决这个问题:Omnibar 插件地址:h ...

  5. 软工作业———Alpha版本第二周小结

    姓名 学号 周前计划安排 每周实际工作记录 自我打分 zxl 061425 1.进行任务分配2.实现扫码和生成二维码功能 1.对主要任务进行了划分,但还为进行给模块间的联系2.完成了扫码签到功能 90 ...

  6. Katalon系列十九:元素相同或无法定位时的定位技巧

    经常看到有人问元素属性都相同,怎么定位,这里总结一下.下面以Xpath为例讲解,CSS其实也是一样的,只是语法不一样罢了.网上说CSS会比Xpath快一些,但在Katalon主用Xpath,感觉也还行 ...

  7. 【水滴石穿】react-native-video-project

    感觉这个是很有才华的博主,毕竟是可以在npm 包里面留后门的程序员 博主的gihtub关于这个项目的地址是:https://github.com/ikimiler/react-native-video ...

  8. 关于 SSD 的接口和相关名词(2019-09-10)

    关于 SSD 的接口和相关名词 了解了很多天的 SSD,太多的名词. 先记录一下. SATA MSATA M2 NVME NGFF U2 TODO: 后续收集相关信息.

  9. CF772E Verifying Kingdom

    CF772E Verifying Kingdom 有趣的交互题(交互题都挺有意思的) %ywy 增量法构造 考虑加入了前i个叶子 那么树是前i个叶子构成的虚树! 最后n个叶子构成的虚树就是答案! 怎样 ...

  10. LeetCode172 Factorial Trailing Zeroes. LeetCode258 Add Digits. LeetCode268 Missing Number

    数学题 172. Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. N ...