Teleportation(tel)

题目描述

Zy大帝拥有n个星球,因为距离非常遥远,所以Zy在他所居住的1号星球和他的军事基地霸中所在的2号星球建造了两个传送门,这样从1号星球到2号星球就只需要250分钟,回去也一样(双向)。由于科技的发展,各个星球陆陆续续建造了和自己居民最经常去的星球之间的传送门,并且他们的传送门只需要1个小时(真快啊!),他们发现和别的星球建设传送门对促进经济发展有很大的帮助,于是向和其他所有星球建设传送门发展,Zy突然发现两两星球的传送门的建设会威胁到他的安全,可是他又想促进自己帝国的发展,于是他请到了他精心培养的你,希望你能帮他解决这个难题。

输入

第1行为两个整数n(2<=n<=40000)和m(0<=m<=1000000),n表示星球数,m 表示其他星球已经建造的传送门的对数(传送门都是两两建造的)(不包括Zy在1号和2号的)。

接下来m行每行两个由空格隔开的整数想x,y(2<=x,y<=40000),表示这两个星球建造了传送门连接。

输出

还能让多少对传送门建造,但又不会比Zy从1号星球到2号星球快(就是说增加传送门后,从1号星球到2号星球还是Zy的传送门最快)。

样例输入

  1. 10 10
  2. 1 3
  3. 3 5
  4. 5 7
  5. 7 9
  6. 2 9
  7. 1 4
  8. 4 6
  9. 6 8
  10. 8 10
  11. 2 10

样例输出

  1. 10

提示

实线连接的是已经造好传送门的两星球,虚线连接表示可以增加建造的传送门两星球。可以看出,建造了10对以后,从1号到2号星球还是Zy的250分钟最快。

来源

Poi2010


solution

分层图。

当时考场傻了,没考虑周全。

设1为S,2为T

题目要求S~T的最短路长度<=5,同时最大化总边数。

设与S一步的点有a个,T一步的点有b个。

S两步的有x个,T有y个。

剩下点数fr。

显然a,b,x,y,fr内部可以随便连边。

a与x,b与y两两连边。

fr与x和y连,和a与b其中之一连。

  1. ansl=a+1LL*a*(a-1)/2+1LL*a*x+1LL*x*(x-1)/2;
  2. ansr=b+1LL*b*(b-1)/2+1LL*b*y+1LL*y*(y-1)/2;
  3. ansmid=1LL*x*y+1LL*fr*(fr-1)/2+1LL*fr*(x+y)+1LL*fr*max(a,b);
  4. ans=ansl+ansr+ansmid-m;

挣神表示怀疑fr的连边,讲些什么ab还是xy为空的特殊情况。

然而没有这种数据。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cmath>
  7. #define maxn 40005
  8. using namespace std;
  9. int n,m,a,b,x,y,S[maxn],T[maxn],X[maxn],Y[maxn];
  10. long long ansl,ansr,ansmid,ans;
  11. struct node{
  12. int u,v;
  13. }e[1000005];
  14. int main()
  15. {
  16. cin>>n>>m;
  17. for(int i=1;i<=m;i++){
  18. scanf("%d%d",&e[i].u,&e[i].v);
  19. if(e[i].v<e[i].u)swap(e[i].u,e[i].v);
  20. if(e[i].u==1)S[e[i].v]=1,a++;
  21. if(e[i].u==2)T[e[i].v]=1,b++;
  22. }
  23. for(int i=1;i<=m;i++){
  24. if(e[i].u==1||e[i].u==2)continue;
  25. if(S[e[i].u]==1&&S[e[i].v]==1)continue;
  26. if(T[e[i].u]==1&&T[e[i].v]==1)continue;
  27. if(S[e[i].u]==1&&!X[e[i].v])X[e[i].v]=1,x++;
  28. if(S[e[i].v]==1&&!X[e[i].u])X[e[i].u]=1,x++;
  29. if(T[e[i].u]==1&&!Y[e[i].v])Y[e[i].v]=1,y++;
  30. if(T[e[i].v]==1&&!Y[e[i].u])Y[e[i].u]=1,y++;
  31. }
  32. int fr=n-a-b-x-y-2;
  33. ansl=a+1LL*a*(a-1)/2+1LL*a*x+1LL*x*(x-1)/2;
  34. ansr=b+1LL*b*(b-1)/2+1LL*b*y+1LL*y*(y-1)/2;
  35. ansmid=1LL*x*y+1LL*fr*(fr-1)/2+1LL*fr*(x+y)+1LL*fr*max(a,b);
  36. ans=ansl+ansr+ansmid-m;
  37. cout<<ans<<endl;
  38. return 0;
  39. }

