二分常用技巧

2021-09-12 13:13:31 字數 1653 閱讀 9868

從小到大,公升序排列

lower_bound(s,t,num):s-->t-1,查詢到第乙個大於或等於num的數的位址,不存在返回t

upper_bound(s,t,num):s-->t-1,查詢到第乙個大於num的數的位址,不存在返回t

從大到小,降序排列

lower_bound(s,t,num):s-->t-1,查詢到第乙個小於或等於num的數的位址,不存在返回t

upper_bound(s,t,num):s-->t-1,查詢到第乙個小於num的數的位址,不存在返回t

求出總和不小於s的連續子串行的長度

普通方法

時間複雜度o(nlgn)

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

int n,s;

int a[100010];

int sum[100010];///所有元素都大於0,所以是公升序排列

void solve()

int main()

sum+=f[i];//記錄i前面k-1個數的操作和

if(i-k+1>=0)//當記錄f的值大於k個就要減去多餘的

sum-=f[i-k+1];

}for(int i=n-k+1;i=0)

sum-=f[i-k+1];

}return res;

}void solve()

}printf("%d %d\n",k,m);

}int main()

;const int dy[5]=;

//輸入

int n,m;

int tile[20][20];

int opt[20][20];//儲存最優解

int flip[20][20];//記錄是否翻轉

//查詢(x,y)的顏色

int get(int x,int y)

}if(res<0)//無解

printf("impossible\n");

else

else//k為奇數

}void solve()

}ps[i]=make_pair(sw,sv);

}//去除多餘元素,使重量和價值都從小到大排列

sort(ps,ps+(1<>j&1)

}if(sw<=w)

}printf("%lld\n",res);

}int main()

;const int dy[4]=;

//輸入

int w,h,n;

int x1[maxn],x2[maxn],y1[maxn],y2[maxn];

//標記

bool fld[maxn*6][maxn*6];

//對x1,x2進行座標離散化,並返回離散化之後的寬度

int compress(int *x1,int *x2,int w)}}

}printf("%d\n",ans);

}int main()

solve();

}//10 10 5

//1 6 4 4

//1 10 8 8

//4 4 1 10

//9 9 1 5

//10 10 6 10

二分小技巧

有一些題目,常常會用到二分,但無良的出題人總是會卡人們的二分。比方說你每次二分總要分滿log次,而且還總要分n次,這樣效率就變成了n log n 很是gg。但是思考發現我們的二分存在乙個小問題,就是說右端點總是被卡死的,如果解決這個瓶頸,便能實現不被卡。而能二分說明它一定有二分性質,也就是說我們可以...

關於二分的使用技巧

對於二分的使用,通過做題有了一定的認識,以noip2015運輸計畫與noip2015跳石頭為例,可以發現乙個較為重要的二分方式 1.對於題一,其要求的值為最大值最小,其二分方式就應該為 mid l r 1,r mid,l mid 1的方式,而對於題二,其要求為最小值最大,其二分方式就應該為 mid ...

1128 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...