bzoj 2599 数分治 点剖分
具体可以见漆子超的论文
- /**************************************************************
- Problem:
- User: BLADEVIL
- Language: Pascal
- Result: Accepted
- Time: ms
- Memory: kb
- ****************************************************************/
- //By BLADEVIL
- var
- n, m :longint;
- pre, other, len :array[..] of longint;
- last :array[..] of longint;
- l, top :longint;
- size, stack, yy, ll :array[..] of longint;
- ff :array[..] of boolean;
- root :longint;
- b :array[..] of longint;
- old :longint;
- ans :longint;
- procedure connect(x,y,z:longint);
- begin
- inc(l);
- pre[l]:=last[x];
- last[x]:=l;
- other[l]:=y;
- len[l]:=z;
- end;
- procedure dfs_size(x,fa:longint);
- var
- q, p :longint;
- begin
- size[x]:=;
- inc(top);
- stack[top]:=x;
- q:=last[x];
- while q<> do
- begin
- p:=other[q];
- if (ff[q]) or (p=fa) then
- begin
- q:=pre[q];
- continue;
- end;
- dfs_size(p,x);
- inc(size[x],size[p]);
- q:=pre[q];
- end;
- yy[x]:=fa;
- end;
- procedure getroot(u:longint);
- var
- ms, s, x, p, q :longint;
- i :longint;
- begin
- top:=;
- dfs_size(u,);
- ms:=maxlongint;
- for i:= to top do
- begin
- x:=stack[i];
- s:=size[u]-size[x];
- q:=last[x];
- while q<> do
- begin
- p:=other[q];
- if (ff[q]) or (p=yy[x]) then
- begin
- q:=pre[q];
- continue;
- end;
- if size[p]>s then s:=size[p];
- q:=pre[q];
- end;
- if s<ms then
- begin
- ms:=s;
- root:=x;
- end;
- end;
- end;
- procedure dfs_value(x,fa,lz,dep:longint);
- var
- q, p :longint;
- begin
- if lz>m then exit;
- if dep>=ans then exit;
- if b[m-lz]>= then
- if b[m-lz]+dep<ans then ans:=b[m-lz]+dep;
- if (b[lz]<) or (dep<b[lz]) then
- begin
- inc(top);
- stack[top]:=lz;
- ll[top]:=dep;
- end;
- q:=last[x];
- while q<> do
- begin
- p:=other[q];
- if (p=fa) or (ff[q]) then
- begin
- q:=pre[q];
- continue;
- end;
- dfs_value(p,x,lz+len[q],dep+);
- q:=pre[q];
- end;
- end;
- procedure solve(u:longint);
- var
- i, q, p :longint;
- begin
- getroot(u);
- if top= then exit;
- top:=;
- q:=last[root];
- while q<> do
- begin
- p:=other[q];
- if ff[q] then
- begin
- q:=pre[q];
- continue;
- end;
- old:=top+;
- dfs_value(p,root,len[q],);
- for i:=old to top do
- if (b[stack[i]]<) or (b[stack[i]]>ll[i]) then b[stack[i]]:=ll[i];
- q:=pre[q];
- end;
- for i:= to top do b[stack[i]]:=-;
- q:=last[root];
- while q<> do
- begin
- p:=other[q];
- if ff[q] then
- begin
- q:=pre[q];
- continue;
- end;
- ff[q]:=true;
- ff[q xor ]:=true;
- solve(p);
- q:=pre[q];
- end;
- end;
- procedure main;
- var
- i :longint;
- x, y, z :longint;
- begin
- read(n,m);
- l:=;
- fillchar(b,sizeof(b),$ff);
- b[]:=;
- for i:= to n- do
- begin
- read(x,y,z);
- inc(x); inc(y);
- connect(x,y,z);
- connect(y,x,z);
- end;
- ans:=maxlongint;
- solve();
- if ans> then writeln(-) else writeln(ans);
- end;
- begin
- main;
- end.
bzoj 2599 数分治 点剖分的更多相关文章
- bzoj 2599(点分治)
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 3642 Solved: 1081[Submit][Statu ...
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- BZOJ 2599: [IOI2011]Race( 点分治 )
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...
- bzoj 2599 [IOI2011]Race (点分治)
[题意] 问树中长为k的路径中包含边数最少的路径所包含的边数. [思路] 统计经过根的路径.假设当前枚举到根的第S个子树,若x属于S子树,则有: ans<-dep[x]+min{ dep[y] ...
- BZOJ 2599 [IOI2011]Race【Tree,点分治】
给出N(1 <= N <= 200000)个结点的树,求长度等于K(1 <= K <= 1000000)的路径的最小边数. 点分治,这道题目和POJ 2114很接近,2114是 ...
- 【BZOJ 2599】【IOI 2011】Race 点分治
裸的点分治,然而我因为循环赋值$s$时把$i <= k$写成$i <= n$了,WA了好长时间 #include<cstdio> #include<cstring> ...
- BZOJ 2599 Race(树分治)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2599 题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 题意:每次 ...
- bzoj 2599: [IOI2011]Race (点分治 本地过了就是过了.jpg)
题面:(复制别人的...) Description 给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的 ...
- bzoj 2599: [IOI2011]Race【点分治】
点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m-dis[p]]+de[p]) 这里注意更新和初 ...
随机推荐
- [Java]_函数传参的疑惑与思考
问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs. void dfs(TreeNode node , int sum , ArrayList& ...
- 分析MapReduce执行过程
分析MapReduce执行过程 MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出. Reducer任务会接收Mapper任务输 ...
- mysql事件调度器定时删除binlog
MySQL5.1.6起Mysql增加了事件调度器(Event Scheduler),可以用做定时执行某些特定任务,来取代原先只能由Linux操作系统的计划任务来执行的工作MySQL的事件调度器可以精确 ...
- Delphi For Android 开发笔记 2 NEXTGEN下的字符串类型
delphi开发速度迅捷至少有30%(猜的,呵呵)的原因是因为其字符串(string.WideString.PChar.PAnsiChar等)处理能力. 而从delphi XE4开始,在system等 ...
- java基础笔记
1. 成员变量会自动的进行初始化,但是局部变量不会: 2. equals传引用值,==传地址值:当一个对象是引用类型时,就必须使用equals进行比较. 3. 继承:实现代码的复用,继承关系以一种验证 ...
- openstack做镜像
virt-install --virt-type kvm --name windows2008 --ram 1024 --cdrom /opt/windows-2008-x86_64.iso --di ...
- python 校招信息爬虫程序
发现一个爬虫程序,正在学习中: https://github.com/lizherui/spider_python
- Unix 编程
1. Users and Groups 真实用户ID和真实组ID 真实用户ID和组ID表示运行进程的真实用户 ID 和 组ID. 有效用户ID和有效组IDp 有效 ID 是进程进行相关操作(比如系统调 ...
- 常用的PC/SC接口函数
PC/SC规范是一个基于WINDOWS平台的一个标准用户接口(API),提供了一个从个人电脑(Personal Computer)到智能卡(SmartCard)的整合环境,PC/SC规范建立在工业标准 ...
- android开发系列之gradle认识
后面的系列博客,我将会写一写自己这段时间对于android的学习.认识.体会,希望能够与大家分享. 相信大家从ADT开发切换到android studio最大.最直观的变化就是gradle,因为在an ...