在賽場上,腦子就兩個字“二分”,一點思路都沒,完全不知道二分誰,怎么二分,從哪入手。隱隱約約也知道要變換公式,可惜沒堅持這個想法。腦子里全是把k分離出來,賽后看了題解才知道,應該把x分離出來。當時一直想著x相同,怎么確定,其實根本不用考慮這個,只要滿足條件的x有交集,就可以了,這也是解題關鍵。
#include<iostream>using namespace std;const int N=3e5+10;long long a[N],b[N],n;int check(int m){long long z=0,y=0x3f3f3f3f;for(int i=0;i<n;i++){z=max(a[i]-m*b[i],z);y=min(a[i]+m*b[i],y);if(z>y) return 0;}return 1;}void solve(){cin>>n;for(int i=0;i<n;i++){cin>>a[i];}for(int i=0;i<n;i++){cin>>b[i];}long long l=0,r=0x3f3f3f3f;while(l<r) {long long mid=l+r>>1;if(check(mid)) r=mid;else l=mid+1;}cout<<r<<'\n';}int main(){int t;ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>t;while(t--)solve();}
剛開始時間超限,原來是二分錯了,各種數據范圍,r的值,小細節都改了,沒想到是這兒。活該,模板都沒記住,昨天也是時間超限,完全不是思路代碼的問題,差個幾行,幾個變量,不會影響時間復雜度,往往有個從沒注意的點。
后來又答案錯誤,更不理解,這又能咋改,明明和我看似一樣的提交都對了,原來是ios::sync_with_stdio(0)…,只能放主函數,學長說了解原理就知道為什么了。
可笑的是,我把代碼給人家,別人改了改提交就對了,我照著改對的代碼改,怎么改都錯,我又把改對的照著我錯的改,怎么改還對。我都懷疑是不是針對我,我不配對?唉,每個錯誤總有奇怪的原因。