牛客練習賽11E(最近點對)

2021-08-15 02:27:18 字數 1448 閱讀 4357

這個題出得還是蠻好的其實。。要不是看到很多人a了窩可能就被數學勸退了。。

表面是數學題,那個函式分析一下就會發現和距離公式很像。。設h(x)為a的字首和,那f(x)就是h(x)上2點之間的距離,即求h(x)上的最近點對。。

然後關於最近點對窩是沒學過。。然後由汪聚聚提供了模板。。過後要學。。

可以很容易發現這個是個分治演算法。。。而且合併時候複雜度相當危險。。

一開始用的時候果然t了,分析了一下發現x太小而y太大,導致d相對於x來說是個比較大的數,那麼很可能在合併的時候就將所有點加進去了。。。所以可以考慮將x和y互換,這樣d和y就在同一數量級,篩選x距離小於d這個操作就能發揮作用了。。。

#include#include#include#include#include#include#define inc(i,l,r) for(int i=l;i<=r;i++)

#define dec(i,l,r) for(int i=l;i>=r;i--)

#define link(x) for(edge *j=h[x];j;j=j->next)

#define eps 1e-8

#define inf 100000000000000ll

#define mem(a) memset(a,0,sizeof(a))

#define ll long long

#define succ(x) (1<>1)

#define nm 100005

#define nm 600005

#define pi 3.141592653

using namespace std;

int read()

while(isdigit(ch))x=x*10+ch-'0',ch=getchar();

return f*x;

}ll a[nm];

int n,tmp[nm];

struct p

int main()

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

給你乙個長為n的序列a

定義f(i,j)=(i-j)2+g(i,j)2

g是這樣的乙個函式

求最小的f(i,j)的值,i!=j

第一行乙個數n

之後一行n個數表示序列a

輸出一行乙個數表示答案
示例1

4

1 0 0 -1

1

對於100%的資料,2 <= n <= 100000 , |ai| <= 100

牛客練習賽11

求距離時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 給你乙個1 n的排列,現在有一次機會可以交換兩個數的位置,求交換後最小值和最大值之間的最大距離是多少?第一行乙個數n 之後一行n個數表示這個排列輸出一行乙個數表示...

牛客20180601練習賽19 E

已知第i個瓶子的品牌為ai,且其能開啟bi品牌的瓶子.問有幾瓶飲料托公尺無法喝到.被用於開啟飲料瓶的瓶子不一定需要被開啟.乙個瓶子不能開啟其本身.輸入描述 第一行乙個整數n,表示飲料的瓶數.接下來n行,每行兩個整數ai,bi.輸出描述 輸出一行乙個整數,表示小托公尺無法喝到的飲料瓶數.示例1 輸入 ...

牛客網練習賽24 E青蛙

有乙隻可愛的老青蛙,在路的另一端發現了乙個黑的東西,想過去一 竟。於是便開始踏上了旅途 一直這個小路上有很多的隧道,從隧道的a進入,會從b出來,但是隧道不可以反向走。這只青蛙因為太老了,所以很懶,現在想請你幫幫慢,問他最少需要幾步才可以到達對面。將小徑看作一條數軸,青蛙初始在0上,這只青蛙可以向前跳...