写了四五道点分治的题目了,算是比较理解点分治是什么东西了吧= =

点分治主要用来解决点对之间的问题的,比如距离为不大于K的点有多少对。

这道题要求距离等于K的点对中连接两点的最小边数。

那么其实道理是一样的。先找重心,然后先从重心开始求距离dis和边数num,更新ans,再从重心的儿子开始求得dis和num,减去这部分答案

因为这部分的答案中,从重心开始的两条链有重叠部分,所以要剪掉

基本算是模板题,但是减去儿子的答案的那部分还有双指针那里调了好久,所以还不算特别熟练。。

PS跑了27秒慢到飞起,不过代码短一点,看起来比较清晰

 #include<stdio.h>
 #include<string.h>
 #include<algorithm>
 #define INF 0x3f3f3f3f
 using namespace std;
 ;
 struct node{
     int to,next,cost;
 }e[maxn*];
 struct data{
     int l,e;
 }dis[maxn];
 ];

 void insert(int u, int v, int w){
     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot; e[tot].cost=w;
 }

 void getroot(int u, int f){
     ; size[u]=;
     for (int i=head[u],v; i; i=e[i].next){
         if (vis[v=e[i].to] || v==f) continue;
         getroot(v,u);
         size[u]+=size[v];
         mx=max(mx,size[v]);
     }
     mx=max(mx,total-size[u]);
     if (mx<sz) sz=mx,root=u;
 }

 void getdis(int u, int f, int len, int num){
     dis[++p].l=len; dis[p].e=num;
     for (int i=head[u],v; i; i=e[i].next){
         if (vis[v=e[i].to] || v==f) continue;
         getdis(v,u,len+e[i].cost,num+);
     }
 }

 bool cmp(data a, data b){
     if (a.l==b.l) return a.e<b.e; return a.l<b.l;  /////
 }

 void count(int u, int len, int num, int f){
     p=; getdis(u,,len,num); //这里要将len和num传下去。。
     ,r=p;
     sort(dis+,dis++p,cmp);
     while (l<=r){  //注意这里要用<=,WA了几发
         while (l<r && dis[l].l+dis[r].l>K) r--;
         for (int k=r; dis[l].l+dis[k].l==K; k--) ans[dis[l].e+dis[k].e]+=f;
         l++;
     }
 }

 void work(int u){
     total=size[u]?size[u]:n;
     sz=INF;
     getroot(u,); u=root;
     vis[u]=; count(u,,,);
     for (int i=head[u],v; i; i=e[i].next){
         if (vis[v=e[i].to]) continue;
         count(v,e[i].cost,,-);
         work(v);
     }
 }

 int main(){
     scanf("%d%d", &n, &K);
     ,u,v,w; i<n; i++) scanf("%d%d%d", &u, &v, &w),u++,v++,insert(u,v,w),insert(v,u,w);
     work();
     ; i<n; i++) ;} puts("-1");
     ;
 } 

bzoj2599: [IOI2011]Race(点分治)的更多相关文章

  1. [bzoj2599][IOI2011]Race——点分治

    Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所 ...

  2. BZOJ2599:[IOI2011]Race(点分治)

    Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...

  3. 【BZOJ-2599】Race 点分治

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBSubmit: 2590  Solved: 769[Submit][Status ...

  4. BZOJ 2599: [IOI2011]Race( 点分治 )

    数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...

  5. [IOI2011]Race 点分治

    [IOI2011]Race LG传送门 点分治板子题. 直接点分治统计,统计的时候开个桶维护下就好了. 注(tiao)意(le)细(hen)节(jiu). #include<cstdio> ...

  6. [luogu4149][bzoj2599][IOI2011]Race【点分治】

    题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 K,且边的数量最小. 题解 比较明显需要用到点分治,我们定义\(d\)数组表示当前节点到根节点\(rt\)之间有多少个节点,也可以表示有多少 ...

  7. bzoj2599/luogu4149 [IOI2011]Race (点分治)

    点分治.WA了一万年. 重点就是统计答案的方法 做法一(洛谷AC bzojWA 自测WA): 做点x时记到x距离为k的边数最小值为dis[k],然后对每一对有值的dis[i]和dis[K-i],给an ...

  8. 2019.01.09 bzoj2599: [IOI2011]Race(点分治)

    传送门 题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 思路: 考虑点分治如何合并. 我们利用树形dpdpdp求树的直径的方法,边dfsdfsdfs子树边统计答案即可. 代码: ...

  9. BZOJ2599 [IOI2011]Race 【点分治】

    题目 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 输入格式 第一行 两个整数 n, k 第二..n行 每行三个整 ...

随机推荐

  1. swift项目导入OC框架

    手动导入框架步骤: 1.将框架拖入项目 2.新建桥接文件 3.build setting->bridge  添加桥接文件路径,相对项目而言

  2. LeetCode 359 Logger Rate Limiter

    Problem: Design a logger system that receive stream of messages along with its timestamps, each mess ...

  3. VMWare虚拟机实例拷贝到另一台服务器后出现Error in the RPC receive loop: RpcIn: Unable to send.错误的解决

    把一个VMWare虚拟机实例拷贝到另一台服务器后,在事件查看器中的应用程序日志中不断出现Error in the RPC receive loop: RpcIn: Unable to send.错误, ...

  4. python升级

    一开始有这个需求,是因为用 YaH3C 替代 iNode 进行校园网认证时,一直编译错误,提示找不到 Python 的某个模块,百度了一下,此模块是在 Python2.7 以上才有的,但是系统的自带的 ...

  5. 7.iOS Notification

    1. 通知中心认识 通知中心实际上是在程序内部提供了消息广播的一种机制.通知中心不能在进程间进行通信,它只能进行程序内部通信,不能跨应用程序进程通信.通知中心,当通知中心接受到消息后会根据设置,根据内 ...

  6. 【转载】SSM框架整合

    http://blog.csdn.net/gebitan505/article/details/44455235/ 1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于20 ...

  7. 用极简方式实现新浪新版本特性展示效果--view的图片轮播

    在发布版本的时候,大多数软件会在第一次使用新版本时候弹出视图用几张图片给用户做一个新版本特性介绍,最简单如下图新浪的版本特性介绍 由于图片是全屏展示且是左右滑动,大多数情况开发者会选择使用scroll ...

  8. JS多线程(web work)

    JS多线程JS多线程不允许操作DOM 1. 引用Concurrent Thread.js库用法:Concurrent.Thread.Create(function(){};) 2. Web Workh ...

  9. 面向内容的标记语言--markdonw

    引言: 我们习惯用html来展示数据,尤其是结合了js以及css之后,更是让html变得非常的绚丽,可是有些时候在感受绚丽的同时,我们往往对我们本身想要了解的内容变得漠不关心了,其实并不是所有的知识都 ...

  10. Cookie 用法 小记

    //保存cookie Cookie cookieName = new Cookie("name", realUser.getName());                 Coo ...