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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

題目鏈接:點擊查看

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

  • i<j
  • a[i]<a[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},現在問n^2種組合可以組成多少個上升數列

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

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

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

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

    最后就是記得開longlong,第一發沒開longlong白給了一發。。

    代碼:

    #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有多少個最小值,mmax[i]:第i個數列的最大值,vis[i]:第i個數列是否為上升數列int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int n,nn;LL ans=0;scanf("%d",&n);nn=n;//用nn標記還剩多少個數列,用來專門處理上升數列重復計算的情況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])//如果當前數列為上升數列,計算貢獻,并令nn--,后續不再重復計算{ans+=2*(nn-1)+1;nn--;}elsedp[mmin]++;}for(int i=1;i<N;i++)//維護一下dp數組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; }

    ?

    總結

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

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