Line++

Problem Statement

We have an undirected graph GG with NN vertices numbered 11 to NN and NN edges as follows:

  • For each i=1,2,...,N−1, there is an edge between Vertex i and Vertex i+1.
  • There is an edge between Vertex X and Vertex Y.

For each k=1,2,...,N−1, solve the problem below:

  • Find the number of pairs of integers (i,j)(1≤i<j≤N)such that the shortest distance between Vertex i and Vertex j in G is k.

Constraint

  • \(3≤N≤2×10^3\)
  • \(1≤X,Y≤N\)
  • \(X+1<Y\)
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

N X Y

Output

For each k=1,2,...,N−1 in this order, print a line containing the answer to the problem.

Idea

类似于floyd算法,但是只需要考虑经过x,y时的路程是否更小即可

Code

/******************************************
/@Author: LeafBelief
/@Date: 2020-04-07
/@Remark:    
/@FileName: changeflyord
******************************************/
#include <bits/stdc++.h>
#define CSE(x,y) memset(x,y,sizeof(x))
#define lowbit(x) (x&(-x))
#define INF 0x3f3f3f3f
#define FAST ios::sync_with_stdio(false);cin.tie(0);
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll , ll> pll;

const int maxn = 2010;
int dis[maxn][maxn], n, x, y;
int ans[maxn];

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    #endif
    FAST;
    cin >> n >> x >> y;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            dis[i][j] = dis[j][i] = abs(i -j);
        }
    }
    dis[x][y] = dis[y][x] = 1;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            dis[i][j] = min(dis[i][j], dis[i][x] + dis[y][j] + 1);
        }
    }
    for(int i = 1; i <= n; i++)
        for(int j = i; j <= n; j++)
            ans[dis[i][j]]++;
    for(int i = 1; i < n; i++)
        cout << ans[i] << endl;
    return 0;
}