题目描述:

High Load

time limit per test

2 seconds

memory limit per test

512 megabytes

input

standard input

output

standard output

Arkady needs your help again! This time he decided to build his own high-speed Internet exchange point. It should consist of n nodes connected with minimum possible number of wires into one network (a wire directly connects two nodes). Exactly k of the nodes should be exit-nodes, that means that each of them should be connected to exactly one other node of the network, while all other nodes should be connected to at least two nodes in order to increase the system stability.

Arkady wants to make the system as fast as possible, so he wants to minimize the maximum distance between two exit-nodes. The distance between two nodes is the number of wires a package needs to go through between those two nodes.

Help Arkady to find such a way to build the network that the distance between the two most distant exit-nodes is as small as possible.

Input

The first line contains two integers n and k (3 ≤ n ≤ 2·105, 2 ≤ k ≤ n - 1) — the total number of nodes and the number of exit-nodes.

Note that it is always possible to build at least one network with n nodes and k exit-nodes within the given constraints.

Output

In the first line print the minimum possible distance between the two most distant exit-nodes. In each of the next n - 1 lines print two integers: the ids of the nodes connected by a wire. The description of each wire should be printed exactly once. You can print wires and wires' ends in arbitrary order. The nodes should be numbered from 1 to n. Exit-nodes can have any ids.

If there are multiple answers, print any of them.

Examples

Input

Copy

3 2

Output

Copy

21 22 3

Input

Copy

5 3

Output

Copy

31 22 33 43 5

Note

In the first example the only network is shown on the left picture.

In the second example one of optimal networks is shown on the right picture.

Exit-nodes are highlighted.

思路:

题目是说给一个总的顶点数和特殊的顶点数,其中特殊的顶点只能连接另一个顶点,而其他顶点必须连至少两个顶点,现在要构造一种连接方式,使得特殊顶点距离的最大值最小。

刚开始看漏要求,以为可以成环,WA了后看清题目要是棵树,瞬间难度不在一个档次(虽然也不是太难),但我胡乱想也不知道要怎么构造。原来题目的思路是要把这棵树的没一个分支高度尽可能相等,也就是节点要尽可能平均,这样可以使距离最大值最小,如下:

然后就可以做了。先算出分摊下来每个分枝上至少有多少个节点,在算出余数就是要往分枝末端加上的节点。注意是当有一个节点多出来以后,两个特殊节点的最长距离加一;多两个节点后,由于这两个节点会加到不同分枝的末端,所以距离加二;而当多出节点数大于2,最长距离也是加二,因为多出的节点只加了不到一层节点,深度只增加一。

代码:

#include <iostream>
using namespace std;
int n,k;
int length;
int stem;
int main()
{
cin >> n >> k;
length = (n-1)/k*2;
stem = (n-1)/k;
int re = (n-1)%k;
if(re==0)
{
cout << length << endl;
//cout << "k " << k << endl;
for(int j = 2; j<n+1; j+=stem)
{
cout << 1 << " " << j << endl;
for(int z = j+1; z<j+stem; z++)
{
cout << z-1 << " " << z << endl;
}
}
}
if(re==1)
{
cout << length+1 << endl;
for(int j = 2; j<n; j+=stem)
{
cout << 1 << " " << j << endl;
for(int z = j+1; z<j+stem; z++)
{
cout << z-1 << " " << z << endl;
}
}
cout << n-1 << " " << n;
}
if(re==2)
{
//cout << "re " << re << " k " << k << endl;
cout << length+2 << endl;
for(int j = 2; j<n-1; j+=stem)
{
cout << 1 << " " << j << endl;
for(int z = j+1; z<j+stem; z++)
{
cout << z-1 << " " << z << endl;
}
}
cout << n-2 << " " << n-1 << endl;
cout << n-2-stem << " " << n << endl;
}
if(re>2)
{
//cout << "length " << length << endl;
cout << length+2 << endl;
for(int j = 2; j<n-re+1; j+=stem)
{
cout << 1 << " " << j << endl;
for(int z = j+1; z<j+stem; z++)
{
cout << z-1 << " " << z << endl;
}
}
for(int i = 0;i<re;i++)
{
cout << n-re-i*stem << " " << n-re+1+i << endl;
}
}
return 0;
}

