[IOI2011]Race $O(nlog^{2}n)$ 做法
这个应该还不是正解,明天看一下正解到底是什么...
Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 500000
#define inf 0x7f7f7f
using namespace std;
char *q1,*q2,buf[1000000];
#define nc() (q1==q2&&(q2=(q1=buf)+fread(buf,1,1000000,stdin),q1==q2)?EOF:*q1++)
int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
int hd[maxn],to[maxn],nex[maxn],val[maxn],f[maxn],vis[maxn],siz[maxn],dep[maxn],ans,cur=0;
int cnt,n,k,root,sn,d[2];
void addedge(int u,int v,int c)
{
nex[++cnt] = hd[u],hd[u] = cnt,to[cnt] = v,val[cnt] = c;
}
struct Point{
int dis,tot;
Point(int dis = 0,int tot = 0):dis(dis),tot(tot){}
bool operator<(Point b)const{
return b.dis != dis ? b.dis>dis : b.tot > tot;
}
}point[2][maxn],pp[maxn];
void getdis(int u,int fa,int tot)
{
if(!u) return;
point[cur][++d[cur]]=Point(dep[u],tot);
for(int i = hd[u]; i ; i = nex[i])
{
if(vis[to[i]] || to[i] == fa) continue;
dep[to[i]] = dep[u] + val[i],getdis(to[i],u,tot + 1);
}
}
void GetRoot(int u,int ff)
{
siz[u] = 1,f[u] = 0;
for(int i = hd[u]; i ; i = nex[i])
{
if(vis[to[i]] || to[i] == ff) continue;
GetRoot(to[i],u);
siz[u] += siz[to[i]];
f[u] = max(f[u], siz[to[i]]);
}
f[u] = max(f[u], sn - siz[u]);
if(f[u] < f[root]) root = u;
}
void DFS(int u)
{
//calc
d[cur^1]=d[cur]=0,vis[u]=1;
point[cur^1][++d[cur^1]]=Point(0,0);
for(int i = hd[u],j,m,p1,p2; i ; i = nex[i])
{ if(vis[to[i]]) continue;
dep[to[i]]=val[i];
getdis(to[i],u,1);
sort(point[cur]+1,point[cur]+1+d[cur]);
m = 1;
for(j = 2;j <= d[cur]; ++j)
if(point[cur][j].dis!=point[cur][j-1].dis) point[cur][++m]=point[cur][j];
d[cur] = m,p1 = 1,p2 = d[cur^1];
while(p1 <= d[cur] && p2 >=1)
{
if(point[cur][p1].dis + point[cur^1][p2].dis == k)
ans = min(ans,point[cur][p1].tot + point[cur^1][p2].tot), ++p1,--p2;
if(point[cur][p1].dis + point[cur^1][p2].dis < k) ++p1;
if(point[cur][p1].dis + point[cur^1][p2].dis > k) --p2;
}
for(j = 1;j <= d[cur]; ++j) point[cur^1][++d[cur^1]] = point[cur][j];
sort(point[cur^1]+1,point[cur^1]+1+d[cur^1]);
m = 1;
for(j=2;j<=d[cur^1];++j)
if(point[cur^1][j].dis!=point[cur^1][j-1].dis)point[cur^1][++m]=point[cur^1][j];
d[cur^1]=m, d[cur]=0;
}
for(int i = hd[u]; i ; i = nex[i])
{
if(vis[to[i]]) continue;
root = 0,sn = siz[to[i]],GetRoot(to[i],u), DFS(root);
}
}
int main()
{ // setIO("input");
n=rd(),k=rd();
for(int i = 1,a,b,c;i < n; ++i) a=rd(),b=rd(),c=rd(),addedge(a+1,b+1,c),addedge(b+1,a+1,c);
ans = inf, vis[0] = 1,f[0] = inf,sn = n,root = 0, GetRoot(1,0);
DFS(root);
printf("%d\n",ans==inf?-1:ans);
return 0;
}
[IOI2011]Race $O(nlog^{2}n)$ 做法的更多相关文章
- [IOI2011]Race
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem ...
- 2599: [IOI2011]Race
2599: [IOI2011]Race 链接 分析 被memset卡... 点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少.然后先遍历子树,更新答 ...
- BZOJ2599 [IOI2011]Race
传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include ...
- BZOJ2599——[IOI2011]Race
0.题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 1.分析:水题一道,一波树分治就好 我们可以发现这个题的K是比较小的,才100w,那么我们可以树分治一下,在遍历每一棵子树的 ...
- bzoj1758 [Wc2010]重建计划 & bzoj2599 [IOI2011]Race
两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调 ...
- [Luogu4149][IOI2011]Race
BZOJ权限题qwq Luogu sol 树上路径当然是淀粉质辣! 考虑所有过重心的路径.开一个\(10^6\)大小的数组\(t\)表示某一路径长度的最小边数,初始化为\(inf(i>0)\), ...
- Luogu4149:[IOI2011]Race
题目 bzoj权限题... Luogu Sol 点分治辣,边权非负,k>=1,开个\(1e6\)的桶就好辣 # include <bits/stdc++.h> # define RG ...
- P4149 [IOI2011]Race
对于这道题,明显是点分治,权值等于k,可以用桶统计树上路径(但注意要清空); 对于每颗子树,先与之前的子树拼k,再更新桶,维护t["len"]最小边数; #include < ...
- bzoj千题计划160:bzoj2599: [IOI2011]Race
http://www.lydsy.com/JudgeOnline/problem.php?id=2599 点分治 mi[i] 记录边权和为i时的最少边数 先更新答案,再更新mi数组,换根时清空mi # ...
随机推荐
- android下xml放哪儿?
1.用Project->Deployment,打开发布文件窗口,增加要发布的文件.然后设置文件发布的位置Remote Path,填写为assets\internal\ 2.代码 varp: st ...
- 洛谷 P2056 BZOJ 2743 [HEOI2012]采花
//表示真的更喜欢洛谷的题面 题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 ...
- mysql explain介绍
mysql环境优化: 1.如果order by 没有利用到索引,那么将会出现fileSort,如果sort_buffer不够大,fileSort过程则需要使用临时文件 ,fileSort优化,主要通过 ...
- java中tcp小样例
服务端: ServerSocket service = new ServerSocket(7777); Socket socket = service.accept(); InputStream in ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 总结
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 总结 本章节向你介绍了SP平台上eve ...
- HDU--1558--Segment set--并查集***经典***
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- cmd执行调用打开文件
Process p = new Process();//新进程 p.StartInfo.FileName = "cmd.exe";//打开cmd程序 p.StartInfo.Use ...
- Linux安装sshfs挂载远程目录到本地及卸载
挂载远程目录的方式很多,这里把sshfs记录一下备忘.Linux用sshfs挂载远程目录到本地 安装sshfs 在Ubuntu下,只需要使用 $ sudo apt-get install sshfs ...
- Working with macro signatures
https://docs.kentico.com/k11/macro-expressions/troubleshooting-macros/working-with-macro-signatures ...
- Reset and Clear Recent Items and Frequent Places in Windows 10
https://www.tenforums.com/tutorials/3476-reset-clear-recent-items-frequent-places-windows-10-a.html ...