description
操場可以看成乙個平面直角座標系,在操場上有nn個同學。你希望將這nn個同學排成乙個間距為1的nn的方陣,並且要求方陣的左邊界在y軸上。每個同學在初始格點(xi,yi)上,可以移動到任何乙個格點(xi』,yi』),耗費的體力值為(|xi-xi』|+|yi-yi』|)^p,xi,yi是整數,p是正整數。現在你想知道,將這nn同學移動成符合要求的方陣的情況下,總共耗費的體力值最小是多少。
input
每個測試點包含多組測試資料,第一行乙個正整數t,表示有t組測試資料。接下來有t個部分。每個部分第一行兩個正整數n,p,含義如上所述,接下來n*n行,每行兩個整數,表示每個同學的座標。
output
輸出t行,每行乙個整數,表示這一組測試資料的總共耗費最小體力值。
sample input
22 1
0 22 1
3 13 2
2 20 0
0 11 0
2 2sample output
6【樣例說明】
設f(y)表示方陣左上角為(0,y)的最優解
f(y)可以費用流o(n5)求
通過打表發現f(y)下凸,三分
(三分時為了方便防止特殊情況,可以不要求l==r,轉而為l+某個小數==r,最後暴力掃一下)
沒了
#include
#include
#include
#include
#include
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define inf 9223372036854775807ll
#define abs(x) ((x)>0?(x):-(x))
#define max(a,b) (a>b?a:b)
#define min(a,b) (ausing
namespace std;
int a[
5001][
2];long
long a[
5001];
int af[
5001];
int ls[
101]
;int x[51]
;int y[51]
;int x[51]
;int y[51]
;int d[
100001];
int bz[
100001];
long
long f[
101]
;int g[
101]
;int g[
101]
;int t,ed,n,n,p,i,i,j,k,l,len,mx,mn,h,t,mid,midd;
long
long ans,s;
void
new(
int x,
int y,
long
long w,
int flow)
void
new(
int x,
int y,
long
long w,
int flow)
long
longf(
long
long i)}fo
(i,1
,n)}
fo(i,
1,n)
while(1
)}bz[d[h]]=
0;}if
(f[ed]
<=
4611686018427387904ll
) ans+
=f[ed]
;else
break;
i=ed;
while
(i)}
return ans;
}int
main()
fo(i,
1,n)
y[i]
-=mn-1;
mx-=mn-1;
mn=1;
while
(mn+
5ans=inf;
fo(i,mn,mx)
printf
("%lld\n"
,ans);}
}
7 12 方陣迴圈右移 20 分
本題要求編寫程式,將給定n n方陣中的每個元素迴圈向右移m個位置,即將第0 1 n 1列變換為第n m n m 1 n 1 0 1 n m 1列。輸入格式 輸入第一行給出兩個正整數m和n 1 n 6 接下來一共n行,每行n個整數,表示乙個n階的方陣。輸出格式 按照輸入格式輸出移動後的方陣 即輸出n行...
7 17 方陣迴圈右移 20分
本題要求編寫程式,將給定n n方陣中的每個元素迴圈向右移m個位置,即將第0 1 n 1列變換為第n m n m 1 n 1 0 1 n m 1列。輸入格式 輸入第一行給出兩個正整數m和n 1 n 6 接下來一共n行,每行n個整數,表示乙個n階的方陣。輸出格式 按照輸入格式輸出移動後的方陣 即輸出n行...
7 2 方陣迴圈右移 20分
7 2 方陣迴圈右移 20分 本題要求編寫程式,將給定n n方陣中的每個元素迴圈向右移m個位置,即將第0 1 n 1列變換為第n m n m 1 n 1 0 1 n m 1列。輸入格式 輸入第一行給出兩個正整數m和n 1 n 6 接下來一共n行,每行n個整數,表示乙個n階的方陣。輸出格式 按照輸入格...