Codeforces Round 893 (Div. 2) D.Trees and Segments

原題鏈接:Problem - D - Codeforces

題面:?

大概意思就是讓你在翻轉01串不超過k次的情況下,使得a*(0的最大連續長度)+(1的最大連續長度)最大(1<=a<=n)。輸出n個數,第i個數代表a=i時的最大值。

思路:可以發現n<=3000,我們可以用O(n^2)的復雜度來求解。首先我們先假設最長連續0串在左邊,最長的連續1串在右邊,一開始最樸素的思想就是:

枚舉最長0串的左端點l和右端點r,并且使它合法。設區間[l,r]中1的個數為x,也就是說[l,r]變成全0串需要的操作數為x。然后O(n^2)求出區間[r+1,n]我們能得到的最長1串,長度為y(此時我們能進行的最大操作數為k-x)。我們定義mp[i]:0串長度為i時,1串的最長長度為mp[i]。然后我們更新mp[x]為max(mp[r-l+1],y)即可。

因為這是0串在左,1串在右,所以我們還需要將字符串翻轉然后再這樣處理一次。

最后輸出的時候,每次我們只需要遍歷mp,a*i+mp[i]取max即可。

當然這樣子操作的總復雜度是O(n^4),我們肯定是不能接受的,那么怎么能讓它復雜度降下來呢?我們可以利用dp來預處理,用dp[i][j]來表示[i~n]區間,操作數最大為j時,1串的最大長度。

具體實現見代碼注釋。

