2 条题解

  • 0
    @ 2025-10-8 17:07:32

    A10 差分 二维差分
    A10 差分 二维差分(内网)

    /*
    转化问题:首先用差分的思想:b[i]=a[i]-a[i-1],每次对差分数组的两个点做加或减的操作,最后使得b[2]到b[n]都为0,。
    转化操作:对a[l]~a[r]都+1,等价于 b[l] += 1,b[r+1] -= 1
    
    1、如何保证操作次数最小,使得b[2]到b[n]都为0?
    
    (1)、b数组可能有负有正,利用贪心的思想 差分数组数组的操作b[l] += 1,b[r+1] -= 1的特性可以使正负两个数相消1,
    所以最后差分就只剩同符号的数,此时操作数为min(pos,neg)//pos为差分数组中正数和,neg为负数和。
    (2)、剩下的同符号的数只能通过b[1]或者b[n+1]两个对差分数组没有影响的来一个一个的把非零数变为0,操作次数为个abs(pos-neg);
    
    2.种类数量为什么是abs(pos-neg)+1
    数列的值就是b[1]的值。最后的 abs(pos-neg) 次操作,可以操作b[1],也可以操作b[n+1](此时b[1]不变)。 
    
    */
    #include<bits/stdc++.h>
    using namespace std;
    const int N  = 1e5+10;
    int b[N],a[N];
    int main()
    {
        int n;cin>>n;
        for(int i = 1;i <= n;i++)
    	{
            cin>>a[i];
            b[i] = a[i] - a[i-1];
        }
        long long pos=0,neg=0;
        for(int i = 2;i <= n;i++)
    	{
            if(b[i] > 0) pos += b[i];
            else  neg -=b[i];
        }
        cout<<min(pos,neg)+abs(pos-neg)<<endl;
        cout<<abs(pos-neg) + 1;
        return 0; 
    }
    
    • 0
      @ 2025-10-8 17:07:22

      A10 差分 二维差分

      A10 差分 二维差分(内网)

      /*
      转化问题:首先用差分的思想:b[i]=a[i]-a[i-1],每次对差分数组的两个点做加或减的操作,最后使得b[2]到b[n]都为0,。
      转化操作:对a[l]~a[r]都+1,等价于 b[l] += 1,b[r+1] -= 1
      
      1、如何保证操作次数最小,使得b[2]到b[n]都为0?
      
      (1)、b数组可能有负有正,利用贪心的思想 差分数组数组的操作b[l] += 1,b[r+1] -= 1的特性可以使正负两个数相消1,
      所以最后差分就只剩同符号的数,此时操作数为min(pos,neg)//pos为差分数组中正数和,neg为负数和。
      (2)、剩下的同符号的数只能通过b[1]或者b[n+1]两个对差分数组没有影响的来一个一个的把非零数变为0,操作次数为个abs(pos-neg);
      
      2.种类数量为什么是abs(pos-neg)+1
      数列的值就是b[1]的值。最后的 abs(pos-neg)次操作,可以操作b[1],也可以操作b[n+1](此时b[1]不变)。 
      
      
      */
      #include<bits/stdc++.h>
      using namespace std;
      const int N  = 1e5+10;
      int b[N],a[N];
      int main()
      {
          int n;cin>>n;
          for(int i = 1;i <= n;i++)
      	{
              cin>>a[i];
              b[i] = a[i] - a[i-1];
          }
          long long pos=0,neg=0;
          for(int i = 2;i <= n;i++)
      	{
              if(b[i] > 0) pos += b[i];
              else  neg -=b[i];
          }
          cout<<min(pos,neg)+abs(pos-neg)<<endl;
          cout<<abs(pos-neg) + 1;
          return 0; 
      }
      • 1

      A10*【差分】[Poetize6] IncDec Sequence

      信息

      ID
      4708
      时间
      1000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      110
      已通过
      31
      上传者