Teleportation(tel)的更多相关文章

  1. 拨打电话tel: 跳转到邮件mailto:(html)

    拨打电话 <a href="tel://0571866000">0571-866000</a> 跳转到邮件 <a href="mailto: ...

  2. 国内固定电话正则验证:'tel': [/0\d{2,3}-\d{7,8}(|([-\u8f6c]{1}\d{1,5}))$/, "请填写有效的电话号码"],

    // 验证字段 $('#info_form').validator({ rules : { checkMobile : function(ele) { return checkMobile(ele); ...

  3. Android网页中tel,sms,mailTo,Intent,Market协议用法总结

     tel:协议---拨打电话 <a href="tel:">调出拨号界面</a> <a href="tel:10086">调 ...

  4. 安卓版微信内置浏览器,<a href="tel:电话号码"></a> 这个链接失效,不能跳到拨号界面?

    https://segmentfault.com/q/1010000000318831 在URL最后面加“ #mp.weixin.qq.com ”,应该加其他qq.com的二级域名都行,估计是微信的安 ...

  5. input type="tel" 数字输入框显示圆点

    最近开发中遇到一个这样的需求,要求input输入框在手机端出现数字键盘的同时显示圆点,试过各种方法都不太理想, 最终经过查阅大量资料后,终于实现了需求. ●我们一般的密码输入框是这样的: <in ...

  6. 解决微信浏览器中无法一键拨号问题tel

    公众号中需要在某些页面显示手机号码,并且需要点击后拨号. 原以为 <a href="tel:10086">10086</a> 可以解决了, 没想到在微信浏览 ...

  7. 开启windows的 admin+开启tel+电源+远程功能

    1.控制面板   小图标   程序功能   打开关闭windows功能     开启Telnet 的服务两个都选         2. 启动tel服务   控制面板  小图标 管理工具 服务 找到 t ...

  8. HTML5 & tel & make a phone call

    HTML5 & tel & make a phone call 咋呼叫呀,网页怎么打电话? { key: "exploreCorpPhone", title: &q ...

  9. input type="tel" 输入框显示密文

    为了在移动端实现密码输入框且调起的键盘为数字键盘,可以用-webkit-text-security:disc;text-security:disc;属性来实现. 语法: text-security: ...

随机推荐

  1. Quartz 配置文件属性

    主要配置 Property Name Req'd Type Default Value org.quartz.scheduler.instanceName no string 'QuartzSched ...

  2. js call 函数

    function bb(){ console.log(this.x)   } function cc(){ this.x = 200 } var p = new cc(); bb.call(p) // ...

  3. [未完] term.js 记录遇到的问题

    参考博文:https://www.cnblogs.com/zhenfei-jiang/p/7065038.html 按照网上查找的资料敲了代码 term.on('data', function(dat ...

  4. php获取随机字符串

    获取随机字符串 /** * 获取随机字符串 * @param int $randLength 长度 * @param int $addtime 是否加入当前时间戳 * @param int $incl ...

  5. sed速查手册

    1. Sed简介sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后, ...

  6. 科学计算库Numpy——文件读写

    读文件 要读取的文件 有分隔符的文件 备注:delimiter分隔符. 有多余行的文件 备注:skiprows去掉几行. 指定列 备注:usecols指定使用哪几列. 写文件 保存后的文件 备注:fm ...

  7. 精通SpringBoot---整合RabbitMQ消息队列

    今天来和朋友们一起学习下,SpringBoot怎么整合RabbitMQ.目前消息组件大致有三种:.activemq, rabbitmq, kafka.这三者各有优缺点,RabbitMQ相比之下是处于其 ...

  8. proguaid 混淆代码

    注意:这里有一个坑.就是-ignorewarnings 他老是混淆不了,告诉你不行.其实加上这句话,就可以了. 下面贴一下代码: -injars c:/ceb_lib.jar -outjars c:/ ...

  9. 【Gitlab+Jenkins+Ansible】构建自动化部署

    说明: Gitlab.Jenkins.生产服务器.测试服务器上都需要安装Git. 一.安装Gitlab 1.主机配置 IP: 10.10.10.105 OS: CentOs7. Gitlab版本:gi ...

  10. 设计模式之第19章-中介者模式(Java实现)

    设计模式之第19章-中介者模式(Java实现) “测试妹纸找你,你的代码出问题了.”“美工妹纸让你看看界面怎么样.”身为程序员总要和各种人打交道,但是如果再分为前端.后端工程师的话,那么关系就会错综复 ...