[Poetize6] IncDec Sequence
生活随笔
收集整理的這篇文章主要介紹了
[Poetize6] IncDec Sequence
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
有一個長度為\(n(n\leq 100000)\)的數列,每次可以給一個區間\([l,r]\)加1或者減1.問要多少次操作讓整個數列一樣,并求出最少操作的前提下,最終得到的數列有多少種。
Solution
有生之年自己想出來一道紫牌題還是很高興的。
看到這題立馬想到了差分。因為區間加可以轉化為端點加減,最后讓它們相等就是除了第一個元素剩下的都為0嘛!
那怎么找這個最小次數呢?我們發現,題目給的條件非常好,既可以加又可以減。那么對于差分數列的任意兩個數,只要它們符號不同,那就可以對這兩個元素進行操作。我們記錄\(sum1\)表示差分數組負數的個數,\(sum2\)記錄正數的個數。所以第一問的答案很顯然就是\(max(sum1,sum2)\)。那第二問呢?觀察到除了1以外的元素都變成0之后,第一個元素有多少種不同的方案,整個序列就有多少種不同的方案。假設\(sum1>sum2\)。我們先把所有的正數變為0,此時還需要操作\(sum1-sum2\)次。而每一次都可以選擇是否對第一個元素進行操作,所以第一個元素總共有\(sum1-sum2+1\)個可能。
Code
#include<cctype> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using std::min; using std::max; using std::swap; #define int long long const int N=100005;int n,sum1,sum2; int val[N],cf[N];inline int abs(int a){if(a<0) return -a;return a; }int getint(){int X=0,w=0;char ch=0;while(!isdigit(ch))w|=ch=='-',ch=getchar();while( isdigit(ch))X=X*10+ch-48,ch=getchar();return w?-X:X; }signed main(){n=getint();for(int i=1;i<=n;i++)val[i]=getint(),cf[i]=val[i]-val[i-1];for(int i=2;i<=n;i++){if(cf[i]<0) sum1+=cf[i];else sum2+=cf[i];}printf("%lld\n",max(abs(sum1),sum2));printf("%lld\n",abs(sum1+sum2)+1);return 0; }轉載于:https://www.cnblogs.com/YoungNeal/p/9674481.html
總結
以上是生活随笔為你收集整理的[Poetize6] IncDec Sequence的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 03-插入排序算法
- 下一篇: c/c++ 标准库 插入迭代器 详解