一堆經典二分題

2021-07-24 17:23:47 字數 2345 閱讀 3065

蒟蒻考前攢人品

二分答案的應用範圍:

1.一些明顯的字眼:最小值最大或最大值最小

2.沒有什麼明顯的方法好來解決,且答案是滿足可二分性的,即答案變大變小check起來性質會不一樣

二分的思想很簡單,時間複雜度為log級的,有時候可以看資料範圍來想方法,大概幾十萬或百萬的資料就一般是log級複雜度

下面是二分的巨水板子

while(l<=r)

cout<

那麼一般有哪些比較好的check模型呢?讓我們來看一下幾道二分經典題

1.第一道:noip2011 聰明的質檢員----二分,check型別:字首和維護

題目概述:給定一列數和m個區間和s,要求確定乙個w值,令y=c格碼(每個區間大於等於w的數量)*(每個區間大於等於w的v的和);

使得abs(s-y)最小,也就是使y最接近s;

分析:1.該題的目的是要確定乙個w的使得對c格碼(每乙個區間裡》=w的數量)*(>=w的v的和)與

乙個給定的s最為接近

2.顯然w是滿足可二分性的,所以可以二分w,求出那個y,使其與s接近

3.那麼二分了w之後怎麼check出y來

4.區間裡》=w的數量和》=w的v的和顯然可以用字首和(用兩個)維護(o(n));

5.然後對於每段區間就可利用字首和相減再相乘求出區間裡的值,然後累加

6.如果y大水題就直接上標程了(最難得地方好像是看懂c格碼)

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

long long gi()

struct sb

p[1000000];

struct zz

e[1000000];

long long tot[1000000],w[1000000],ans=999999999999999999ll,n,m,s;

long long check(long long mid)//check二分出來的w

} for(long long i=1;i<=m;i++)

return y;

}int main()

for(long long i=1;i<=m;i++)

long long l=1,r=1ll<<40;

while(l<=r)//二分板子

int fre[1000010],cf[1000010],n,m;

struct sb

order[1000100];

bool check(int x)

int t=0;//記這個差分陣列的字首和

for(int i=1;i<=n;i++)//o(n)check每天 }

return 1;

}int main()

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

int l=1,r=m,ans=0;

while(l<=r)//二分板子

if(ans)

bool check(int x)

return 1;

}int main()

cout<

check型別:數學方法check

普通版應該都會了吧,二分乙個答案,看這個數使第幾小

1.題解中的check是看每一行有幾個比他小,因為這是乙個y=k*x的函式所以可以直接算出他在每行排第幾

2.優化方法,可以腦補出來這個比mid小的數量是乙個反比例函式,還記得r64的另一道求反比例函式求整點數吧,但不過這裡橫座標有乙個限制即小於等於n,

有沒有很熟悉,多加一點處理就行了,上標程了:

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

typedef long long ll;

ll n,m,q,k;

bool check(ll x)

if(i>=n) return ans>=k;

ans=ans*2-p*p;

for(i=1;i<=x/n;i++) ans-=(x/i-n);

return ans>=k;

}int main()

printf("%lld\n",l);

} return 0;

}

第五道題:noip2015 跳石頭

題目概述:應該都做過了吧,那我就不講了

分析:由於老師講過,直接上標程

#include#include#include#includeusing namespace std;

int dis[1000000],l,n,m,v[1000000];

int gi()

int check(int mid)

cout<

演算法題一堆

演算法題 說明 這些題就不是什麼花樣了,考的是你的基礎知識怎麼樣。再聰明而沒有實學的人都將會被這些題所淘汰。1.鍊錶和陣列的區別在 2.編寫實現鍊錶排序的一種演算法。說明為什麼你會選擇用這樣的方法?3.編寫實現陣列排序的一種演算法。說明為什麼你會選擇用這樣的方法?4.請編寫能直接實現strstr 函...

二分入門題

在乙個遞增的序列裡,查詢元素是否存在,若存在輸出yes,不存在輸出no.本題多組資料,首先輸入乙個數字n,然後輸入n個數,資料保證數列遞增,然後再輸入乙個查詢數字。若存在輸出yes,不存在輸出no.4 1 3 5 8 3 yes include include includeusing namesp...

二分模版題

給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。對於每個查詢,返回乙個元素k的起始位置和終止位置 位置從0開始計數 如果陣列中不存在該元素,則返回 1 1 輸入格式 第一行包含整數n和q,表示陣列長度和詢問個數。第二行包含n個整數 均在1 10000範圍內 表示完整陣列。接下來q行,每...