传送门

点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了。

当然,你也可以选择黄学长的奇淫优化

 //BZOJ 2599
 //by Cydiater
 //2016.9.23
 #include <iostream>
 #include <cstring>
 #include <string>
 #include <algorithm>
 #include <queue>
 #include <map>
 #include <ctime>
 #include <cmath>
 #include <cstdio>
 #include <cstdlib>
 #include <iomanip>
 using namespace std;
 #define ll long long
 #define up(i,j,n)        for(int i=j;i<=n;i++)
 #define down(i,j,n)        for(int i=j;i>=n;i--)
 ;
 const int oo=0x3f3f3f3f;
 inline int read(){
     ,f=;
     ;ch=getchar();}
     +ch-';ch=getchar();}
     return x*f;
 }
 ,N,K,sum,LINK[MAXN],dis[MAXN],eum[MAXN],root=,siz[MAXN],Count[MAXN],head,tail,f[MAXN];
 bool vis[MAXN];
 struct edge{
     int y,next,v;
 }e[MAXN];
 struct Queue{
     int v,id;
 }q[MAXN];
 namespace solution{
     inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;}
     inline bool cmp(Queue x,Queue y){return x.v<y.v;}
     void init(){
         N=read();K=read();
         memset(vis,,sizeof(vis));
         up(i,,N){
             ,y=read()+,v=read();
             insert(x,y,v);
             insert(y,x,v);
         }
     }
     void make_root(int node,int fa){
         siz[node]=;;
         for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]&&e[i].y!=fa){
             make_root(e[i].y,node);
             siz[node]+=siz[e[i].y];
             f[e[i].y]=node;
             )ff=;
         }
         )ff=;
         if(ff)root=node;
     }
     void get_deep(int node,int fa){
         q[++tail].v=dis[node];q[tail].id=node;
         for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]&&e[i].y!=fa){
             f[e[i].y]=node;
             dis[e[i].y]=dis[node]+e[i].v;
             eum[e[i].y]=eum[node]+;
             get_deep(e[i].y,node);
         }
     }
     void col(int node,int dist,int flag){
         dis[node]=dist;head=;tail=;
         eum[node]=flag==-?:;
         get_deep(node,);
         sort(q+,q+tail+,cmp);
         while(head<tail){
             while(head<tail&&q[head].v+q[tail].v>K)tail--;
             int tmp=tail;
             while(head<tmp&&q[tmp].v+q[head].v==K){
                 int x=q[tmp].id,y=q[head].id;
                 Count[eum[x]+eum[y]]+=flag;
                 tmp--;
             }
             head++;
         }
     }
     void work(int node){
         col(node,,);
         vis[node]=;siz[f[root]]=sum-siz[root];f[root]=;
         );
         for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]){
             root=;sum=siz[e[i].y];
             make_root(e[i].y,node);
             work(root);
         }
     }
     void slove(){
         sum=N;root=;
         make_root(,);
         work(root);
     }
     void output(){
         up(i,,N)if(Count[i]){
             printf("%d\n",i);
             return;
         }
         puts("-1");
     }
 }
 int main(){
     //freopen("input.in","r",stdin);
     using namespace solution;
     init();
     slove();
     output();
     ;
 }

BZOJ2599 [IOI2011]Race的更多相关文章

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

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

  2. bzoj1758 [Wc2010]重建计划 & bzoj2599 [IOI2011]Race

    两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调 ...

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

    写了四五道点分治的题目了,算是比较理解点分治是什么东西了吧= = 点分治主要用来解决点对之间的问题的,比如距离为不大于K的点有多少对. 这道题要求距离等于K的点对中连接两点的最小边数. 那么其实道理是 ...

  4. BZOJ2599——[IOI2011]Race

    0.题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 1.分析:水题一道,一波树分治就好 我们可以发现这个题的K是比较小的,才100w,那么我们可以树分治一下,在遍历每一棵子树的 ...

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

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

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

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

  7. bzoj千题计划160:bzoj2599: [IOI2011]Race

    http://www.lydsy.com/JudgeOnline/problem.php?id=2599 点分治 mi[i] 记录边权和为i时的最少边数 先更新答案,再更新mi数组,换根时清空mi # ...

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

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

  9. 【点分治】【哈希表】bzoj2599 [IOI2011]Race

    给nlog2n随便过的跪了,不得已弄了个哈希表伪装成nlogn(当然随便卡,好孩子不要学)…… 不过为啥哈希表的大小开小点就RE啊……?必须得超过数据范围一大截才行……谜 #include<cs ...

随机推荐

  1. Orchard搜索与索引

    Orchard提供了索引与搜索的功能.开启Indexing属性可实现索引功能,伴随着一个特定的索引执行(默认包含基础搜索引擎).除了Indexing和Search提供查询索引的功能外(通过关键字或使用 ...

  2. 将IList转换为List

     简单点说,IList<T>直接转换为List<T>可以不用考虑.IList<T>可以用至少2种方式简单的复制成List<T>:1.IList<T ...

  3. matlab画图形函数 semilogx

    matlab画图形函数 semilogx loglog 主要是学习semilogx函数,其中常用的是semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数.loglog是x y轴都取 ...

  4. JavaScript学习笔记- 正则表达式常用字符集及方法

    正则表达式修饰符(修饰符 可以在全局搜索中不区分大小写) i(ignoreCase)执行对大小写不敏感的匹配 g (global)     执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) m( ...

  5. 当在XP系统上无法安装Mysql ODBC时,怎么办?

    system32下面缺失如下连接中的dll http://www.33lc.com/soft/19950.html 这个dll名为: msvcr100.dll 本来安装过程中会出现Error 1918 ...

  6. 屠龙之路_大杀技之倚天屠龙_TenthDay

    惊天变! alhpa恶龙终于现身了!随之出现是屠龙天团的少年们多时不见的公主.alpha恶龙虽然元气大伤.意识不清,但是它庞大的身躯只要稍微动弹,足以重创在场的所有少年,以及现在还被恶龙牢牢囚在手心的 ...

  7. JNI系列——PassData

    1.在工程目录下创建xxx.jni包并在该包下创建JNI类 2.在JNI类中声明所有的本地方法,并加载库 3.在MainActivity类中实例化JNI对象,并调用其方法 4.通过Javah生成的方法 ...

  8. 基于tiny4412原生uboot修改制作SD启动并烧写到emmc

    最近入手tiny4412的标准板,底板SDK型号为1506.但是因为友善之臂提供的superboot不能进入boot菜单,此时我就不能通过tftp下载内核和通过nfs挂载根文件系统,于是想自己做个ub ...

  9. HTML5存储

    Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的.Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外co ...

  10. 在Winform中播放视频等【DotNet,C#】

    在项目中遇到过这样的问题,就是如何在Winform中播放视频.当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单:第二种是利用DirectX直接在窗体或者控件 ...