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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeForces - 1284B New Year and Ascent Sequence(乱搞)

發(fā)布時(shí)間:2024/4/11 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1284B New Year and Ascent Sequence(乱搞) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

題目大意:規(guī)定一個(gè)數(shù)列中在不改變內(nèi)部順序的前提下,至少存在著一組(i,j)滿足:

  • i<j
  • a[i]<a[j]
  • 就稱該數(shù)列為上升數(shù)列,現(xiàn)在給出n組數(shù)列,每兩組數(shù)列可以進(jìn)行拼接操作,即Sx={1,2,3},Sy={4,5,6},Sx+Sy={1,2,3,4,5,6},Sy+Sx={4,5,6,1,2,3},現(xiàn)在問n^2種組合可以組成多少個(gè)上升數(shù)列

    題目分析:挺綜合的一道題目吧,情況得討論清楚,不然很容易過了第一個(gè)樣例然后過不去第二個(gè)樣例。。不過這個(gè)題目的樣例給的很良心,三個(gè)樣例都過掉基本上就已經(jīng)AC了

    首先我們可以給數(shù)列分類,分為上升數(shù)列,如{0,2,0,2},也就是單獨(dú)拿出來就是一個(gè)上升數(shù)列,剩下的就是非上升數(shù)列,非上升數(shù)列也包括兩種,一種是下降數(shù)列,也就是{8,8,7,7,6,6},還有一種是相等的數(shù)列,如{6,6,6},下降數(shù)列和相等數(shù)列我們姑且視為一種數(shù)列,分完類后我們稱上升數(shù)列為up,其他數(shù)列為down,則有下列四種組合方式:

  • up1+up2:上升數(shù)列
  • up+down:上升數(shù)列
  • down+up:上升數(shù)列
  • down1+down2:如果down1中的最小值小于down2中的最大值,則是上升數(shù)列,否則不是
  • 分析到這里就差不多了,我們可以預(yù)處理出所有的上升數(shù)列,因?yàn)橹灰蜕仙龜?shù)列有組合關(guān)系的數(shù)列組合后的新數(shù)列一定是上升數(shù)列,那么對答案的貢獻(xiàn)為2*(n-1)+1,n-1代表的是除了當(dāng)前上升數(shù)列之外的n-1個(gè)數(shù)列與其拼接,前后為兩種情況,故乘二,最后的加一是其本身前后拼接而成的,不過需要注意一點(diǎn),也是卡了我好久的一個(gè)細(xì)節(jié),如果有多個(gè)上升數(shù)列,在處理第一個(gè)上升數(shù)列時(shí),n-1個(gè)其他數(shù)列中也會存在上升數(shù)列,所以會重復(fù),我們可以選擇在處理完第一個(gè)上升數(shù)列后記錄一下,以后再處理類似情況的時(shí)候就不再記錄就好了

    剩下的就是用簡單dp模擬第四種情況了,可以枚舉n次,讓每一個(gè)數(shù)列位于前面的位置時(shí)的貢獻(xiàn),也可以記錄讓每一個(gè)數(shù)列位于后面時(shí)的貢獻(xiàn),看個(gè)人喜好吧

    最后就是記得開longlong,第一發(fā)沒開longlong白給了一發(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=1e6+100;int dp[N],mmax[N],vis[N];//dp[i]:從0~i有多少個(gè)最小值,mmax[i]:第i個(gè)數(shù)列的最大值,vis[i]:第i個(gè)數(shù)列是否為上升數(shù)列int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int n,nn;LL ans=0;scanf("%d",&n);nn=n;//用nn標(biāo)記還剩多少個(gè)數(shù)列,用來專門處理上升數(shù)列重復(fù)計(jì)算的情況for(int i=1;i<=n;i++){int mmin=inf;mmax[i]=-inf;int num;scanf("%d",&num);while(num--){int x;scanf("%d",&x);mmin=min(mmin,x);mmax[i]=max(mmax[i],x);if(x>mmin)vis[i]=true;}if(vis[i])//如果當(dāng)前數(shù)列為上升數(shù)列,計(jì)算貢獻(xiàn),并令nn--,后續(xù)不再重復(fù)計(jì)算{ans+=2*(nn-1)+1;nn--;}elsedp[mmin]++;}for(int i=1;i<N;i++)//維護(hù)一下dp數(shù)組dp[i]+=dp[i-1];for(int i=1;i<=n;i++){if(!vis[i])ans+=dp[mmax[i]-1];}printf("%lld\n",ans);return 0; }

    ?

    總結(jié)

    以上是生活随笔為你收集整理的CodeForces - 1284B New Year and Ascent Sequence(乱搞)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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