HDU5283 JZOJ4694 火神的魚

2021-07-16 16:10:43 字數 3002 閱讀 3305

###description

火神最愛的就是吃魚了,所以某一天他來到了乙個池塘邊捕魚。池塘可以看成乙個二維的平面,而他的漁網可以看成乙個與座標軸平行的矩形。

池塘裡的魚不停地在水中游動,可以看成一些點。有的時候會有魚游進漁網,有的時候也會有魚游出漁網。所以火神不知道什麼時候收網才可以抓住最多的魚,現在他尋求你的幫助。

他對池塘裡的每條魚都給予了乙個標號,分別從1到n標號,n表示池塘裡魚的總數。魚的游動可以概括為兩個動作:

1 l r d : 表示標號在[l,r]這個區間內的魚向x軸正方向游動了d個單位長度。

2 l r d:表示標號在[l,r]這個區間內的魚向y軸正方向游動了d個單位長度。

在某些時刻火神會詢問你現在有多少條他關心的魚在漁網內(邊界上的也算),請你來幫助他吧。

原題是【hdu5283】senior』s fish

###data constraint

對於30%的資料1≤n,m≤1000

對於100%的資料1≤t≤10,1≤n,m≤30000,1≤l≤r≤n. 1≤d≤109,x1≤x2,y1≤y2。保證任意時刻所有涉及的座標值在[−109,10^9]範圍內。

###solution

好像不好下手,樹套樹?

誒!d值為正,這說明魚只能向正方向遊,那麼每條魚至多進去漁網一次,出來一次。

這樣就可以用線段樹維護了。

我們對於橫座標和縱座標分別開一顆線段樹,維護兩個值,分別是沒有進入漁網的最大橫座標(或縱座標),在漁網內的最大橫座標(或縱座標),還有區間的答案。

於是就很好維護了,對於每次修改,我們暴力把每個跳進漁網(或跳出漁網)的位置單點修改再重構,由於每個點至多跳進一次跳出一次,所以時間複雜度上是保證的。

###code

#include

#include

#include

#define fo(i,j,k) for(int i=j;i<=k;i++)

#define fd(i,j,k) for(int i=j;i>=k;i--)

#define n 100001

#define inf 2147483647

using

namespace std;

int a[n]

,b[n]

;int x1,y1,x2,y2;

struct nodetx[n*4]

,ty[n*4]

;voidhb(

int v,

int l,

int r)

void

build

(int v,

int l,

int r)

int mid=

(l+r)/2

;build

(v*2

,l,mid)

;build

(v*2+1

,mid+

1,r);hb

(v,l,r);}

void

put1

(int v,

int l,

int r)

void

put2

(int v,

int l,

int r)

void

change1

(int v,

int l,

int r,

int x,

int y,

int z)

put1

(v,l,r)

;put2

(v,l,r)

;int mid=

(l+r)/2

;if(y<=mid)

change1

(v*2

,l,mid,x,y,z)

;else

if(x>mid)

change1

(v*2+1

,mid+

1,r,x,y,z)

;else

hb(v,l,r);}

void

change2

(int v,

int l,

int r,

int x,

int y,

int z)

put1

(v,l,r)

;put2

(v,l,r)

;int mid=

(l+r)/2

;if(y<=mid)

change2

(v*2

,l,mid,x,y,z)

;else

if(x>mid)

change2

(v*2+1

,mid+

1,r,x,y,z)

;else

hb(v,l,r);}

intfind

(int v,

int l,

int r,

int x,

int y)

void

del(

int v,

int l,

int r,

int op)

put1

(v,l,r)

;put2

(v,l,r)

;int mid=

(l+r)/2

;if(op==1)

else

hb(v,l,r);}

void

add(

int v,

int l,

int r,

int op)

else

return;}

put1

(v,l,r)

;put2

(v,l,r)

;int mid=

(l+r)/2

;if(op==1)

else

hb(v,l,r);}

intmain()

else

if(q==2)

else}}

}

HDU5283 JZOJ4694 火神的魚

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

JZOJ8月4日提高組反思

被一堆2018 2019 2020的巨佬暴打 又是愉快的爆0的一天呢 看了看題 沒想法暴力走起 求個質因數呀,二分呀 然後就炸了 正解預處理加二分 反思 對於輸出乙個數的,可以考慮預處理 還是暴力 也還是掛掉了 考試的時候想的是暴力遍歷每個區間然後統計答案 就炸了正解是線段樹 但是!水法 暴力 剪枝...

HDU 1568 Fibonacci 大數前4位

自 分析 x 1234567.求其前四位數 log10 x log10 1.234567 6.所以1.234567 10 log10 x 6 1234 int 10 log10 x 6 1000.6 length 4,length int log10 x 1 同時我們知道 對於小於10000的數字可...