2019年上海レースICPCネットワーク最適化畳み込み+ C FFT小規模な暴力

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}。
    } 
  } 
}

 

おすすめ

転載: www.cnblogs.com/nervendnig/p/11525240.html