1 条题解

  • 1
    @ 2023-3-19 11:56:50

    IncDec Sequence

    根据基本的差分思想,我们可以把区间操作转化为单点修改。 最终我们要的结果是:差分数组 bb 中的 b1b_100,其余为 00。 操作大致可以分为四类:

    1. 2lrn2\le l \le r \le n
    2. l=1,2rnl=1, 2\le r\le n,这个会对 b1b_1 产生影响;
    3. 2ln,r=n2\le l\le n, r=n
    4. l=1,r=nl=1, r=n。这个操作显然无意义。 假设我们统计出最初的 bbpp 个正数,qq 个负数,那么显然多用第一种操作更优,最多可以使用 min(p,q)\min(p,q) 次。剩下的只能使用操作二和三,需要 pq|p-q|次。因而第一问的答案是 min(p,q)+pq=max(p,q)\min(p,q)+|p-q|=\max(p,q)。 导致最终序列不同的因素就是操作二和三,两种加起来一共执行 pq|p-q|次,因此第二问答案是 pq+1|p-q|+1
    // 增减序列
    #include <bits/stdc++.h>
    #define int long long
    #define SIZE 100010
    #define all(x) x.begin(), x.end()
    #define debug(x) cout<<#x<<":"<<x<<endl;
    using namespace std;
    
    int d[SIZE]={0}, a[SIZE]={0};
    
    signed main()
    {
    	int n; scanf("%lld", &n);
    	for(int i=1; i<=n; i++) scanf("%lld", d+i);
    	for(int i=1; i<=n; i++) a[i]=d[i]-d[i-1];
    	int p=0, q=0;
    	for(int i=2; i<=n; i++)
    	{
    		if(a[i]>0) p+=a[i];
    		if(a[i]<0) q-=a[i];
    	}
    	printf("%lld\n%lld", max(p, q), abs(p-q)+1);
    
        return 0;
    }
    
    • 1

    信息

    ID
    3043
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    5
    上传者