int n,k;
int mp[maxn];
//表示連續0的長度為i的時候,最長連續1的長度最大為mp[i]
string x;
void f() {vector<vector<int>>dp(n+2,vector<int>(k+2));//dp[i][j]表示[i~n]區間,操作數最大為j時,連續1的最大長度。 vector<int>sum(n+2);//sum[i]表示[1,i]中字符1的個數 string s=" "+x;//下標從1開始,防止數組越界 for(int i=n; i>=1; i--) {//預處理出i~n的字符串在操作數為k時候變為1的最大連續串長度dp[i]=dp[i+1]; //大區間可以由小區間的方案轉移過來 ,因為在相同操作數下,[i,n]的最長連續1串 >=[i+1,n]的最長連續1串 int cost=0;for(int j=i; j<=n; j++) {cost+=(s[j]=='0');if(cost<=k) dp[i][cost]=max(dp[i][cost],j-i+1);//如果合法,則答案取max else break;//后面的cost都大于k了,直接break }for(int j=1; j<=k; j++) dp[i][j]=max(dp[i][j],dp[i][j-1]);//大的操作數方案可以由小的操作數方案轉移過來,因為你用x次操作能辦到的,用x+1次操作也一定能辦到 }mp[0]=max(mp[0],dp[1][k]);//將全是1,沒有0的情況特殊處理 for(int i=1; i<=n; i++)sum[i]=sum[i-1]+(s[i]=='1');//預處理前綴1的個數 for(int i=1; i<=n; i++) {for(int j=i; j<=n; j++) {if(sum[j]-sum[i-1]>k)continue;//如果操作數大于k了則不合法,continue mp[j-i+1]=max(mp[j-i+1],dp[j+1][k-sum[j]+sum[i-1]]);//j-i+1為連續0的長度,k-sum[j]+sum[i-1]為剩下的操作數 }}
}
void solve() {cin>>n>>k>>x;for(int i=0; i<=n; i++) mp[i]=-1;//初始化為-1 f();//處理0串在左,1串在右的情況 reverse(x.begin(),x.end()),f();//等于處理1串在左,0串在右的情況 for(int i=1; i<=n; i++) {int ans=0;for(int j=0; j<=n; j++) {//當0的長度為j時 if(mp[j]!=-1)ans=max(ans,i*j+mp[j]);}cout<<ans<<" ";}cout<<endl;
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42044.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42044.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42044.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模糊測試面面觀 | 模糊測試工具知多少

自1988年威斯康星大學的Barton Miller首次提出模糊測試這一概念以來&#xff0c;模糊測試領域經歷了持續長久發展。模糊測試作為一種軟件測試方法&#xff0c;旨在通過向程序輸入模糊、隨機、異常的數據&#xff0c;探測和發現潛在的漏洞和錯誤。這種方法備受安全研究人員的青睞…

助推打造全球研發中心城市 | 李彥團隊:研發,帶來了二次文藝復興

2017年&#xff0c;長沙經聯合國教科文組織評選&#xff0c;成為中國首座獲評世界“媒體藝術之都”稱號的城市。6年后&#xff0c;基于時代發展的新要求&#xff0c;長沙再次提出了“打造全球研發中心城市”的目標&#xff0c;并朝著新的方向邁進。 舊有的優勢產業在新的研發浪…

信安通用基礎知識

文章目錄 密碼學經典誤區PGP優良保密協議信安經典其它安全手段XSS與CSRF cross site request forgeryCSRF的利用邏輯CSRF示例CSRF防范檢查Referer字段添加校驗token XSS cross site scripting common weakness enumeration常見密碼api誤用&#xff08;摘自畢設參考文獻&#xf…

“深入探究JVM內部機制:如何實現Java程序的運行環境?“

標題&#xff1a;深入探究JVM內部機制&#xff1a;如何實現Java程序的運行環境&#xff1f; 摘要&#xff1a;本文將深入探究Java虛擬機&#xff08;JVM&#xff09;的內部機制&#xff0c;重點討論JVM如何實現Java程序的運行環境。我們將從JVM的結構、類加載、內存管理、垃圾…

01 Python 網絡爬蟲:爬蟲技術的核心原理

不夸張地說&#xff0c;現在哪怕是初中生&#xff0c;只要花點兒時間、精力稍微按「網絡爬蟲」的開發步驟學習了解一下&#xff0c;也能把它玩得賊溜。 聽起來感覺是很高大上的東西&#xff0c;但實際上并不復雜&#xff0c;也就是使用了某種編程語言按照一定步驟、規則主動通…

用Java實現原神抽卡算法

哈嘍~大家好&#xff0c;好久沒有更新了&#xff0c;也確實遇到了很多事&#xff0c;這篇開始恢復更新&#xff0c;喜歡的話&#xff0c;可以給個的三連&#xff0c;什么&#xff1f;你要白嫖&#xff1f;那可以給個免費的贊麻。 &#x1f947;個人主頁&#xff1a;個人主頁??…

七月 NFT 行業解讀:游戲和音樂 NFT 引領增長,Opepen 掀起熱潮

作者&#xff1a;lesleyfootprint.network 2023 年 7 月&#xff0c;NFT 市場的波動性持續存在&#xff0c;交易量呈下降趨勢。然而&#xff0c;游戲和音樂 NFT 等領域的增長引人注目。參與這些細分領域的獨立用戶數量不斷增加&#xff0c;反映了這些領域的復蘇。 本綜合報告…

lvs負載均衡群集

lvs組成 1、lvs基于內核態的netfilter框架實現的IPVS功能&#xff0c;工作在內核態用戶配置VIP等相關信息并且傳遞到IPVS 就需要用到IPVSadm工具。 2、ipvsadm&#xff1a;IPVSadm是lvs用戶態的配套的工具&#xff0c;可以實現VIP和RS 增刪改查。 IPVSadm就是類似于iptables…

侯捷 八部曲 C++面向對象高級開發(上)+(下)【C++學習筆記】 超詳細 萬字筆記總結 筆記合集

文章目錄 Ⅰ C part1 面向對象編程1 頭文件與類的聲明1.1 c vs cpp關于數據和函數1.2 頭文件與類1.2.1 頭文件1.2.2 class的聲明1.2.3 模板初識 2 構造函數2.1 inline 函數2.2 訪問級別2.3 ctor 構造函數2.3.1 ctor 的寫法2.3.2 ctor/函數 重載2.3.3 ctor 放在 private 區 2.4 …

記vite打包vue項目內存溢出問題解決

出現問題 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory解決方法一&#xff1a; 1.根據網上的資料是通過全局下載npm包increase-memory-limit&#xff1a; npm install -g increase-memory-limit2.在項目目錄執…

學習Vue:路由參數與查詢參數傳遞

在Vue.js中&#xff0c;路由與導航不僅涉及到頁面之間的切換&#xff0c;還包括了向頁面傳遞參數以及獲取查詢參數的功能。本文將詳細介紹如何在Vue Router中傳遞路由參數和查詢參數&#xff0c;幫助您更好地理解和使用這些功能。 路由參數的傳遞 路由參數是指在URL中的動態片…

K8s內部的網路模式實現理解

overlay 網絡模式 在 Kubernetes 中&#xff0c;overlay 網絡模式被用于實現容器之間的網絡通信。 K8s 使用了一種稱為容器網絡接口&#xff08;Container Network Interface&#xff0c;簡稱CNI&#xff09;的規范&#xff0c;該規范定義了容器如何進行網絡連接。實際上&…

SDP 與Rtcp-fb

1、sdp介紹 SDP&#xff08;Session Description Protocol&#xff09;是一種用于描述多媒體會話的協議&#xff0c;它在會話層起著重要的作用。SDP的主要功能是提供會話的元數據和配置信息&#xff0c;以便參與者能夠協商和建立一致的會話。 以下是SDP在會話層的作用&#x…

生活隨筆,記錄我的日常點點滴滴.

前言 &#x1f618;個人主頁&#xff1a;曲終酣興晚^R的小書屋&#x1f971; &#x1f615;作者介紹&#xff1a;一個莽莽撞撞的&#x1f43b; &#x1f496;專欄介紹&#xff1a;日常生活&往事回憶 &#x1f636;?&#x1f32b;?每日金句&#xff1a;被人暖一下就高熱&…

catboost推理開GPU加速

核心設置 model.predict(feature, task_type‘GPU’) 代碼參考 # 訓練配置 params {"catboost": {"n_estimators": 7000,"learning_rate": 0.03,"eval_metric": "AUC","loss_function": "RMSE",&qu…

【sgDragSize】自定義拖拽修改DIV尺寸組件,適用于窗體大小調整

核心原理就是在四條邊、四個頂點加上透明的div&#xff0c;給不同方向提供按下移動鼠標監聽 &#xff0c;對應計算寬度高度、坐標變化 特性&#xff1a; 支持設置拖拽的最小寬度、最小高度、最大寬度、最大高度可以雙擊某一條邊&#xff0c;最大化對應方向的尺寸&#xff1b;再…

一次Linux中的木馬病毒解決經歷(6379端口---newinit.sh)

病毒入侵解決方案 情景 最近幾天一直CPU100%,也沒有注意看到了以為正常的服務調用,直到騰訊給發了郵件警告說我的服務器正在入侵其他服務器的6379端口,我就是正常的使用不可能去入侵別人的系統的,這是違法的. 排查 既然入侵6379端口,就懷疑是通過我的Redis服務進入的我的系統…

Vue基礎-1.知識導航

知識導航&#xff08;就問全不全&#xff09; 當學習 Vue.js 時&#xff0c;除了基本的 HTML、CSS 和 JavaScript 知識外&#xff0c;還有一些其他的技術和語法需要了解&#xff0c;例如 ES6 和 TypeScript。以下是您可能需要學習的一些基礎知識和對應的學習資源&#xff0c;我…

css中變量和使用變量和運算

變量&#xff1a; 語法&#xff1a;--css變量名&#xff1a;值&#xff1b; --view-theme: #1a99fb; css使用變量&#xff1a; 語法&#xff1a;屬性名&#xff1a;var( --css變量名 )&#xff1b; color: var(--view-theme); css運算&#xff1a; 語法&#xff1a;屬性名…

vue3 rouer params傳參的問題

route.params在頁面刷新的時候數據會丟失&#xff0c;所以vue3 棄用了params方式&#xff01; 但是&#xff0c;vue3又更新了一個替代params的方式&#xff1a;history API import { useRouter } from "vue-router" const router userRouter; // 跳轉路由&#xff…