BZOJ权限题qwq

Luogu

sol

树上路径当然是淀粉质辣!

考虑所有过重心的路径。开一个\(10^6\)大小的数组\(t\)表示某一路径长度的最小边数,初始化为\(inf(i>0)\),\(t[0]=0\)。

枚举重心的每棵子树进行\(dfs\),假设获得了一条从重心出发边数为\(dep\)边权和为\(dis\)的路径,就可以用\(t[K-dis]+dep\)更新答案。

更新完答案后对应用\(dep\)更新\(t[dis]\)

记得还原\(t\)数组。显然不能直接memset设为\(inf\)。只需把更改过的位置改成\(inf\)即可。

code

#include<cstdio>
#include<algorithm>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int inf = 1e9;
const int N = 2e5+5;
int n,k,to[N<<1],nxt[N<<1],len[N<<1],head[N],cnt;
int sz[N],w[N],root,sum,vis[N],t[N*5],ans=inf;
void link(int u,int v,int ww)
{
to[++cnt]=v;nxt[cnt]=head[u];len[cnt]=ww;
head[u]=cnt;
}
void getroot(int u,int f)
{
sz[u]=1;w[u]=0;
for (int e=head[u];e;e=nxt[e])
{
int v=to[e];if (v==f||vis[v]) continue;
getroot(v,u);
sz[u]+=sz[v];w[u]=max(w[u],sz[v]);
}
w[u]=max(w[u],sum-sz[u]);
if (w[u]<w[root]) root=u;
}
void getans(int u,int f,int dep,int dis)
{
if (dis>k) return;
ans=min(ans,t[k-dis]+dep);
for (int e=head[u];e;e=nxt[e])
{
int v=to[e];if (v==f||vis[v]) continue;
getans(v,u,dep+1,dis+len[e]);
}
}
void getdp(int u,int f,int dep,int dis)
{
if (dis>k) return;
t[dis]=min(t[dis],dep);
for (int e=head[u];e;e=nxt[e])
{
int v=to[e];if (v==f||vis[v]) continue;
getdp(v,u,dep+1,dis+len[e]);
}
}
void clear(int u,int f,int dep,int dis)
{
if (dis>k) return;
t[dis]=inf;
for (int e=head[u];e;e=nxt[e])
{
int v=to[e];if (v==f||vis[v]) continue;
clear(v,u,dep+1,dis+len[e]);
}
}
void solve(int u)
{
vis[u]=1;
for (int e=head[u];e;e=nxt[e])
if (!vis[to[e]])
getans(to[e],u,1,len[e]),getdp(to[e],u,1,len[e]);
for (int e=head[u];e;e=nxt[e])
if (!vis[to[e]])
clear(to[e],u,1,len[e]);
for (int e=head[u];e;e=nxt[e])
{
int v=to[e];if (vis[v]) continue;
sum=sz[v];root=0;
getroot(v,0);
solve(root);
}
}
int main()
{
n=gi();k=gi();
for (int i=1,u,v,ww;i<n;++i)
{
u=gi()+1;v=gi()+1;ww=gi();
link(u,v,ww);link(v,u,ww);
}
for (int i=1;i<=k;++i) t[i]=inf;
sum=w[0]=n;
getroot(1,0);
solve(root);
printf("%d\n",ans==inf?-1:ans);
return 0;
}

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

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

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

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

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

  3. [IOI2011]Race

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem ...

  4. 【BZOJ2599】[IOI2011]Race 树的点分治

    [BZOJ2599][IOI2011]Race Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 100000 ...

  5. [IOI2011]Race 点分治

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

  6. bzoj 2599 [IOI2011]Race 点分

    [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBSubmit: 4768  Solved: 1393[Submit][Status][Dis ...

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

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

  8. 2599: [IOI2011]Race

    2599: [IOI2011]Race 链接 分析 被memset卡... 点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少.然后先遍历子树,更新答 ...

  9. 模板—点分治B(合并子树)(洛谷P4149 [IOI2011]Race)

    洛谷P4149 [IOI2011]Race 点分治作用(目前只知道这个): 求一棵树上满足条件的节点二元组(u,v)个数,比较典型的是求dis(u,v)(dis表示距离)满足条件的(u,v)个数. 算 ...

随机推荐

  1. 浏览器中显示PPT的展示效果

    发现了一个PPT的WEb展示的方法,在浏览器中载入PDF文件之后,可以实现基于WEB的页面展示,支持全屏与自动播放. https://sharedoc.onk.ninja/ 这不失为一种可行的方式,且 ...

  2. tcping-安装

    1.LINUX安装方法: 下载地址: http://www.linuxco.de/tcping/tcping.html 不过LINUX操作比WINDOWS的差.建议还是使用WINDOWS版本. 2.W ...

  3. word在页眉中插入页码

    编辑页眉时,插入-页码-当前位置-普通数字

  4. 手把手教你用.NET Core写爬虫

    写在前面 自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本. 然后最近又开了个新坑,搞了个Dy2018Crawler用来爬dy20 ...

  5. Mac下使用SSH(密钥)访问Github

    1,终端中输入:cd ~/.ssh 如果出现 -bash: cd: /Users/glamor/.ssh: No such file or directory,说明你之前没有用过.直接执行第二步. 如 ...

  6. Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap

    Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的ke ...

  7. 蚂蚁爬杆问题 UVA 10881

    算法入门经典训练指南上的题. 这里有必要讲一下蚂蚁爬杆问题:每只蚂蚁都有一个初始方向,相撞会转向,关键就是相撞的处理,由于速度并不会改变,两只蚂蚁相撞,可以看做,两只蚂蚁穿过对方,继续沿原方向前进,经 ...

  8. Java版连连看

    连连看大家应该都玩过,不多说直接上一个做好的界面截图吧,所有的功能都在上面的,要做的就只是如何去实现它们了. 差不多就是这个样子.先说一下大致的思路吧.首先编写基本的界面:把什么按钮啊,表格啊什么的都 ...

  9. ReportView动态加载带参数的RDCL文件

    在vs里新建一个winform程序"ReportViewTest",在form1中添加一个reportView控件,from1的load事件如下: private void For ...

  10. spring中自定义Event事件的使用和浅析

    在我目前接触的项目中,用到了许多spring相关的技术,框架层面的spring.spring mvc就不说了,细节上的功能也用了不少,如schedule定时任务.Filter过滤器. intercep ...