這個題出得還是蠻好的其實。。要不是看到很多人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
41 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上,這只青蛙可以向前跳...