Codeforces E. High Load(构造)的更多相关文章

  1. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) D. High Load 构造

    D. High Load 题目连接: http://codeforces.com/contest/828/problem/D Description Arkady needs your help ag ...

  2. Codeforces 1383D - Rearrange(构造)

    Codeforces 题面传送门 & 洛谷题面传送门 一道不算困难的构造,花了一节英语课把它搞出来了,题解简单写写吧( 考虑从大往小加数,显然第三个条件可以被翻译为,每次加入一个元素,如果它所 ...

  3. Codeforces 549B. Looksery Party[构造]

    B. Looksery Party time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  4. codeforces 323A. Black-and-White Cube 构造

    输入n 1 <= n <= 100 有一个n * n * n 的立方体,由n ^ 3 个1 * 1 * 1 的单位立方体构成 要用white 和 black 2种颜色来染这n ^ 3个立方 ...

  5. Codeforces Gym 100531I Instruction 构造

    Problem I. Instruction 题目连接: http://codeforces.com/gym/100531/attachments Description Ingrid is a he ...

  6. codeforces 22C System Administrator(构造水题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud System Administrator Bob got a job as a s ...

  7. Codeforces 353D Queue(构造法)

    [题目链接] http://codeforces.com/contest/353/problem/D [题目大意] 10^6个男女排队,每一秒,如果男生在女生前面,即pos[i]是男生,pos[i+1 ...

  8. Codeforces 482 - Diverse Permutation 构造题

    这是一道蛮基础的构造题. - k         +(k - 1)      -(k - 2) 1 + k ,    1 ,         k ,             2,    ....... ...

  9. [ An Ac a Day ^_^ ] CodeForces 468A 24 Game 构造

    题意是让你用1到n的数构造24 看完题解感觉被样例骗了…… 很明显 n<4肯定不行 然后构造出来4 5的组成24的式子 把大于4(偶数)或者5(奇数)的数构造成i-(i-1)=1 之后就是无尽的 ...

随机推荐

  1. tornado请求与响应

    tornado中处理请求与响应的类如下, 所有视图类必须继承该类: tornado.web.RequestHandler 一. 响应之self.write()方法 1.  该方法可返回值的类型: 当返 ...

  2. 怎么删除STL容器的元素

    在STL容器有顺序容器和关联容器两种. 顺序容器删除元素的方法有两种: 1.c.erase(p) 从c中删除迭代器p指定的元素.p必须指向c中一个真实元素,不能等于c.end().返回一个指向p之后元 ...

  3. ASP.NET Core Windows 环境配置

    ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我们将介绍 ASP.NET Core 中的一些新的概念和它们是如何帮助我们开发现代化的 Web 应用程序 尽管 ASP. ...

  4. 卷积神经网络以及TextCNN

    对于卷积神经网络的详细介绍和一些总结可以参考以下博文: https://www.cnblogs.com/pinard/p/6483207.html https://blog.csdn.net/guoy ...

  5. ORB-SLAM2初步

    一.ORB-SLAM简介 最近开始入坑SLAM,经过简单调研,各位大咖认为,目前最优秀的视觉SLAM系统是ORB-SLAM2,因此对ORB-SLAM2进行了学习. ORB-SLAM2是2015年提出的 ...

  6. gcc编译的时候报错 error trying to exec 'cc1plus': execvp 解决方法

    sudo apt install --reinstall build-essential -y

  7. candlestick用法

    import matplotlib.pyplot as plt   from matplotlib.dates import DateFormatter, WeekdayLocator, DayLoc ...

  8. Swagger2边写代码边写文档

    ​ 作为一个开发人员最怕的就是写文档了,但是要想成为一个合格的程序员,写好文档也是一个必备的技能.开发中我们经常要写接口服务,既然是服务就要跟别人对接,那难免要写接口文档,那么如何”优雅“的写接口文档 ...

  9. SIFT提取特征

    SIFT特征提取: 角点检测: Morvavec角点检测算子:基于灰度方差的角点检测方法,该算子计算图像中某个像素点沿水平.垂直方向上的灰度差异,以确定角点位置 Harris角点检测算子:不止考察水平 ...

  10. SQL --------------- GROUP BY 函数

    Aggregate 函数常常需要添加 GROUP BY 语句,Aggregate函数也就是常说的聚和函数,也叫集合函数 GROUP BY语句通常与集合函数(COUNT,MAX,MIN,SUM,AVG) ...