bzoj_4590_[shoi2015]自動刷題機_二分答案
曾經發明了訊號增幅儀的發明家shtsc又公開了他的新發明:自動刷題機--一種可以自動ac題目的神秘裝置。自動
刷題機刷題的方式非常簡單:首先會瞬間得出題目的正確做法,然後開始寫程式,每秒,自動刷題機的**生成模
塊會有兩種可能的結果:
a.寫了x行**。
b.心情不好,刪掉了之前寫的y行**。(如果y大於當前**長度則相當於全部刪除。)
對於每個oj所有題目,存在某個固定的長度n>0。一旦自動刷題機在某秒結束時積累了大於等於n行的**,它就會
自動提交並ac此題,然後新建乙個檔案開始寫下一題。shtsc在某個oj上跑了一天的自動刷題機,得到了很多條關
於寫**的日誌資訊。他突然發現自己沒有記錄這個oj的n究竟是多少。所幸他通過自己在oj上的rank知道了機一
共切了k道題。希望你計算n可能的最小值和最大值。
第一行兩個整數l,k,表示刷題機的日誌一共有l行,一共了切了k題。
第二行l個整數,x1…xl。xi>=0表示寫了xi行**。xi<0表示刪除了這道題的-xi行**。
1<=l,k<=100000,|xi|<=10^9
輸出兩個數a,b。分別代表n可能的最小值和最大值。如果不存在這樣的n則輸出-1。
4 225-3
93 7
//樣例1:如果n=2那麼刷題機就會切掉3題。但如果n>7刷題機最多只能切1題。考慮n=4發生了什麼。
第一秒:刷題機寫了2行。
第二秒:刷題機又寫了5行,共有7行,提交,自信ac。
第三秒:刷題機刪掉了3行,共有0行。
第四秒:刷題機寫了9行,共有9行,提交,自信ac。
一共ac了兩題。
二分答案x,然後求範圍的兩端即可,然而難點在輸出-1。
可能是無論n多小或無論多大都不能得到k,需要判斷l和r跟邊界的關係。
也可能是不存在這樣的n使得正好得到k,需要判斷範圍的左端點是否大於右端點。
**:
#include #include #include using namespace std;typedef long long ll;
#define n 100050
#define inf (1ll<<60)
int n,k,a[n];
ll ans1;
int check(ll x)
}else
}return re;
}int main()
ll l=1,r=inf;
while(l>1ll;
if(check(mid)>k) l=mid+1;
else r=mid;
}ans1=l;
if(l==inf)
l=1,r=inf;
while(l>1ll;
if(check(mid)>=k) l=mid+1;
else r=mid;
}if(ans1>l-1) puts("-1");
else printf("%lld %lld\n",ans1,l-1);
}
BZOJ4590 Shoi2015 自動刷題機
分析 這道題很噁心.那個 1卡了我一會兒,其他的部分很簡單。我們能夠看出,解題個數和n相關,並且形成不下降序列,那麼我們可以二分找到第乙個滿足解題數為k和最後乙個滿足解題數為k的位置 判斷兩件事,1 check 1 k 2 ans1 ans2 附上 include include include i...
Bzoj3562 神器化合物 Shoi 2014
ac通道 分析 若把每乙個原子看作乙個節點,將化學鍵看作一條邊,那麼這個題目要求的 分子的個數 很容易就可以看出是求圖中聯通塊的個數。求聯通塊的個數,可以使用並查集。可如何求出每一步的聯通塊的個數呢?可以知道,當連上一條邊時,若此邊連線的是兩個不同的聯通塊,那麼分子個數就會減一 當刪去一條邊時,若刪...
BZOJ4590 自動刷題機
比賽的時候想到了用二分 貪心,二分的部分與貪心的部分也寫對了,但是由於資料範圍未看沒有開long long,且二分左端點賦值過小導致wa掉 二分 的長度,貪心判斷能否達到,演算法上沒什麼好說的,主要是細節處理上 開long long 右端點資料可以開的盡量大一點 輸出 1的點要特別小心 includ...