傳送門是不可能有的了
聯賽組今天考試的t3,覺得很有科學打臉價值就來寫一寫。
首先正解是乙個需要四棵線段樹的o(n
logn+
mlogn
)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 火神的魚
火神最愛的就是吃魚了,所以某一天他來到了乙個池塘邊捕魚。池塘可以看成乙個二維的平面,而他的漁網可以看成乙個與座標軸平行的矩形。池塘裡的魚不停地在水中游動,可以看成一些點。有的時候會有魚游進漁網,有的時候也會有魚游出漁網。所以火神不知道什麼時候收網才可以抓住最多的魚,現在他尋求你的幫助。他對池塘裡的每...