- 开始时,对于一个点 (x) ,若没有糖果需要运走,则不考虑;
- 否则,若点上有 (k) 颗糖果需要运走,火车每次只能搭上 (1) 个,显然经过这个点至少 (k) 次.
- 至少 (k) 次,说明一定转完了完整的 (k-1) 圈,则这个点先上车的 (k-1) 颗糖果一定都被送到了该送的位置.
- 最后只需要送剩下的那个糖果 (i) .若出发点为 (st) ,则总时间为 (S_x=dist(st,x)+n(k-1)+dist(a_i,b_i)) .
- 对于每个点,我们使 (dist(a_i,b_i)) 尽可能小.总时间花费为所有 (min_{1leq xleq n} S_x) .
- 预处理出每个点最小的 (dist(a_i,b_i)) ,每次更换起始点时对 (n) 个点扫一遍,时间复杂度为 (O(n^2)) .
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
int n,m;
const int MAXN=2e4+10;
int dist(int x,int y)
{
return y-x>=0?y-x:y-x+n;
}
int t[MAXN];
int midist[MAXN];
ll solve(int st)
{
ll ans=0;
for(int i=1;i<=n;++i)
{
if(midist[i])
ans=max(ans,1LL*dist(st,i)+1LL*n*(t[i]-1)+midist[i]);
}
return ans;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;++i)
{
int a=read(),b=read();
++t[a];
midist[a]=midist[a]?min(midist[a],dist(a,b)):dist(a,b);
}
for(int i=1;i<=n;++i)
cout<<solve(i)<<' ';
puts("");
return 0;
}