BSOJ 3799 訓練場 貪心 倍增

2021-07-24 07:21:11 字數 1963 閱讀 3276

3799 -- 【模擬試題】訓練場

description

某中學有很多學生社團,其中電競社是最受歡迎的乙個。該社團中總共有n只遊戲戰隊,但是該中學只有乙個遊戲訓練場館,每次只能容納乙隻戰隊訓練。 

每只戰隊對訓練時間都有一定的要求,比如甲戰隊想要在a到b這段時間訓練,乙戰隊想要在c到d這段時間訓練,...... 

作為訓練場管理員的你總是收到形如(x,y)的詢問,意思是查詢在x到y這段時間內,最多能滿足多少個只戰隊訓練。現在有m個詢問擺在你面前,請你快速做出回答!

input

第一行,兩個整數n和m。 

接下來n行,每行兩個整數a和b,表示乙隻戰隊訓練的起止時間點。 

接下來m行,每行兩個整數x和y,表示乙個詢問的起止點。

output

m行,每行乙個整數,表示一次詢問的答案。

sample input

3 21 2

2 31 3

1 21 3

sample output12

hint

【資料範圍】 

x < y同時a < b。 0 <= x,y,a,b <= 1,000,000,000 

對於30%的資料,有0 < n,m <= 2000 

對於50%的資料,有0 < n,m <= 50000 

對於100%的資料,有0 < n,m <= 100000

作為當天考試壓軸題這道題還是充滿了震撼..畢竟當時too young,看到這道題就先去打了個線段樹,然後發現根本沒法維護..於是30分棄坑了。

前幾天看了看覆蓋牛棚(內網鏈結)的題解,發現這道題簡直神似,都使用了同樣的演算法:

倍增。

倍增主要拿來覆蓋區間的速度。

現在要二分乙個解,對於解的驗證,其速度相對較慢,舉乙個例子:

有線段a(st,ed),在這條線段後面,找出另一條線段b,使得a與b有交集,且b的右端點靠的最後。

樸素的演算法是一條一條線段地列舉,速度為o(n).

o(n)太慢了,考慮優化,將線段排序,獲得單調之後考慮二分,每次二分乙個mid,指在a後mid個,且與a重合的線段。我們發現這個mid還是要o(mid)走過去,還是較慢。

著重優化o(mid),記錄f[i][j]為i根欄杆後面連線的第2j根欄杆,再按照樸素的st推走即可。對於乙個mid,只需o(log(mid))就能找到這個元素。

- -感覺講的很爛,畢竟語文捉雞。還是回到這個題裡面。

對於這個問題,我們有乙個貪心策略:被包含的區間肯定比包含其的大區間更優,直接捨棄大區間。證明略。

這樣問題就轉化成了乙個統計問題:在給定區間(x,y)中,統計有多少個互不相交的區間(當然要保證最優)。

資料範圍使得o(n)演算法不能通過,現在就要用上倍增了。

設f[i][j]為i往右經過2^j個區間後第2^j區間(右端點座標最小(貪心保證結果最優))的區間編號。

#include#include#include#include#include#includeusing namespace std;

inline int read()

int ret=0;

while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();

return ret*bj;

}struct node

w[100005],a[100005];

int n,m,f[100005][21]=,top=0;

bool cmp(node x,node y)

n=top;

}void st()

; f[n+1][0]=n+1;

for(int i=1;i<=n;i++)

else l=mid+1;

} int k=log2(n)+1,ret=0;

for(int i=k;i>=0;i--)

{ if(a[f[ans][i]].ed<=y)

{ ret+=(1<

BSOJ 3800 染色 貪心

3800 四校聯考1 染色 description 人人生而平等,然而後來人們逐漸選擇了不同的道路,人與人之間,變得不再平等。你可能會因為染上惡人之色而墮落,成為社會的敗類 你也可能因為染上善人之色,而在逆境中不斷成長。但是,紅與黑並非絕對的。所謂 近朱者赤,近墨者黑 你能改變周遭的環境,那麼周遭的...

P3799 妖夢拼木棒

有 nn根木棒,現在從中選 4 根,想要組成乙個正三角形,問有幾種選法?答案對 10 9 7取模。輸入 第一行乙個整數 n。第二行 n 個整數,第 i 個整數 a i,代表第 i 根木棒的長度。輸出 一行乙個整數代表答案。主要是對長度進行計算和處理 因為ai的數值偏小。注意 using namesp...

BSOJ 4852 比賽 暴力優化

4852 模擬試題 比賽 description 有兩個隊伍a和b,每個隊伍都有n個人。這兩支隊伍之間進行n場1對1比賽,每一場都是由a中的乙個選手與b中的乙個選手對抗。同乙個人不會參加多場比賽,每個人的對手都是隨機而等概率的。例如a隊有a1和a2兩個人,b隊有b1和b2兩個人,那麼 a1 vs b...