+離散シングルポイントの更新間隔の和+

https://codeforces.com/contest/1311/problem/F

問題の意味:あるN座標軸上の点、各点XI(重複しない)の位置、及び固定速度VIを有するが、点との間のすべての最短距離を求めます。

溶液:分析が適切XI> YI && VI> YIとの最短距離XIイルすることができ、そうでなければ0です。

Xによってソート、統計座標なければならないと速度がXI VI座標とSUM1およびSUM2の数よりも小さいよりも小さくなっています。

そう別個であるので、Vの広い範囲のSUM2 - ポイントの寄与はSUM1 * XIをカウントすることができます。

#include <ビット/ STDC ++ H> 
のtypedef長い長LL。
#define INT LL 
の#define MOD 1000000007 
の#define GCD __gcd 
の#define REPは(i、jは、N)のための(INT iがjは=; I <= N; I ++)
赤の#define(I、N、j)のための(INT I = N; I> = J; i--)
の#define ME(x、y)はmemsetの(X、Y、はsizeof(X))
// LL LCM(-1,11,11- B){(* B / GCDを返します、B);} 
ながら(B){IF(B&1)ANS = ANS *%のMOD; //は(-1,11,11- B){LL ANS = 1をquickpowちゃうB >> = 1、A = A * %のMOD;}戻りANS;} 
ため; // INT euler1(INT X){int型のANSは= X IF(X%I == 0){ANS(INTがI = 2、I ++; iは<= X *) - = ANS / Iは、一方(X%I == 0)は、x / = I;}もし(X> 1)ans- = ANS / X;戻りANS;}
// CONST INT N = 1E7 + 9。INT VIS [n]は、素数[n]は、PHI [N]; int型euler2(INT N){ME(VIS、TRUE); INT LEN = 1;担当者(I、2、N){IF(VIS [I] ){プライム[LEN ++] = I、PHI [i]は= I-1;}の(INT J = 1; J <LEN &&プライム[J] * I <= nであり、j ++){VIS [i *が素数[J] = 0;(I%プライム[j] == 0){;ブレーク; PHI [I *プライム[J] = PHI [I] *プライム[J]}もしそうでなければ{PHI [iが素数[Jを*]] = PHI [I] * PHI [プライム[J]];}}}戻りLEN}
PII [MAXN]。
INT B [MAXN]、lenの; 
INT lowerbit(INT X){
#define SCのscanf 
の#define INF 0x3f3f3f3f 
の#define PIのACOS(-1)
の#define PII対<整数、整数> 
の#define Fiの第一
の#define SE第二
の#define LSON Lを、中間ルート<< 1つ
の#define rsonミッド+ 1 、R、根<< 1 | 1 
名前空間stdを使用。
const int型MAXN = 2E5 + 9。
const int型N = 10000; 
int型S1 [MAXN]、S2 [MAXN]。
    リターンX&( - x)は、
} 
ボイド追加(int型のx、int型のval){ 
    (x <= LEN)一方、{ 
        S1 [X] ++; 
        S2 [X] + =ヴァル。
        X + = lowerbit(X)。
    } 
} 
int型getsum(int型のx、int型の[]){ 
    int型ANS = 0。
    一方、(X){ 
        ANS + = S [X]。
        X - = lowerbit(X)。
    } 
    ANSを返します。
} 
ボイド解く(){ 
    int型のn; 
    cinを>> N; 
    担当者(I、1、N){ 
        CIN >> [I] .fi。
    } 
    担当者(I、1、N){ 
        CIN >> [I] .SE。
        B [I] = [I] .SE。
    } 
    INT ANS = 0。 
    ソート(B + 1、B + 1 + N)。
    ソート(+ 1、+ 1 + N)。
    LEN =一意(B + 1、B + 1個の+ N) - B - 1。
    担当者(I、1、N){ 
        int型POS = LOWER_BOUND(B + 1、B + 1 + LEN、[I] .SE) - B。
        INT SUM1 = getsum(POS、S1)、SUM2 = getsum(POS、S2)。
        ANS + = SUM1 * [I] .fi - SUM2。
        (POS、[I] .fi)を加えます。
    } 
    COUT << ANS << ENDL。

}

署名されたメイン()
{ 
    IOS :: sync_with_stdio(偽)。
    cin.tie(0)。cout.tie(0)。
    // int型トン。
    // cinを>>トン。
    //一方、(T - ){ 
        )(解きます。
    //} 
}

 

おすすめ

転載: www.cnblogs.com/nonames/p/12387557.html