hdu 7088 卷业务模型分析
三分非正解,没有证明出 ( m x − m n ) (mx-mn) (mx−mn) 是严格先递减再递增的
(杭电上是 A A A 了,应该是数据没有被卡到)
分析:
- 转换问题:将 ∣ . . . ∣ < = 10 |...|<=10 ∣...∣<=10 转换成 ( 最 大 差 值 − 最 小 差 值 ) / 2 < = 20 (最大差值-最小差值)/2<=20 (最大差值−最小差值)/2<=20
- k ∈ [ − ∞ , + ∞ ] , ( m x − m n ) 先 递 减 再 递 增 k\in[-\infty,+\infty],(mx-mn)先递减再递增 k∈[−∞,+∞],(mx−mn)先递减再递增,用三分查询即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int a1[N], a2[N], b[N];
int cal(int k,int n)
{
int mx=-1e18, mn=1e18, t;
for(int i=1;i<=n;i++)
{
t=b[i]-a1[i]*k;
mx=max(mx,t); mn=min(mn,t);
}
int ans=(mx-mn)>>1; // (最大差值-最小差值)/2
return ans;
}
int solve(int n)
{
int l=-1e6+5, r=1e6+5;
while(l<=r)
{
int lmid=l+(r-l)/3, rmid=r-(r-l)/3;
if(cal(lmid,n) > cal(rmid,n)) l=lmid+1;
else r=rmid-1;
}
int ans=1e9;
ans=min(ans,cal(l,n));
return ans;
}
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a1[i];
for(int i=1;i<=n;i++) cin>>a2[i];
for(int i=1;i<=n;i++) cin>>b[i];
if(solve(n)<=10) cout<<"1"<<endl;
else cout<<"2"<<endl;
}
return 0;
}