日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Poetize6] IncDec Sequence

發布時間:2025/7/25 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。