題意:動態插入一維線段端點為[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
g2n
∗log
2n)
。首先這個的維度看做三維,時間維,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 的倍數。輸入包含不超...