显然在最优解中,添加的边都是从$1$出发的。

这个图是一个环套树的结构,对于树的部分,显然叶子节点必须加边。

因此可以自底向上确定树中哪些节点需要加边,同时得到$1$到环上每个点的距离。

对于每个环,首先求出哪些点距离超过了$k$,并预处理出每个点之后最近的未满足的点的位置。

然后枚举起点,显然起点必须未满足,然后向右$k$步$k$步跳,贪心覆盖,对于长度为$L$的环,每次求答案的时间复杂度为$O(\frac{L}{k})$。

注意到每个环中每$k$个起点中必然存在一个最优解,因此只需要枚举$k$个起点,时间复杂度为$O(\frac{L}{k}\times k)=O(L)$。

时间复杂度$O(n)$。

#include<cstdio>
const int N=500010,M=N*2;
int n,m,i,j,k,x,y,d[N],out[N],v[N],g[N],nxt[N],vis[N],on[N],f[N],ans;
int q[N],cnt,s[M],ok[M],go[M],now,ret,have;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
void dfs(int x){
vis[x]=1;
if(!d[x]){
f[x]=x==1?0:1;
if(x>1)ans++;
return;
}
f[x]=N;
for(int i=g[x];i;i=nxt[i]){
int y=v[i];
if(on[y])continue;
dfs(y);
if(f[x]>f[y])f[x]=f[y];
}
f[x]++;
if(x==1)f[x]=0;
if(!on[x]&&f[x]>m)f[x]=1,ans++;
}
int main(){
read(n),read(m);
for(i=1;i<=n;i++){
read(x),read(y);
out[x]=y;v[i]=x;nxt[i]=g[y];g[y]=i;
d[y]++;
}
for(i=1;i<=n;i++)if(!vis[i]){
for(j=i;!vis[j];j=out[j])vis[j]=1;
on[q[cnt=1]=j]=1;
for(k=out[j];k!=j;k=out[k])on[k]=1,q[++cnt]=k;
for(j=1;j<=cnt;j++)dfs(q[j]),s[j]=s[j+cnt]=0;
for(j=1;j<=cnt;j++)if(f[q[j]]<=m){
s[j]++;
if(j+m-f[q[j]]<cnt+cnt)s[j+m-f[q[j]]+1]--;
}
for(j=1;j<=cnt+cnt;j++)s[j]+=s[j-1];
for(j=1;j<=cnt;j++)if(s[j]||s[j+cnt])ok[j]=ok[j+cnt]=1;else ok[j]=ok[j+cnt]=0;
go[cnt+cnt+1]=cnt+cnt+1;
for(j=cnt+cnt;j;j--)if(ok[j])go[j]=go[j+1];else go[j]=j;
have=0,now=N;
for(j=1;j<=cnt;j++)if(!ok[j]){
for(ret=0,k=j;k<j+cnt;){
ret++,k+=m;
if(k<j+cnt)k=go[k];
}
if(ret<now)now=ret;
if((++have)==m)break;
}
if(now<N)ans+=now;
}
return printf("%d",ans),0;
}

  

BZOJ1950 : [Ceoi2006]Link的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. oracle db link的查看创建与删除

    1.查看dblink select owner,object_name from dba_objects where object_type='DATABASE LINK'; 或者 select * ...

  3. 解决Java程序连接mysql数据库出现CommunicationsException: Communications link failure错误的问题

    一.背景 最近在家里捣鼓一个公司自己搭建的demo的时候,发现程序一启动就会出现CommunicationsException: Communications link failure错误,经过一番排 ...

  4. 解决绝对定位div position: absolute 后面的<a> Link不能点击

    今天布局的时候,遇到一个bug,当DIV设置为绝对定位时,这个div后面的相对定位的层里面的<a>Link标签无法点击. 网上的解决方案是在绝对定位层里面添加:pointer-events ...

  5. LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    同时安装了VS2012和VS2010,用VS2010 时 >LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 问题说明:当安装VS2012之后 ...

  6. VS2013的 Browser Link 引起的问题

    环境:vs2013 问题:在调用一个WebApi的时候出现了错误: 于是我用Fiddler 4直接调用这个WebApi,状态码是200(正常的),JSon里却提示在位置9409处文本非法, 以Text ...

  7. angular中的compile和link函数

    angular中的compile和link函数 前言 这篇文章,我们将通过一个实例来了解 Angular 的 directives (指令)是如何处理的.Angular 是如何在 HTML 中找到这些 ...

  8. AngularJS之指令中controller与link(十二)

    前言 在指令中存在controller和link属性,对这二者心生有点疑问,于是找了资料学习下. 话题 首先我们来看看代码再来分析分析. 第一次尝试 页面: <custom-directive& ...

  9. Visual Studio 2013中因SignalR的Browser Link引起的Javascript错误一则

    众所周知Visual Studio 2013中有一个由SignalR机制实现的Browser Link功能,意思是开发人员可以同时使用多个浏览器进行调试,当按下IDE中的Browser Link按钮后 ...

随机推荐

  1. C++面试之GetMemory问题

    http://blog.csdn.net/zhuxiaoyang2000/article/details/8084629 #include <iostream> #include < ...

  2. 初学iPad开发入门

    iPad是一款苹果公司于2010年发布的平板电脑定位介于苹果的智能手机iPhone和笔记本电脑MacBook产品之间跟iPhone一样,搭载的是iOS操作系统 iPhone和iPad开发的区别 屏幕的 ...

  3. Thinkphp3.2中的模板继承

    1:模板继承:   是3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比 类的继承一样,模板也可以定义一个基础模板( ...

  4. Jquery.Datatables 服务器处理(Server-side processing)

    看了看介绍 http://datatables.club/manual/server-side.html 没有经过处理的分页,先显示出来看看效果,就这样写(存储过程自己写) cshtml " ...

  5. ASP.NET MVC中的Global.asax文件

    1.global.asax文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成 ...

  6. 【数据库】 防止sql注入,过滤敏感关键字

    private bool FilterIllegalChar(string sWord) { var result = false; var keyWord = @"select|inser ...

  7. DDD的思考

    概述 DDD领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略和类型划分.领 ...

  8. java中常用的工具类(二)

    下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil           Java   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  9. Linux环境下使用perl编写CGI(httpd)

    例子1: /var/www/cgi-bin/hello.cgi #!/usr/bin/perl print "Content-type: text/html\n\n"; print ...

  10. 利用IdentityServer3在ASP.NET 5和Angular中实现OAuth2 Implicit Flow

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:之前介绍过的IdentityServer3虽然是基于Katana开发的,不过同样可以托 ...