很久很久以前,有很多螞蟻部落共同生活在一片祥和的村莊裡。但在某一天,村莊裡突然出現了乙隻食蟻獸,螞蟻們為了保全性命而決定搬家。
然而這個村莊四面環山,想要離開這個村莊必須要從地洞裡離開,村子裡一共有 2n2n2n 個地洞,分布在山的左右,一邊 nnn 個。左邊的任意乙個地洞都可以通到右邊 nnn 個地洞中的任意的乙個,如圖所示(兩側地洞從上至下編號為 111 到 nnn)。
對於右邊的第 iii 個出口,附近有數量為 wiw_iwi 的食物。
現在前後依次來了 qqq 個螞蟻部落,第 iii 個部落有 aia_iai 只螞蟻,它們會從左邊第 bib_ibi 個地洞離開,並且選擇乙個右側的出口,出口的食物必須大於等於 aia_iai,如果有多個滿足要求的出口,則選擇距離 bib_ibi 最近的(假設螞蟻從右邊的編號為 kkk 的地洞出來,那麼距離定義為 ∣k−bi∣|k-b_i|∣k−bi∣)。如果有多個洞口符合要求,選擇編號最小的出口離開,並且佔據這個出口數量為 aia_iai 的食物,當前洞口的食物數量減少 aia_iai。
請輸出每群螞蟻會選擇哪個出口,如果沒有符合要求的出口,輸出 −1-1−1,並且忽略這群螞蟻。
第一行兩個整數 nnn 和 qqq。
接下來 nnn 行,每行乙個整數 wiw_iwi,表示右方第 iii 個洞口的食物數量。
接下來 qqq 行,每行兩個整數 aia_iai 和 bib_ibi,表示螞蟻數量和它們離開的洞口。
一共 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=1ai=1。
對於 100%100\%100% 的資料:n,q≤500000n,q \le 500000n,q≤500000,ai,wi≤109a_i,w_i \le 10^9ai,wi≤109,bi≤nb_i \le nbi≤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 #include6using
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.我們先要記錄每個顏色在各個位置出現的次數,因為每一次都是區間操作嘛,所以我們用二維差分可以很好地維護,字首和求出出現的次數...