https://nanti.jisuanke.com/t/41400
大型のために、我々は、答えは畳み込み違法な状況を差し引いた後、$ N ^ 3 $で、値、およびB、AとC、CとBのデコンボリューションの配列に右折します
しかし、各時間範囲$ $ 1E5、及び畳み込みは6回、各回単一セットの複雑性を実行するため$ 6 * 2 ^ {CEIL(ログ(2N))} CEIL(ログ(2N))、N- = 1E5、CEIL(X)$が切り上げられ、
テストデータが100を設定する場合は、$ 2.8e9 $に達することができます
しかし、我々はデータの唯一の五分の一は$ n>は$ 1000を満たすためにことがわかりました
そのため、小規模なデータのために、我々は直接$ N ^ 2 $の暴力を使います
#include <ビット/ STDC ++ H> の#defineが長い長いっ (、II、B)の#define担当者のための(INT II =; II <= bの++ II) (B、II)当たりの#define (工程; ii> =; int型II = B - II)のための 名前空間stdを使用して、//ヘッド のconst int型MAXN = 4E5 + 10、MAXM = 2E6 + 10。 CONST LL INF = 0x3f3f3f3f、MOD = 1E9 + 7。 int型CASN、N、M、K、カセ= 1、L、R。 名前空間fastio {// @支持读取整数、字符串、输出整数@ BOOL isdigit(チャーC){戻りC> = 48個の&& C <= 57;} のconst int型maxsz = 1E7。 クラスfast_iostream {パブリック: チャーCH = get_char()。 BOOL ENDF = 1、フラグ。 チャーget_char(){ 静的チャーバッファー[maxsz]、* A =バッファー、* B =バッファー。 戻りB == &&(B =(=バッファ)+の関数fread(バッファ、1、maxsz、STDIN)、B == A)EOF:* ++;? } テンプレート<typenameにタイプ> フラグ= TMP = 0。 (!isdigit(CH)&& CH = EOF)一方{ ' - 'フラグ= CH ==; CH = get_char();}; IF(CH == EOF)戻りENDF = 0。 実行{TMP = CH-48 + TMP * 10;}ながら(isdigit(CH = get_char()))。 (フラグ)TMP = -tmp場合; 1を返します。 } INT get_str(チャー*列str){ CHAR * TMP = STR。 一方、(CH == '\ R' || CH == '\ n' || CH ==」「)CH = get_char()。 IF(CH == EOF)リターン(ENDF = 0)、* TMP = 0。 実行{*(TMP ++)= CH; CH = get_char();}ながら(CH = '\ R' && CH = '\ n'は&& CH =」「&& CH = EOF!!)。 *(TMP ++)= 0。 リターン(int型)(TMP-STR-1); } fast_iostream&演算子>> テンプレート<型名タイプ> fast_iostream&演算子>>(タイプ&TMP){get_int(TMP); *これを返す;} 演算子ブール値()constは{戻りENDF;} }。 } fastio :: fast_iostream IO。 CONSTダブルPI = ACOS(-1.0)。 構造体CP {ダブルX、Y;}; CP演算子*(CPのA、CPのB){リターン{AX * BX-AY *によって、斧* b.y + AYの*のBX};} CP演算子+(CP Aを、CPのB){リターン{a.x + BX };}によって、a.yの+ ; CP operator-(CP Aを、CPのB){リターン{AX-BX、AY-によって}} クラスフーリエ{パブリック: int型REV [MAXN]、LEN、PW。 INIT(int型N){無効 LEN = 1、PW = 0。 一方、(LEN <= N)LEN << = 1、PW ++。 担当者(I、0、lenの-1)REVの[I] = 0; 担当者(I、0、lenの-1)REV [I] =(REV [I >> 1] >> 1)|((I&1)<<(PW-1))。 } ボイドは、{(CP *、INTフラグ)を形質転換します 担当者(I、0、lenの-1)と(iはREVを<i])とスワップ([I]、[REV [I])。 用(INTミッド= 1;ミッド<LEN;中間<< = 1){ CP WN = {COS(PI / MID)、フラグ* SIN(PI / MID)}。 {(; J <LEN J + = R INT R =ミッド<< 1、J = 0)のための CP T = {1,0}。 用(int型のk = 0; K <ミッド; ++ kは、Tがt *のWN =)を{ CP X = [J + K]、Y = T * [ミッド+のJ + K]。 [J + K] = X + Y [J + K +中間]は、XYを=。 } } } 場合(フラグ== - 1)担当者(I、0、LEN)[I] .X / = LEN。 } } FFT。 【MAXN] INT [MAXN] B、[MAXN] C。 CP CNTA [MAXN]、CNTB [MAXN]、CNTC [MAXN]。 CPのRESA [MAXN]、RESB [MAXN]、RESC [MAXN]。 LLスマ[MAXN]、SUMC [MAXN]、[MAXN] SUMB。 CINの#define IO INTメイン(){ 担当者(I、1、n)がCIN >> C [i]は、 LL ANS = 1LL * N * N * N。 CIN >> CASN。 (加瀬<= CASN){一方 CIN >> N。 fft.init(1E5 + 1E5 + 2)。 IF(N <= 1000){ 担当者(I、1、n)がCIN >> [I]。 担当者(I、1、n)がCIN >> B [i]は、 ソート(C + 1、C + 1個の+ N)。 ソート(B + 1、B + 1個の+ N)。 ソート(+ 1、A + 1個の+ N)。 担当者(I、1、C [N])スマ[I] = 0; 担当者(I、1、n)の担当者(J、1、N)++スマ[[I] + B [J]。 担当者(I、1、C [N])スマ[I] + =スマ[I-1]; 担当者(I、1、N)ans- =スマ[C [I] -1]。 担当者(I 1、B [N])スマ[I] = 0; 担当者(I、1、n)の担当者(J、1、N)++スマ[[I] + C [J]。 担当者(I 1、B [N])スマ[I] + =スマ[I-1]; 担当者(I、1、N)ans- =スマ[B [i]が-1]。 担当者(I、1、[N])スマ[I] = 0; 担当者(I、1、n)の担当者(J、1、N)++スマ[C [I] + B [J]。 担当者(I、1、[N])スマ[I] + =スマ[I-1]; 担当者(I、1、N)ans- =スマ[I] -1]。 printf( "ケース#%dを:%LLDの\ nを"、加瀬++、ANS)。 持続する; } (I、1、N){受け取り CIN >> [I]。 CNTA [I] X ++。 } 担当者(I、1、N){ CIN >> B [i]は、 [I]、[B]は、x ++ CNTB。 } 担当者(I、1、N){ CIN >> Cの[I]。 CNTC [C [I] X ++。 } fft.transform(CNTA、1); fft.transform(CNTB、1); fft.transform(CNTC、1)。 担当者(I、0、fft.len-1){ RESA [I] = CNTB [I] * CNTC [I]。 RESB [I] = CNTA [I] * CNTC [i]は、 RESC [I] = CNTB [I] * CNTA [i]は、 } fft.transform(RESA、-1); fft.transform(RESB、-1); fft.transform(RESC、-1)。 担当者(I、1、fft.len-1){ スマ[I] =スマ[I-1] +(LL)(RESA [I] .X + 0.5)。 SUMB [I] = SUMB [I-1] +(LL)(RESB [I] .X + 0.5)。 SUMC [I] =のSUMC [I-1] +(LL)(RESC [I] .X + 0.5)。 } LL ANS = N * 1LLの* N * N。 担当者(I、1、N){ ans- =スマ[I] -1] + SUMB [B [I] -1] + SUMC [C [I] -1]。 } のprintf( "ケース#1%のD:%LLDする\ n"、加瀬++、ANS)。 担当者(I、0、fft.len){ CNTA [I] = CNTB [I] = CNTC [I] =(CP){0,0}。 } } }