#12834. 简单的基环树
- ID: 12834传统题2000ms1024MiB上传者:ZHtwinkle
说明
有 nn 个节点与 nn 条边的无向连通图,就称为基环树,也就是说,基环树是在一颗树上新增了一条边,使得其形成一个环.
现在给出一个形态最简单的树:一条链
即对于 \forall i \in [1,n-1]∀i∈[1,n−1] , 有一条边连接 ii 与 i+1i+1
现在再新增一条连接 xx 与 yy 的边,我们便得到一个基环树
设 f(k)f(k) 为满足 ii 到 jj 在基环树上的最短距离恰好为 kk 的且 i<ji<j 点对(i,j)(i,j) 数目
请你求出f(k) \ \ (k=1,2,...,n-1)f(k) (k=1,2,...,n−1) 的值
输入格式
输入共一行,输入三个整数 n,x,yn,x,y
(3 \leq n \leq 2 \times 10^3)(3≤n≤2×103)
(1 \leq x,y \leq n,\ x+1 < y)(1≤x,y≤n, x+1<y)
输出格式
输出 n-1n−1 行,每行一个整数
第 ii 行代表 f(i)f(i) 的值
样例
输入数据 1
5 2 4
Copy
输出数据 1
5
4
1
0
Copy
提示
样例解释:
有五对(i,j)(1≤i<j≤n)(i,j)(1≤i<j≤n)使顶点i和顶点j之间的最短距离是1:(1,2),(2,3),(2,4),(3,4),(4,5)。
有四对(i,j)(1≤i<j≤n)(i,j)(1≤i<j≤n)使顶点i和顶点j之间的最短距离是2:(1,3),(1,4),(2,5),(3,5)。
有一对(i,j)(1≤i<j≤n)(i,j)(1≤i<j≤n),使得顶点i和顶点j之间的最短距离是3:(1,5)。
不存在点对(i,j)(1≤i<j≤n)(i,j)(1≤i<j≤n)使得顶点i和顶点j之间的最短距离是4。
// #12834. 简单的基环树
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
int cnt[N];
// 映射: 距离 ~ 数量
int main()
{
int n,x,y,i,j;
scanf("%d%d%d",&n,&x,&y );
for( i=1;i<=n;i++ )
for( j=i+1;j<=n;j++ ) // +1 通过捷径需要1步
cnt[ min( j-i,abs( i-x )+abs( y-j )+1 ) ]++;
// min( i->j,i->x->y->j )
// i->y->x->j 不可能最小 ( x<y i<j )
for( i=1;i<=n-1;i++ ) printf("%d\n",cnt[i] );
return 0;
}