2019牛客國慶集訓派對day3 H

2021-09-27 13:55:21 字數 1868 閱讀 7671

題意:動態插入一維線段端點為[li

,ri]

[l_i,r_i]

[li​,r

i​],查詢給定引數:[li

,ri]

[l_i,r_i]

[li​,r

i​],問有多少條線段可以覆蓋它。

我看了一眼感覺cdq可以寫我就寫了2333,複雜度是在o(n

∗log

2n∗l

og2n

)o(n*log_2n*log_2n)

o(n∗lo

g2​n

∗log

2​n)

。首先這個的維度看做三維,時間維,x左端點維,y右端點維,那麼如果我們將比較規則定義為時間,然後是x端點從小到大,修改優於查詢,那是不是在cdq過程中,遇到左邊的修改將y座標處+1,遇到右邊的查詢,查詢大於等於它的y座標的數量即可。

於是cdq+樹狀陣列即可解決該題。

當然題目還有乙個超級重要的條件,我寫完才發現2333,就是查詢的時候線段長度不超過3,於是可以直接開三個樹狀陣列,每插入一條線段記錄可行左端點即可(差分的形式,第乙個可行的位置加,第乙個不可行的位置減),所以其實是有乙個log的做法的,我菜了。

cdq分治:

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e5+7;

struct query

}query[maxn]

,temp[maxn]

;int sum[maxn]

;int n;

void

add(

int x,

int val)

intask

(int x)

int ans[maxn]

;void

cdq(

int l,

int r)

else

}while

(p<=mid)

while

(q<=r)

for(

int i=l;i<=mid;

++i)

if(query[i]

.type==1)

add(query[i]

.y,-1)

;for

(int i=

1;i<=o;

++i)

query[i+l-1]

=temp[i];}

intmain()

cdq(

1,q)

;for

(int i=

1;i<=hh;

++i)

}return0;

}

樹狀陣列:

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e5+7;

int sum[maxn][3

];int maxx=2;

int n;

void

add(

int x,

int val,

int id)

intask

(int x,

int id)

intmain()

else

printf

("%d\n"

,ask

(l,r-l));

}}return0;

}

2019牛客國慶集訓派對day1

雖然我國慶七天溜回家了,隊友還是督促我好好打比賽.畢竟現場賽也沒幾天了,好好練習哈 判斷矩陣是否存在子矩陣滿足 x 1 le x le x 2,y 1 le y le y 2 內全是1,其他地方為0。水題,暴力判斷一下即可。include includeusing namespace std cha...

2019牛客國慶集訓派對day7A題

題目理解 給你n,m,a在1到n中,b在1到m中,求a b 2016正整數對的個數 mod 1e9 7 題解 叉姐賊喜歡出這種題,不過確實這種題很好,這題是2016湖南省賽的題目,還有兩個類似的2017年四川省賽的2017和2018年湘潭邀請賽的2018 這幾個題都很像,不過考察的知識點各不相同,叉...

2019牛客國慶集訓派對day7 A 2016

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k special judge,64bit io format lld 給出正整數 n 和 m,統計滿足以下條件的正整數對 a,b 的數量 1.1 a n,1 b m 2.a b是 2016 的倍數。輸入包含不超...