Codeforces Round #540 (Div. 3) Coffee and Coursework
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Codeforces Round #540 (Div. 3) Coffee and Coursework
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                由于我是直接寫的hard版本的,而hard版本和easy版本只有數據范圍的差距,所以在此只闡述hard版本的題解(easy版也能過,但是easy的數據范圍應該還有其他方法可以偷跑過去)
假設x天可以完成,那么x+1天肯定可以,因為x+1天的第一杯咖啡是沒有損耗的(本題中由于每多一天,咖啡效果-1,所以記作孫損耗)
假設x天無法完成,那么x-1天肯定不行,因為x天起碼第一杯咖啡是沒有損耗的
故此,可看出本題中的天數具有單調性。
那二分得到單調性之后怎么處理呢?
先把n杯咖啡從小到大排序
假設我當前二分的天數是x天,那么我先把前x, 即[n - x + 1, n]最大的咖啡拿過來,然后我往前再拿x杯咖啡
直到當前的[l, r]中有某一個咖啡的大小是大于當前的損耗的,我再次二分找到這一個咖啡
假設是第t杯,我只用加上[t + 1, r]?- 損耗,然后我就不用再往前找咖啡了,因為必定是大于之后的損耗的
那么我把現在的咖啡的效果累加減去損耗后要是大于m,即二分可行,否則二分不行
這里,對于[l, r]的咖啡的值由于只涉及查詢不涉及更新,所以我用了前綴和維護
二分的效率是logN * logN,應該還沒有N大,所以可以看做是O(N)(應該吧)
#include<bits/stdc++.h> #define LL long long using namespace std; const int MAXN = 2e5 + 10;LL cs[MAXN], lei[MAXN]; int n, m;bool check(int x) {LL sum = 0, t = 0;int r = n, l = n - x + 1;while(1){int ans = -1;int tl = l, tr = r;while(tl <= tr){int mid = (tl + tr) >> 1;if(cs[mid] < t){ans = mid;tl = mid + 1;}elsetr = mid - 1;}if(ans == -1){sum += lei[r] - lei[l - 1] - (r - l + 1) * t;r = l - 1;l = (r - x + 1) >= 1 ? (r - x + 1) : 1;}else{if(ans == r){sum += 0;break;}else{sum += lei[r] - lei[ans] - (r - ans) * t;break;}}t ++;if(r < 1)break;}if(sum >= m)return 1;elsereturn 0; } int main() {LL maxx = 0;LL sum = 0;scanf("%d %d", &n, &m);for(int i = 1; i <= n; i ++){scanf("%d", &cs[i]);sum += cs[i];maxx = max (maxx, cs[i]);}if(sum < m){cout << -1 << endl;return 0;}sort (cs + 1, cs + n + 1);for(int i = 1; i <= n; i ++)lei[i] = lei[i - 1] + cs[i];//build(1, n, 1);//cout << 1 << endl;int l = 1, r = n, ans;while(l <= r){int mid = (l + r) >> 1;//cout << "! " << mid << endl;if(check(mid)){ans = mid;r = mid - 1;}elsel = mid + 1;}printf("%d", ans);return 0; }?
總結
以上是生活随笔為你收集整理的Codeforces Round #540 (Div. 3) Coffee and Coursework的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 正点原子ESP8266的使用
- 下一篇: 在微型计算机中硬件和软件的关系是_,计算
