トピックに$のCDQの$の分割統治を参照して、$ Nを見つけ、M $は小さく、少し間違っを感じます
次に行き、正しい答えた問題の解決策を参照してください木の二次元配列であります
木の二次元と1次元配列はほぼ同じ持っているようですか?
構造体BIT { INT T [N] [N]。 インラインボイド追加(int型のx、int型の Y、int型V) { ため(; X <= Nであり、X + = X& - X) のための(INT J = yであり、j <= M; J + = J&-j)T [X] [J] + = V。 } インラインINTは(ASK INT X、int型のY) { int型 RES = 0 。 以下のための - (; X X- = X・X) のための(INT ; J; J = = J&-j J = Y)RES + = T [X] [J]。 リターン解像度; } }。
被験者の要件は差を考慮し、包含および除外の差分アレイによって元のプレフィックスの2次元配列を決定し、修正さ長方形の矩形を求められ、差分行列が$を$提供
次に、(B)、\当量X、Bの\当量yを$は場合にのみ$ X「\当量カウントされる二次元の接頭辞および問い合わせ$(x、y)は$、位置差分行列$用X、Y '\当量yを$と$ \の当量のX'、Bの\の当量yを「$
明らかに、この$(X 'Y')$有し$(X-A + 1)*(Y-B + 1)$ペア、この位置は$(B)$ $(Xにカウントされます-a + 1)*(Y-B + 1)$回、$ Aにそれほど貢献[A] [B] *(X-A + 1)*(Y-B + 1)$
リアオープン$(X-Y-XB + X-AY + AB-A + Y-B + 1)=(X-Y + X + Y + 1) - (X + 1)B-(Y + 1)A + AB $
だから、$限り、我々がそうであるように、二次元の接頭辞と問い合わせ$(x、y)は、オープン4つのフェンウィックツリーのメンテナンスの$ A [A] [B]、A [A] [B] * B、A [A] [Bについて] *、A [A] [B] * AB $へ
最後に、封入排除への答えは何ですか
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> 使用して 名前空間STD。 typedefの長い 長いLL。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1。CH =getchar関数(); } 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 2049、M = 2E5 + 7 。 INTのN、M。 構造体BIT { INT T [N] [N]。 インラインボイドが追加(int型のx、int型の yは、INT V) { 用 X <= N;(X + = X& -x)の ための(INT J = yであり、j <= M; J + = J&-j)T [X] [J] + = V。 } インラインINTは(ASK INT X、int型のY) { int型 RES = 0 。 以下のための - (; X X- = X・X) のための(INT ; J; J = = J&-j J = Y)RES + = T [X] [J]。 リターンのres; } } TはTi、Tjを、Tijを。 インラインボイド ADD(INTのx、int型の Y、INT V) { T.add(X、Y、V)。Ti.add(X、Y、V *バツ); Tj.add(X、Y、Vの *のY)。Tij.add(X、Y、Vの*第X *のY)。 } インラインintは(ASK int型のx、int型のy)を { 戻り T.ask(X、Y)*(のx * yを+ X + Y + 1)+ Tij.ask(x、y)は -Ti.ask(x、y)は*(Y + 1)-Tj.ask(X、Y)*(X + 1 )。 } int型のmain() { チャー S [ 7 ]。scanf関数(" %sの"、S); N = read()は、M = read()は、 int型、B、C、D、V。 しばらく(scanf関数(" %sを"、S)!= EOF) { =読み取る()、B =読み取る()、C =読み取る()、D = 読み取ります(); もし(S [ 0 ] == ' L ' ) { V =読み取ります()。(V、B)を加えます。ADD(C + 1 D、+ 1 、V)。 ADD(D + 1、-v)。ADD(C + 1、B、 - V)。 } 他のprintf(" %d個の\ n "、A-(ASK 1、B- 1)+(C、D)-ASK(A-ASK 1、D)-ASK(C、B- 1 ))。 } 戻り 0 。 }