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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CH - 0304 IncDec Sequence(差分+思维)

發(fā)布時(shí)間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CH - 0304 IncDec Sequence(差分+思维) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:點(diǎn)擊查看

題目大意:給定一個(gè)長(zhǎng)度為 n(n≤10^5 ) 的數(shù)列 {a_1,a_2,…,a_n},每次可以選擇一個(gè)區(qū)間 [l,r],使下標(biāo)在這個(gè)區(qū)間內(nèi)的數(shù)都加一或者都減一。求至少需要多少次操作才能使數(shù)列中的所有數(shù)都一樣,并求出在保證最少次數(shù)的前提下,最終得到的數(shù)列可能有多少種。

題目分析:雖然是看過(guò)大藍(lán)書之后再來(lái)做這個(gè)題的,但還是有一些細(xì)節(jié)沒有想明白,想了好半天才算是消化了這個(gè)題目,真的是一道質(zhì)量很好的差分,對(duì)于這個(gè)題目而言,我們想要用最少的操作數(shù)讓最后的數(shù)列都變?yōu)橐粋€(gè)相同的數(shù)字,我們可以先統(tǒng)計(jì)一下一開始相鄰兩個(gè)數(shù)字之間的差(區(qū)分正負(fù)),因?yàn)槭强梢詤^(qū)間操作的,普通的差分是b[l]+=,b[r+1]--,所以我們貪心的策略,首先匹配正負(fù)不同的,也就是正負(fù)可以相互抵消,我們?cè)O(shè)pos儲(chǔ)存的是正數(shù)的和,neg儲(chǔ)存的是負(fù)數(shù)的絕對(duì)值之和,那么就有min(neg,pos)的正數(shù)和負(fù)數(shù)可以互相抵消,現(xiàn)在還剩下了abs(neg-pos)的正數(shù)或負(fù)數(shù)無(wú)法兩兩抵消,那么我們可以將其與左右兩端的兩個(gè)邊界相互匹配,一共是需要匹配abs(neg-pos)次,這樣第一個(gè)答案就是min(nge,pos)+abs(neg-pos)=max(neg,pos),因?yàn)橹饕詈蟠鸢傅牟顒e是出在最后全正或全負(fù)的值與端點(diǎn)匹配的過(guò)程中,所以一共能組成不同的方案也是有abs(neg-pos)+1種,也就是第二問(wèn)的答案了,相信對(duì)于第一問(wèn)的最小值肯定沒有什么疑問(wèn)了,主要是第二問(wèn)的abs(neg-pos)+1還是比較難想的,換種表達(dá)方式吧,假如現(xiàn)在我們剩下了k=abs(neg-pos)+1的正數(shù),這是一個(gè)什么概念?當(dāng)前序列要么是一個(gè)非嚴(yán)格遞增的序列,要么是一個(gè)非嚴(yán)格遞減的序列,那么我們的答案就可以在這個(gè)區(qū)間內(nèi)浮動(dòng),也就是0~abs(neg-pos)中一共有abs(neg-pos)+1個(gè)數(shù),都可以當(dāng)做最終的答案

舉個(gè)很簡(jiǎn)單的例子來(lái)理解一下吧:

1 3 5 3

差分后的答案為(從第二項(xiàng)開始處理,意思就是無(wú)視第一項(xiàng))

1 2 2 -2

我們優(yōu)先匹配正負(fù)數(shù),顯然一個(gè)-2匹配一個(gè)2,那么匹配完成后序列就變成了:

1 3 3 3(答案唯一)

這個(gè)時(shí)候的差分為:

1 2 0 0

我們現(xiàn)在的目標(biāo)是要對(duì)于2這個(gè)點(diǎn)與左端點(diǎn)匹配或右端點(diǎn)匹配,現(xiàn)在有三種方案:

  • 與右端點(diǎn)匹配兩次,每次都減一,得到的差分為1 0 0 0,答案序列為1 1 1 1
  • 與左端點(diǎn)匹配一次,加一,與右端點(diǎn)匹配一次,減一,得到的差分為2 0 0 0,答案序列為2 2 2 2
  • 與左端點(diǎn)匹配兩次,每次都加一,得到的差分為3 0 0 0,答案序列為3 3 3 3
  • 大概就是這么個(gè)意思了,還是需要多多琢磨啊,這個(gè)題目的代碼很簡(jiǎn)單,但是思維卻很復(fù)雜

    代碼:

    #include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int a[N];int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int n;scanf("%d",&n);LL p=0,q=0;//q:維護(hù)負(fù)數(shù)的權(quán)值和的絕對(duì)值,p:維護(hù)正數(shù)的權(quán)值和for(int i=1;i<=n;i++)scanf("%d",a+i);for(int i=2;i<=n;i++)if(a[i]-a[i-1]>0)p+=a[i]-a[i-1];elseq+=a[i-1]-a[i];cout<<max(p,q)<<endl<<llabs(p-q)+1<<endl;return 0; }

    ?

    總結(jié)

    以上是生活随笔為你收集整理的CH - 0304 IncDec Sequence(差分+思维)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。