校內模擬 火神的魚(分塊)(均攤分析)

2021-09-25 14:04:20 字數 2971 閱讀 4764

傳送門是不可能有的了

聯賽組今天考試的t3,覺得很有科學打臉價值就來寫一寫。

首先正解是乙個需要四棵線段樹的o(n

log⁡n+

mlog⁡n

)o(n\log n+m\log n)

o(nlogn+

mlogn)

做法,常數巨大。

本著科學打臉觀。我寫了乙個o((

n+m)

n)

o((n+m)\sqrt n)

o((n+m

)n​)

跑過了大多數人的線段樹。

其實卡常就是按照常規卡了一下,莫名其妙就跑進了3s3s

3s以內。由於加的東西是單調的,所以我們用最後的漁網的橫縱座標將平面切割成九塊。

但是實際上只有左下角四塊的點需要考慮,設立四個邊界。

每塊維護一下下一次出現需要跨邊界的點需要加多少x

xx和yyy。

每個點最多跨越三次邊界,在塊**現點跨越邊界的時候重構整塊,每個點對所在塊的重構次數貢獻是o(1

)o(1)

o(1)

的,每次重構複雜度是o(n

)o(\sqrt n)

o(n​

)的,單個塊重構的均攤複雜度為o(n

)∗o(

n)=o

(n

)o(\sqrt n)*o(\sqrt n)=o(n)

o(n​)∗

o(n​

)=o(

n)。一共有o(n

)o(\sqrt n)

o(n​

)塊,總複雜度為o(n

n)

o(n\sqrt n)

o(nn​)

散塊的修改也可以需要直接重構。每次最多重構兩塊,複雜度為o(m

n)

o(m\sqrt n)

o(mn​)

由於散塊的重構是卡滿了的,縮小塊長就可以輕易卡下常數。

**:

#include

#define ll long long

#define re register

#define gc get_char

#define cs const

namespace io

template

<

typename t>

inline t get()

inline

intgetint()

}using

namespace io;

using std::cerr;

using std::cout;

cs int n=

3e4+5;

#define x1 x_1

#define x2 x_2

#define y1 y_1

#define y2 y_2

int n,m;

int x1,x2,y1,y2;

int b,bcnt;

int bl[n]

,pl[n]

,pr[n]

,ans[n]

;int x[n]

,y[n]

,addx[n]

,addy[n]

,nxtx[n]

,nxty[n]

;inline

void

rebuild

(int id)

addx[id]

=addy[id]=0

;}inline

void

modify_x

(int l,

int r,

int d)

if(l==pl[bl[l]])

--l;

else

if(r==pr[bl[r]])

++r;

else

for(

int re i=bl[l]+1

;i;++i)if(

(addx[i]

+=d)

>=nxtx[i]

)rebuild

(i);

}inline

void

modify_y

(int l,

int r,

int d)

if(l==pl[bl[l]])

--l;

else

if(r==pr[bl[r]])

++r;

else

for(

int re i=bl[l]+1

;i;++i)if(

(addy[i]

+=d)

>=nxty[i]

)rebuild

(i);

}inline

intquery

(int l,

int r)

return res;}if

(l==pl[bl[l]

])res+

=ans[bl[l]];

else

if(r==pr[bl[r]

])res+

=ans[bl[r]];

else

for(

int re i=bl[l]+1

;i;++i)res+

=ans[i]

;return res;

}inline

void

solve()

bl[i]

=bcnt;

}bl[n+1]

=bcnt+1;

for(

int re i=

1;i<=bcnt;

++i)

rebuild

(i);

m=getint()

;int l,r,d;

while

(m--

)switch

(getint()

)}signed

main()

JZOJ 4694 火神的魚

在池塘裡用一張網 左下角x1,y1,右上角x2,y2 捕魚,網和池塘都是乙個矩形,池塘裡有n條魚,這些魚會四處游動,火神會在魚游動的間隙問你現在網裡有多少條魚。魚的游動可以概括為兩個動作 1 l r d 表示標號在 l,r 這個區間內的魚向x軸正方向游動了d個單位長度。2 l r d 表示標號在 l...

HDU5283 JZOJ4694 火神的魚

description 火神最愛的就是吃魚了,所以某一天他來到了乙個池塘邊捕魚。池塘可以看成乙個二維的平面,而他的漁網可以看成乙個與座標軸平行的矩形。池塘裡的魚不停地在水中游動,可以看成一些點。有的時候會有魚游進漁網,有的時候也會有魚游出漁網。所以火神不知道什麼時候收網才可以抓住最多的魚,現在他尋求...

HDU5283 JZOJ4694 火神的魚

火神最愛的就是吃魚了,所以某一天他來到了乙個池塘邊捕魚。池塘可以看成乙個二維的平面,而他的漁網可以看成乙個與座標軸平行的矩形。池塘裡的魚不停地在水中游動,可以看成一些點。有的時候會有魚游進漁網,有的時候也會有魚游出漁網。所以火神不知道什麼時候收網才可以抓住最多的魚,現在他尋求你的幫助。他對池塘裡的每...