zoukankan      html  css  js  c++  java
  • 【BZOJ 3043】 3043: IncDec Sequence (差分)

    3043: IncDec Sequence

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 589  Solved: 332

    Description

    给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。
    问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。

    Input

    第一行一个正整数n 
    接下来n行,每行一个整数,第i+1行的整数表示ai。

    Output

    第一行输出最少操作次数
    第二行输出最终能得到多少种结果

    Sample Input

    4
    1
    1
    2
    2

    Sample Output


    1
    2

    HINT

    对于100%的数据,n=100000,0<=ai<2147483648

    Source

    【分析】

      脑子真的是越来越屎了。。

      膜了一下wohenshuai。。

      

      差分,就是-1和+1,-1,+1操作,要全部变成0,显然第一问是max(正数和,负数和)[绝对值]
      第二问是正值和与负值和[绝对值]差值+1,因为剩下那个数自己消的情况下也可以和1一起消。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 #define LL long long
     8 #define Maxn 100010
     9 
    10 LL a[Maxn],ss[Maxn];
    11 
    12 int main()
    13 {
    14     int n;
    15     scanf("%d",&n);
    16     for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    17     for(int i=2;i<=n;i++) ss[i]=a[i]-a[i-1];
    18     LL a1=0,a2=0;
    19     for(int i=1;i<=n;i++) if(ss[i]>0) a1+=ss[i];
    20     else a2+=-ss[i];
    21     printf("%lld
    %lld
    ",max(a1,a2),abs(a1-a2)+1);
    22     return 0;
    23 }
    View Code

    2017-04-11 21:12:14

  • 相关阅读:
    js上传照片本地预览
    2020年6月23日第一次面试题(外派PA)
    笔记
    2020VUE系统回顾与学习
    2019最全前端面试问题及答案总结
    常见的浏览器兼容性问题总结
    Vue咖啡app项目总结
    跨域问题研究总结
    Class.forName()用法及与new区别
    反射
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6696310.html
Copyright © 2011-2022 走看看