1 条题解

  • 0
    @ 2025-8-24 22:53:33

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar tder
    喵喵喵。

    搬运于2025-08-24 22:53:33,当前版本为作者最后更新于2023-12-24 20:36:19,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    伟大的不等式组。


    di(x)d_i(x) 表示第 ii 个植物经过 tt 天后的高度,有:

    di(x)=hi+t×aid_i(x)=h_i+t\times a_i

    根据 tt 的定义,若用 pip_i 表示 FJ 希望长到第 ii 高的植物,易得,对于 1xn1\le x\le n

    ptx+1=xp_{t_x+1}=x

    那么,若最少经过 kk 天后满足 FJ 的要求,显然有 dp1(k)>dp2(k)>>dpn(k)d_{p_1}(k)>d_{p_2}(k)>\cdots>d_{p_n}(k),即:

    $$\begin{cases} d_{p_1}(k)>d_{p_2}(k) \\ d_{p_2}(k)>d_{p_3}(k) \\ \cdots \\ d_{p_{n-1}}(k)>d_{p_n}(k) \\ \end{cases} $$

    分开来说,对于排名相邻的两个植物 x=pix=p_iy=pi+1y=p_{i+1},有 dx(k)>dy(k)d_{x}(k)>d_{y}(k),即 hx+k×ax>hy+k×ayh_x+k\times a_x>h_y+k\times a_y,化简得:

    (axay)k>hyhx(a_x-a_y)k>h_y-h_x

    分类讨论 axaya_x-a_y 的正负:

    • axay>0a_x-a_y>0,即 ax>aya_x>a_y 时,有 k>hyhxaxayk>\frac{h_y-h_x}{a_x-a_y}
    • axay<0a_x-a_y<0,即 ax<aya_x<a_y 时,有 k<hyhxaxayk<\frac{h_y-h_x}{a_x-a_y}
    • axay=0a_x-a_y=0,即 ax=aya_x=a_y 时,有 0>hyhx0>h_y-h_x,即 hx>hyh_x>h_y
      • hx>hyh_x>h_ykRk\in\mathbb{R}
      • 反之,若 hxhyh_x\le h_y,无解。

    此时我们得到了 n1n-1 个不等式。其中,有 l1l_1 个不等式 kk 大于某值,l2l_2 个不等式 kk 小于某值,l3l_3 个结果 kRk\in\mathbb{R},以及 l4l_4 个无解。

    l4>0l_4>0,显然无解,输出 1-1。由于 kRk\in\mathbb{R},可以忽略所有 l3l_3 个结果。接下来考虑剩余的 l1l_1k>q1ik>q1_il2l_2k<q2ik<q2_i。那么,根据初中课本中的「同大取大,同小取小」,易得 k>max(q1i)k>\max(q1_i)k<min(q2i)k<\min(q2_i)。合并,得:

    max(q1i)<k<min(q2i)\max(q1_i)<k<\min(q2_i)
    • max(q1i)<min(q2i)\max(q1_i)<\min(q2_i),且区间 (max(q1i),min(q2i))(\max(q1_i),\min(q2_i)) 中至少含有 11 个正整数,则 k=max(q1i)+1k=\lfloor\max(q1_i)\rfloor+1
    • 反之,则无解。

    时间复杂度 O(Tn)O(T\cdot n)


    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N = 2e5 + 5, M = 1e9 + 5;
    int T, n, h[N], a[N], t[N], p[N];
    double q1 = -1, q2 = N;
    int work() {
        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];
            p[t[i] + 1] = i;
        }
        if(n == 1) return 0;
        q1 = -1, q2 = M;
        for(int i = 1; i < n; i++) {
        	int x = p[i], y = p[i + 1];
    		if(a[x] > a[y]) q1 = max(q1, 1.0 * (h[y] - h[x]) / (a[x] - a[y]));
    		else if(a[x] < a[y]) q2 = min(q2, 1.0 * (h[y] - h[x]) / (a[x] - a[y]));
    		else if(h[x] <= h[y]) return -1; 	
    	}
        if(q1 < q2) {
    		double r = floor(q1) + 1; 
    		if(r < q2) return r;
    		else return -1;
    	} else return -1;
    }
    signed main() {
        cin>>T;
        while(T--) cout<<work()<<endl;
        return 0;
        // f(i) = h[x] + i * a[x], g(i) = h[y] + i * a[y]
    	// f(i) > g(i)
    	// h[x] + i * a[x] > h[y] + i * a[y]
    	// (a[x] - a[y]) * i > (h[y] - h[x]) 
    	// 1. a[x] - a[y] > 0, i > (h[y] - h[x]) / (a[x] - a[y])
    	// 2. a[x] - a[y] < 0, i < (h[y] - h[x]) / (a[x] - a[y])
    	// 3. a[x] - a[y] = 0, 0 > (h[y] - h[x])
    	//   I.  h[y] - h[x] < 0, i in R
    	//   II. h[y] - h[x] >= 0, i in empty
    }
    
    • 1

    信息

    ID
    9591
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者