蒟蒻考前攢人品
二分答案的應用範圍:
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行,每...