【oj1741スルーNOI情報】電子速度説明

 

 

 

$ \ 100%の$のデータについては、$1≤n、m≤1e6\ \ 0 \1≤l_i、r_i≤n$ \ <= X_I、Y_I <20170927 \ \

 

 

 

$ソリューション:$

私は質問を理解していませんでした。以降、モーメントの一般的な理解は、x及びyは2つのパラメータを有する、いわゆる2次元のベクトルvです。その$ \ $回はクロス積、すなわち$(X_I y_j-X - jがY_I)$です。

そこで問題は、$ \和を求めて、各照会間隔$ [L、R] $のために、あなたのxとy配列の配列を与えることを意図している\限界_ {Lの\の当量iが<J \の当量のR}(x_iy_j-x_jy_i) ^ 2 $。修理と。

点の対あまりにも面倒で、単一のポイントに柿を試してみてください。

第1分割広場:

$の\和\制限X_I ^ 2y_j ^ 2-2x_ix_jy_iy_j + X - jが^ 2y_i ^ 2 $ _ {iがj個の\当量Rを<Lの\の当量}

各点を通って各点にかなりの貢献でカウントしました。そう:

$ \和\ limits_ {I = L} ^ R X_I ^ 2 \和\限界_ {i = L} ^ R Y_I ^ 2-(\和\ limits_ {I = L} ^ R x_iy_i)^ 2 $

次いで、3つのオープンフェンウィックツリーは、別々に$ {X_I} ^ 2、{Y_I} ^ 2、X_I Y_I $缶を維持しました。

 

書式#include <cstdioを> 
する#include <iostreamの> 
の#include <CStringの> 
名前空間stdを使用。
#define PA対<-1,11,11-> 
のtypedef長い長LL。
constのLL MOD = 20170927; 
LL読み出す()
{ 
    int型のx = 0、F = 1;チャーCH = GETCHAR()。
    (!isdigit(CH))、一方{IF(CH == ' - ')は、f = -1; CH = GETCHAR();} 
    ながら(isdigit(CH))X = X * 10 + CH-'0' 、CH = GETCHAR()。
    x * Fを返します。
} 
のconst int型N = 1E6 + 5。
N INT、M。
LL C [3] [N]。
PAのV [N]。
INTポンド(INT X){X&-x返す;} 
ボイド追加(INT X、LLヴァル、int型のID)
{ 
    ため(; X <= Nであり、X + = LB(x))を
        C [ID] [X] + =ヴァル、(C [ID] [X] + = MOD)%= MOD。
} 
LLクエリ(int型のx、int型のID)
    LLのRES = 0。
    (; X; X- = LB(X))のために
        (RES + = C [ID] [X])%= MOD。
    リターン(RES + MOD)%のMOD。
} 
(int型L、int型のR、int型のID)尋ねるちゃう
{ 
    リターン(クエリ(R、ID)-query(L-1、ID)+ MOD)%MOD。
} 
)(INTメイン
{ 
    N =()を読み出し、M =)(読み取ります。
    以下のために(INT i = 1; iが<= N; iは++)
    { 
        V [i]が1次回読み取り=()、V [i]は.second =読み取ります(); 
        追加(I、V [i]は1次回* V [i]が1次回、0); 
        追加(I、V [i]は.second * V [i]が.second、1)。
        追加(I、V [i]は1次回* V [i]の.second、2)。
    } 

    一方(M--)
    { 
        (読み取ら= OPをINT)。
        (OP == 1)場合は
        { 
            int型のposが=読み取ります();
            LL X =読み取る()、yは読み取ら=(); 
            追加(POSにおいて、X * XV [POS] 1次回* V [POS] 1次回、0); 
            追加(POS、Y軸* YV [POS] .second * V [POS] .second、1)。
            追加(POSにおいて、X * YV [POS] 1次回* V [POS] .second、2)。
            V [POSは] = xを1次回; V [POS] .second = Y。

        } 
        IF(OP == 2)
        { 
            (読み取らINT 1 =)、R =リード()。
            LLのRES =を尋ねる(L、R、0)*尋ねる(L、R、1)%のMOD、RES1 =尋ねる(L、R、2)。
            RESの=(RES-(RES1 * RES1の%のMOD)+ MOD)%MOD。
            printf( "%LLDする\ n"、RES)。
        } 
    } 
    0を返します。
}

 

おすすめ

転載: www.cnblogs.com/Rorschach-XR/p/11610934.html