【无标题】

暴力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;
	
}	





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值