計蒜客模擬賽5 D2T2 螞蟻搬家

2022-05-11 10:45:18 字數 3304 閱讀 8857

很久很久以前,有很多螞蟻部落共同生活在一片祥和的村莊裡。但在某一天,村莊裡突然出現了乙隻食蟻獸,螞蟻們為了保全性命而決定搬家。

然而這個村莊四面環山,想要離開這個村莊必須要從地洞裡離開,村子裡一共有 2n2n2n 個地洞,分布在山的左右,一邊 nnn 個。左邊的任意乙個地洞都可以通到右邊 nnn 個地洞中的任意的乙個,如圖所示(兩側地洞從上至下編號為 111 到 nnn)。

對於右邊的第 iii 個出口,附近有數量為 wiw_iw​i​​ 的食物。

現在前後依次來了 qqq 個螞蟻部落,第 iii 個部落有 aia_ia​i​​ 只螞蟻,它們會從左邊第 bib_ib​i​​ 個地洞離開,並且選擇乙個右側的出口,出口的食物必須大於等於 aia_ia​i​​,如果有多個滿足要求的出口,則選擇距離 bib_ib​i​​ 最近的(假設螞蟻從右邊的編號為 kkk 的地洞出來,那麼距離定義為 ∣k−bi∣|k-b_i|∣k−b​i​​∣)。如果有多個洞口符合要求,選擇編號最小的出口離開,並且佔據這個出口數量為 aia_ia​i​​ 的食物,當前洞口的食物數量減少 aia_ia​i​​。

請輸出每群螞蟻會選擇哪個出口,如果沒有符合要求的出口,輸出 −1-1−1,並且忽略這群螞蟻。

第一行兩個整數 nnn 和 qqq。

接下來 nnn 行,每行乙個整數 wiw_iw​i​​,表示右方第 iii 個洞口的食物數量。

接下來 qqq 行,每行兩個整數 aia_ia​i​​ 和 bib_ib​i​​,表示螞蟻數量和它們離開的洞口。

一共 qqq 行,每行乙個整數,表示第 iii 群螞蟻會選擇哪個出口。

對於 30%30\%30% 的資料:n,q≤3000n,q \le 3000n,q≤3000。

對於 60%60\%60% 的資料:n,q≤100000n,q \le 100000n,q≤100000。

對於另外 20%20\%20% 的資料保證:ai=1a_i=1a​i​​=1。

對於 100%100\%100% 的資料:n,q≤500000n,q \le 500000n,q≤500000,ai,wi≤109a_i,w_i \le 10^9a​i​​,w​i​​≤10​9​​,bi≤nb_i \le nb​i​​≤n。

樣例輸入 2

樣例輸出 2

原始的剩餘食物為 9,8,6,10,59,8,6,10,59,8,6,10,5。

查詢 4,54,54,5,選擇第 555 個洞口出來,剩下食物為 9,8,6,10,19,8,6,10,19,8,6,10,1。

查詢 2,52,52,5,選擇第 444 個洞口出來,剩下食物為 9,8,6,8,19,8,6,8,19,8,6,8,1。

查詢 8,18,18,1,選擇第 111 個洞口出來,剩下食物為 1,8,6,8,11,8,6,8,11,8,6,8,1。

查詢 9,39,39,3,這時候沒有滿足條件的洞口了,忽略之。

查詢 3,13,13,1,選擇第 222 個洞口出來,剩下食物為 1,5,6,8,11,5,6,8,11,5,6,8,1。

忽略每行輸出的末尾多餘空格

樣例輸入

5 5

9 8 6 10 5

4 52 5

8 19 3

3 1

樣例輸出

541

-12對於30%的資料:n≤300直接暴力找就好

對於60%的資料:題目要求相當於找距離bi最近的且大於等於ai的位置

這個可以用二分位置+線段樹求區間min實現

複雜度 o(n lg n)

如果沒有nb的卡常技巧大概是過不了100分的

對於另外20%的資料:ai =1

相當於找距離i最近的值≥1的點,我們考慮線段樹之外的做法

維護兩個並查集,分別指向當前點往上第乙個不為0的點和往下第乙個不為0的點。

複雜度o(nlgn) 。

對於 100% 的資料:

依然考慮用線段樹維護,假設現在要找編號小於i的距離i最近的點

我們記錄乙個陣列pos[i]表示代表位置i的線段樹的葉子節點的編號,然後從這個節點往上找

如果當前點是fa的左兒子,什麼也不做,然後向fa走一步

如果當前點是fa的右兒子,如果fa的左兒子中的最大值≥a[i],那麼遞迴在fa的左兒子中找答案,現

在區間是一整個節點,就可以利用線段樹的二分結構往下找。

否則什麼也不做,然後向fa走一步。

向右同理

複雜度o(nlgn)

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int inf=2e9;

8int n,q,w[500001],c[2000001],l[2000001],r[2000001],pos[500001];9

void pushup(int

rt)10

13void build(int rt,int l,int

r)14

22int mid=(l+r)/2

;23 build(rt*2

,l,mid);

24 build(rt*2+1,mid+1

,r);

25pushup(rt);26}

27void update(int rt,int l,int r,int x,int

d)28

34int mid=(l+r)/2;35

if (x<=mid) update(rt*2

,l,mid,x,d);

36else update(rt*2+1,mid+1

,r,x,d);

37pushup(rt);38}

39int take1(int rt,int

x)40

45int take2(int rt,int

x)46

51int find1(int rt,int

x)52

58int find2(int rt,int

x)59

65int

main()

66 72 build(1,1

,n);

73while (q--)

7487

else

8893}94

}95 }

計蒜客NOIP模擬賽 2 D2T2紫色百合

問題描述 牽著你的手的是她,路邊開滿了紫色的百合花 你從夢中醒來,卻依然忘不了夢中的 她百合花,每朵百合花都有乙個權值,在二進位制下寫成一行 1 第 i朵紫色百合的權值在二進位制下寫成i個 1 你想挑出其中一些組成 一束百合花 且價值在二進位制下恰好為乙個 1 後面p個 0 那麼有多少種挑選方案呢?...

計蒜客NOIP模擬賽4 D1T2小X的密室

小 x 正困在乙個密室裡,他希望盡快逃出密室。密室中有 n個房間,初始時,小 x 在 1號房間,而出口在 n號房間。密室的每乙個房間中可能有著一些鑰匙和一些傳送門,乙個傳送門會單向地創造一條從房間 x到房間 y的通道。另外,想要通過某個傳送門,就必須具備一些種類的鑰匙 每種鑰匙都要有才能通過 幸運的...

常州模擬賽d8t2 繪畫

分析 考慮記錄每個座標上每個顏色出現了幾次,並由此算出每個顏色 在這個座標上的貢獻。答案肯定是原圖的答案扣去矩形的答案,再加 上那個矩形同種顏色的貢獻,這裡的答案指的是 dis.我們先要記錄每個顏色在各個位置出現的次數,因為每一次都是區間操作嘛,所以我們用二維差分可以很好地維護,字首和求出出現的次數...