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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[CF1082E] Increasing Frequency

發布時間:2023/12/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [CF1082E] Increasing Frequency 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

給定一個長度為 \(n\) 的數列 \(a\) ,你可以任意選擇一個區間 \([l,r]\) ,并給區間每個數加上一個整數 \(k\) ,求這樣一次操作之后數列中最多有多少個數等于 \(c\)

\(n,c,a_i\leq 10^5\)

Solution

假設當前選擇區間的右端點為 \(r\),那我們要強制將 \(a_r\) 這個元素變為 \(c\),不然可以通過讓右端點 \(-1\) 使答案變得不劣。

同理,如果我們左端點 \(l\) 的元素 \(a_l\) 也要讓其強制等于 \(a_r\),不然同樣可以通過讓左端點 \(+1\) 使答案變的不劣。

所以這個性質告訴我們選中的區間 \([l,r]\) 一定滿足 \(a_l=a_r\)

這啟發我們對于每種取值分開做

\(f(x)\) 是右端點為 \(x\) 時最多有多少個元素取到 \(c\) 。

考慮列出 \(DP\)

\(f(x)=\max \left\{pre(las-1)+count(las,x)+suf(x+1)\right\}\),其中 \(pre(i)\) 表示從 \(1\sim i\) 有多少個元素為 \(c\),同理 \(suf(i)\) 表示從 \(i\sim n\) 有多少個元素為 \(c\), \(count(l,r)\) 表示在區間 \([l,r]\) 里有多少個元素等于這個區間的端點即 \(a_r\)

發現如果拿 \(vector\) 存的話這是一個單調隊列優化 \(DP\) 的標準式子

隨便優化一下就吼了

Code

#include<bits/stdc++.h> using std::min; using std::max; using std::swap; using std::vector; typedef double db; typedef long long ll; #define pb(A) push_back(A) #define pii std::pair<int,int> #define all(A) A.begin(),A.end() #define mp(A,B) std::make_pair(A,B) const int N=5e5+5;vector<int> v[N]; int n,m,val[N],vis[N],q[N],hd; int pre[N],suf[N],tot[N],tail;int getint(){int X=0,w=0;char ch=getchar();while(!isdigit(ch))w|=ch=='-',ch=getchar();while( isdigit(ch))X=X*10+ch-48,ch=getchar();if(w) return -X;return X; }signed main(){n=getint(),m=getint();for(int i=1;i<=n;i++)val[i]=getint(),pre[i]=pre[i-1]+(val[i]==m),v[val[i]].pb(i);for(int i=n;i;i--)suf[i]=suf[i+1]+(val[i]==m);int ans=0;for(int i=1;i<=n;i++){if(!vis[val[i]]){vis[val[i]]=1;hd=1,tail=0;for(int j=0;j<v[val[i]].size();j++){while(hd<=tail and pre[ v[ val[i] ][ j ] -1 ]-j>=pre[ v[ val[i] ][ q[tail] ] -1 ]-q[tail]) tail--;q[++tail]=j;if(hd<=tail) ans=max(ans,pre[ v[ val[i] ][ q[hd] ] -1 ]+j-q[hd]+1+suf[ v[ val[i] ][ j ] +1 ]);}}} printf("%d\n",ans);return 0; }

轉載于:https://www.cnblogs.com/YoungNeal/p/10142992.html

總結

以上是生活随笔為你收集整理的[CF1082E] Increasing Frequency的全部內容,希望文章能夠幫你解決所遇到的問題。

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