整理的算法模板: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:
正在上传…重新上传取消
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:
正在上传…重新上传取消
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两个点之间的距离可以有两种走法:
- 经过X~Y这条边; abs(a-x)+abs(b-y);
- 不经过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;
}