CF535C Tavas and Karafs 二分 + 结论
生活随笔
收集整理的這篇文章主要介紹了
CF535C Tavas and Karafs 二分 + 结论
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
題意:
定義第iii個數是a+(i?1)?ba+(i-1)*ba+(i?1)?b,先有qqq個詢問,每次詢問給你l,t,ml,t,ml,t,m代表你可以操作ttt次,每次可以將最多mmm個數減111,每次都需要回答從lll開始, 最遠到第幾個數,能在執行完這些操作之后[l,r][l,r][l,r]內的數被減成000。
1≤a,b≤1e6,1≤q≤1e5,1≤l,t,m≤1e61\le a,b\le 1e6,1\le q\le 1e5,1\le l,t,m\le 1e61≤a,b≤1e6,1≤q≤1e5,1≤l,t,m≤1e6
思路:
顯然可以二分rrr的位置,讓后考慮怎么檢查答案。
這里有個結論,判斷這個區間是否能都被減到000需要滿足以下兩個條件:
第二個顯然,第一個背過就行。。
關于第一個的證明,lclclc有一個類似的題,貼個個鏈接:
鏈接
這個題的模型就是有mmm個電池,每個電池都有容量cic_ici?,有nnn個電腦,每個電腦每分鐘都需使用某個電池的一個電量,問能使所有電腦都正常運行的最長時間是多少。
這個題就是二分最長時間,設sum=∑min(ci,mid)sum=\sum min(c_i,mid)sum=∑min(ci?,mid),那么電腦能運行midmidmid分鐘的充要條件就是mid?n≤summid*n\le summid?n≤sum。
#include<bits/stdc++.h> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define Mid (tr[u].l+tr[u].r>>1) #define pb push_back using namespace std;const int N=1000010,INF=0x3f3f3f3f,mod=1e9+7; typedef long long LL;LL a,b,n;LL get(LL l,LL r) {LL n=r-l+1;LL st=a+(l-1)*b;LL ed=a+(r-1)*b;return n*(st+ed)/2; }void solve() {cin>>a>>b>>n;while(n--) {LL l,t,m;scanf("%lld%lld%lld",&l,&t,&m);LL ls=l,rs=1e9,ans=-1;while(ls<=rs) {LL mid=ls+rs>>1;if(get(l,mid)<=t*m&&a+(mid-1)*b<=t) ans=mid,ls=mid+1;else rs=mid-1;}printf("%lld\n",ans);} }int main() {int _=1;while(_--) {solve();}return 0; }總結
以上是生活随笔為你收集整理的CF535C Tavas and Karafs 二分 + 结论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩法多样不仅仅是手机秒变笔记本电脑手机秒
- 下一篇: 小鹏逆袭成功了?G9和P7车系10月销量