ABC160D

ABC160 D - Line++

题意

输入N,X,Y。 i ( 1 ≤ N ≤ 2 e 3 ) i(1\leq N \leq 2e3) i(1N2e3)
给你一个由N个结点组成的图,连接 第 i i i 和第 i + 1 i+1 i+1个点,一共构成了N-1条边。
连接X,Y,输出两节点间最短距离长度为 i ( 1 ≤ i ≤ N − 1 ) i(1\leq i \leq N-1) i(1iN1) 的边一共有多少条。

思路

再一次强调读题要注意数据范围,因为数据范围会暗示算法的复杂度大概在什么程度,然后再思考相关算法。
我比赛的时候没注意N的范围,因而在思考最优解法,当然到最后也没思考出来。
这道题我们先看一眼N最大2e3,显然可以 O ( N 2 ) O(N^2) O(N2)去做,即遍历两个不同的点,记录他们的路径长度的对应个数+1。
X,Y的连接使得可以经由X或Y为中转站。
故两个点的最小距离为 m i n ( a b s ( i − j ) , m i n ( a b s ( x − i ) + a b s ( y − j ) + 1 , a b s ( y − i ) + a b s ( x − j ) + 1 ) ) min(abs(i-j),min(abs(x-i)+abs(y-j)+1,abs(y-i)+abs(x-j)+1)) min(abs(ij),min(abs(xi)+abs(yj)+1,abs(yi)+abs(xj)+1))
这一场我第一次比赛中做出ABC的E,不过却没能注意数据范围而错过了D,而且做的很慢。
快一点,再快一点,罚时再少一点!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  maxn = 2e3 + 5;

int n,x,y,a[maxn];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>x>>y;
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			a[min(abs(i-j),min(abs(x-i)+abs(y-j)+1,abs(y-i)+abs(x-j)+1))]++;
		}
	}
	for(int i=1;i<n;i++){
		cout<<a[i]<<'\n';
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值