在赛场上,脑子就两个字“二分”,一点思路都没,完全不知道二分谁,怎么二分,从哪入手。隐隐约约也知道要变换公式,可惜没坚持这个想法。脑子里全是把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)…,只能放主函数,学长说了解原理就知道为什么了。
可笑的是,我把代码给人家,别人改了改提交就对了,我照着改对的代码改,怎么改都错,我又把改对的照着我错的改,怎么改还对。我都怀疑是不是针对我,我不配对?唉,每个错误总有奇怪的原因。