暴力n^2思路:
O(n^2)
伪代码
while(1)
{
++day;
for(i~n) h[i]+=a[i];计算当前的高度//n
sort(h[i])//logn
bool flag = false;
for(1~n)//n
if(rank[i]!=高度[i])
flag = true;
if (!flag)
cout << day,break;
if (day >= 1e6) cout << -1,break; //自定义无解的情况
}
nlogn思路:计算每个不等式并交集求出x的L和R,如果区间存在输出L,不存在则无解
小于x==小于等于x上取整-1 大于x==大于等于x下取整+1
const int mod = 1e9 + 7;
const int N = 2e5 + 10,T = 20;
int n;
LL h[N],a[N],t[N];
LL rk[N];
void solve()
{
cin >> n;
for (int i = 1;i <= n;i ++) cin >> h[i];
for (int i = 1;i <= n;i ++) cin >> a[i];
for (int i = 1;i <= n;i ++) cin >> t[i],rk[t[i] + 1] = i;
LL l = 0,r = inf;
for (int i = 1;i < n;i ++)
{
LL A = h[rk[i]] - h[rk[i + 1]],B = a[rk[i + 1]] - a[rk[i]];
if (B > 0) r = min(r,(LL)ceil((double)A / B) - 1);
else if (B < 0) l = max(l,(LL)floor((double)A / B) + 1);
else
{
if (A <= 0)
{
cout << -1 << endl;
return;
}
}
}
if (l > r) cout << -1 << endl;
else cout << l << endl;
}