2019.01.09 bzoj2599: [IOI2011]Race(点分治)
传送门
题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小。
思路:
考虑点分治如何合并。
我们利用树形dpdpdp求树的直径的方法,边dfsdfsdfs子树边统计答案即可。
代码:
#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
typedef pair<int,int> pii;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int N=2e5+5,K=1e6+5,inf=0x3f3f3f3f;
int n,k,siz[N],msiz[N],ans=inf,top=0,rt,all;
bool vis[N];
vector<pii>e[N];
void findroot(int p,int fa){
siz[p]=1,msiz[p]=0;
for(ri i=0,v;i<e[p].size();++i){
if((v=e[p][i].fi)==fa||vis[v])continue;
findroot(v,p),siz[p]+=siz[v],msiz[p]=max(msiz[p],siz[v]);
}
msiz[p]=max(msiz[p],all-siz[p]);
if(msiz[p]<msiz[rt])rt=p;
}
struct DP{
int a[K],stk[K],top;
bool in[K];
inline int idx(int k){return in[k]?a[k]:inf;}
inline void insert(int x,int v){
if(in[x])a[x]=min(a[x],v);
else stk[++top]=x,in[x]=1,a[x]=v;
}
inline pii delet(){return in[stk[top]]=0,--top,pii(stk[top+1],a[stk[top+1]]);}
inline void clear(){while(top)delet();}
}f,g;
void solve(int p,int fa,int dep,int dist){
if(dist>k)return;
g.insert(dist,dep);
ans=min(ans,min(dep+f.idx(k-dist),(dist==k)?dep:inf));
for(ri i=0,v;i<e[p].size();++i){
if((v=e[p][i].fi)==fa||vis[v])continue;
solve(v,p,dep+1,dist+e[p][i].se);
}
}
void dfs(int p){
vis[p]=1;
for(ri i=0,v;i<e[p].size();++i){
if(vis[v=e[p][i].fi])continue;
solve(v,p,1,e[p][i].se);
while(g.top){
pii tmp=g.delet();
f.insert(tmp.fi,tmp.se);
}
}
f.clear();
for(ri i=0,v;i<e[p].size();++i){
if(vis[v=e[p][i].fi])continue;
rt=0,all=siz[v],findroot(v,0),dfs(rt);
}
}
int main(){
n=read(),k=read();
for(ri i=1,u,v,w;i<n;++i)u=read()+1,v=read()+1,w=read(),e[u].push_back(pii(v,w)),e[v].push_back(pii(u,w));
msiz[rt=0]=all=n,findroot(1,0),dfs(rt);
if(ans>n)puts("-1");
else cout<<ans;
return 0;
}
2019.01.09 bzoj2599: [IOI2011]Race(点分治)的更多相关文章
- [bzoj2599][IOI2011]Race——点分治
Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所 ...
- BZOJ2599:[IOI2011]Race(点分治)
Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...
- AWS re:Invent(2019.01.09)
时间:2019.01.09地点:北京国际饭店
- 【BZOJ-2599】Race 点分治
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 2590 Solved: 769[Submit][Status ...
- BZOJ 2599: [IOI2011]Race( 点分治 )
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...
- [IOI2011]Race 点分治
[IOI2011]Race LG传送门 点分治板子题. 直接点分治统计,统计的时候开个桶维护下就好了. 注(tiao)意(le)细(hen)节(jiu). #include<cstdio> ...
- bzoj2599: [IOI2011]Race(点分治)
写了四五道点分治的题目了,算是比较理解点分治是什么东西了吧= = 点分治主要用来解决点对之间的问题的,比如距离为不大于K的点有多少对. 这道题要求距离等于K的点对中连接两点的最小边数. 那么其实道理是 ...
- [luogu4149][bzoj2599][IOI2011]Race【点分治】
题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 K,且边的数量最小. 题解 比较明显需要用到点分治,我们定义\(d\)数组表示当前节点到根节点\(rt\)之间有多少个节点,也可以表示有多少 ...
- bzoj2599/luogu4149 [IOI2011]Race (点分治)
点分治.WA了一万年. 重点就是统计答案的方法 做法一(洛谷AC bzojWA 自测WA): 做点x时记到x距离为k的边数最小值为dis[k],然后对每一对有值的dis[i]和dis[K-i],给an ...
随机推荐
- 承载地图的div如果隐藏再显示,则定位时会定位到页面左上角
承载地图的div如果隐藏再显示,则定位时会定位到页面左上角. 解决方法:不隐藏,改变div的高度.在div上利用z-index加一个新的不透明的div.
- Sigma Function (平方数与平方数*2的约数和是奇数)
Sigma Function https://vjudge.net/contest/288520#problem/D Sigma function is an interesting function ...
- c++笔试题贪吃蛇问题
贪吃蛇 现在有一个N*M(N,M=100)的方形矩形,在这个矩形的每一个方格上都放有一个随机值,一条可爱的小蛇从矩形的 左上角开始出发,每次移动都只能移动一格,向右或向下,而每到达一格贪吃的小蛇都会吧 ...
- Java11-java基础语法(十)类设计综合案例
Java11-java语法基础(十)类设计综合案例 一.类综合设计方法 1.类设计步骤 (1)分析数据成员 (2)分析成员方法和构造方法 (3)画出类图 (4)编码测试 2.具体问题 1)分析数据成员 ...
- python 3.6.5 sys模块和os模块
1 sys.argv 命令行参数List,第一个元素是程序本身路径 2 sys.exit(n) 退出程序,正常退出时exit(0) 3 sys.version 获取Python解释程序的版本信息 4 ...
- Linux定时任务Crontab使用 提示no crontab for root
使用命令查询crontab 任务时,一直提示:no crontab for root .查看了一些资料,说是crontab在初始时,设置了一次编辑方式,所以试了一下crontab -e的方式编辑,即在 ...
- c++ 备忘
一.类型转换#include <sstream>stringstream ss;ss<<reverse(s1)<<'\t'<<reverse(s2);s ...
- UI和View 三种控制方式
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xm ...
- linux下svn导入新目录到svn服务器特定地址
svn import transplant-apps/ svn://xx.xx.xx.90/ -m "changelog:add transplant-apps to 90-svn" ...
- TCHAR函数查询
https://blog.csdn.net/is2120/article/details/27542927