3 条题解

  • 2
    @ 2026-3-10 10:28:18

    实际上这种操作区间使得数组到一个固定值(比如减少到全0)都可以用差分来做,而实际上的操作次数就是差分数组中正数的和,如果c[i]>0,表示需要在这段开始一个新的区间,所有c[i]>0的和,就是所有区间“起点”处的增量总和,也就是总的区间左端点选择次数。

    不过在这里我们算差分数组前需要将a里面的元素统一减1,因为目标是全1不是全0,最后统计加和输出结果即可。

    import sys
    input = lambda:sys.stdin.readline().strip()
    
    n=int(input())
    a=[0]+list(map(int,input().split()))+[0]
    c=[0]*len(a)
    
    for i in range(1,n+1):
        a[i] = a[i] - 1
    
    for i in range(1,n+1):
        c[i] = a[i] - a[i-1]
    
    ans=0
    for i in c:
        if i>0:ans+=i
    print(ans)
    
    • 0
      @ 2026-5-11 20:15:55
      
      
      import os
      import sys
      input = lambda:sys.stdin.readline().strip()
      minput = lambda:map(int, input().split())
      n = int(input())
      a = minput()
      prev = 1
      d = []
      for i in a:
          d.append(i - prev)
          prev = i
      r = 0
      t = [i for i in d if i > 0]
      print(sum(t))
      
      
      
      • -1
        @ 2026-3-29 14:29:17

        差分,注意ans开long long即可

        #include <bits/stdc++.h>
        using namespace std;
        int diff[100005];
        int a[100005];
        typedef long long ll;
        
        int main() {
        
            ios::sync_with_stdio(false);
            cin.tie(nullptr);
            
            int n;
            cin>>n;
            for(int i=1;i<=n;++i)
            {
                cin>>a[i];
                a[i]-=1;
                diff[i]=a[i]-a[i-1];
            }
            //int ans=0;
            ll ans=0;
            for(int i=1;i<=n;++i)
            {
                if(diff[i]>0)ans+=diff[i];
            }
            cout<<ans;
        
        
        
        
            return 0;
        
        }
        
        • 1

        信息

        ID
        335
        时间
        1000ms
        内存
        256MiB
        难度
        2
        标签
        递交数
        433
        已通过
        177
        上传者