AtCoder Beginner Contest 160 D - Line++

整理的算法模板:ACM算法模板总结(分类详细版)

D - Line++


Time Limit: 2 sec / Memory Limit: 1024 MB

Score : 400400 points

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−1i=1,2,...,N−1, there is an edge between Vertex ii and Vertex i+1i+1.
  • There is an edge between Vertex XX and Vertex YY.

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

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

Constraints

  • 3≤N≤2×1033≤N≤2×103
  • 1≤X,Y≤N1≤X,Y≤N
  • X+1<YX+1<Y
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

NN XX YY

Output

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


Sample Input 1 Copy

Copy

5 2 4

Sample Output 1 Copy

Copy

5
4
1
0

The graph in this input is as follows:

3ae0885a4aeda99694b9fde4efe39dc1.pnguploading.4e448015.gif正在上传…重新上传取消Figure

There are five pairs (i,j)(1≤i<j≤N)(i,j)(1≤i<j≤N) such that the shortest distance between Vertex ii and Vertex jj is 11: (1,2),(2,3),(2,4),(3,4),(4,5)(1,2),(2,3),(2,4),(3,4),(4,5).
There are four pairs (i,j)(1≤i<j≤N)(i,j)(1≤i<j≤N) such that the shortest distance between Vertex ii and Vertex jj is 22: (1,3),(1,4),(2,5),(3,5)(1,3),(1,4),(2,5),(3,5).
There is one pair (i,j)(1≤i<j≤N)(i,j)(1≤i<j≤N) such that the shortest distance between Vertex ii and Vertex jj is 33: (1,5)(1,5).
There are no pairs (i,j)(1≤i<j≤N)(i,j)(1≤i<j≤N) such that the shortest distance between Vertex ii and Vertex jj is 44.


Sample Input 2 Copy

Copy

3 1 3

Sample Output 2 Copy

Copy

3
0

The graph in this input is as follows:

be2921b3b307fc993a390a59437e624e.pnguploading.4e448015.gif正在上传…重新上传取消Figure
 


Sample Input 3 Copy

Copy

7 3 7

Sample Output 3 Copy

Copy

7
8
4
2
0
0

Sample Input 4 Copy

Copy

10 4 8

Sample Output 4 Copy

Copy

10
12
10
8
4
1
0
0
0

思路:

a,b两个点之间的距离可以有两种走法:

  1. 经过X~Y这条边;  abs(a-x)+abs(b-y);
  2. 不经过X~Y这条边:abs(a-b)

枚举所有的边,对每一条边都进行上面的两个计算,求最小值;

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
int dis[100005];
int main() 
{
	int n,x,y;
	cin >>n>>x>>y;
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			dis[min(abs(i-j),abs(i-x)+abs(j-y)+1)]++;
	for(int i=1;i<n;i++) cout <<dis[i]<<endl;
}
发布了231 篇原创文章 · 获赞 60 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43872728/article/details/105176099