JZOJ 4330 清華集訓模擬 幾何題

2021-08-14 19:11:49 字數 1428 閱讀 7778

這題的複雜度是o(

106log(106

))的fft(害怕.jpg)

預處理cnt[i][j][k]表示x,y,z的差為i,j,k的有多少對,

首先,xi−

xj可以變成xi

+(mx

−xj)

,(mx為最大xi

) 那麼每位都是非負數了,

現在要做3維的多項式乘法,

考慮用2mx進製儲存這三個數,壓在一起變乙個數,這樣就把3維變成1維了,直接用fft

剩下的就是卡常了,看我的**吧,

複雜度:o(

(77∗2

)3∗log((

77∗2)

3))

#include 

#include

#include

#define fo(i,a,b) for(register int i=a;i<=b;++i)

#define min(q,w) ((q)>(w)?(w):(q))

#define max(q,w) ((q)

#define pre(q) ((q)*(q))

#define js(q,w,e) ((q)*pre(mx+1)*4+(w)*(mx+1)*2+(e))

using namespace std;

typedef double db;

typedef long long ll;

const int m=(1

<<22)+5;

const db pi=acos(-1);

intread(int &n)

int m1,n,mx;

db ans;

struct z

friend z operator +(z q,z w)

friend z operator -(z q,z w)

friend z operator *(z q,z w)

}c1[m],c[m],ansf[m];

int b1[m],b2[m];

db ans[m];

void dft(z *a,int n,int k)

for(int i=2;i<=n;i<<=1)}}

if(k<0)fo(i,0,n-1)c[i].x=c[i].x/n;

}void fft()

dft(c1,m,-1);

}int main()

fft();

fo(i,0,2

*mx)}}

fo(i,1,m1)}}

printf("%.10lf\n",ans/(n-1.0)/n);

}return

0;}

JZOJ4330 清華集訓模擬 幾何題

也懶得解釋題目大意了 正解居然是fft fftff t?不要看題目的那個式子這麼長,也不要在那個式子上下手。其實我們會發現,不同的 xi xj,yi y j,zi zj x i x j,y i y j,z i z j xi x j y i y j z i z j 並不多。如果我們求出每個三元組的出現...

JZOJ4331 清華集訓模擬 樹

給你一棵帶點權的樹,求將樹變成一堆不相交的鏈,而且這些鏈的權值和非負的方案數。顯然這道題是個dpdp dp。首先求個字首和sum sumsu m。為了後面講述方便,我這樣設 fi,jf fi,j 表示以i ii為根的子樹,其中某條鏈從x xx伸出到i ii的方案數,而且sum x jsum x j ...

JZOJ4331 清華集訓模擬 樹

給你一棵帶點權的樹,求將樹變成一堆不相交的鏈,而且這些鏈的權值和非負的方案數。顯然這道題是個 dp 首先求個字首和 sum 為了後面講述方便,我這樣設 f 表示以 i 為根的子樹,其中某條鏈從 x 伸出到 i 的方案數,而且 sum x j 還有設 g i 表示以 i 為根的,沒有伸出去的鏈的方案數...