F2. Same Sum Blocks (Hard) 解析(思維、前綴和、貪心)
Codeforce 1141 F2. Same Sum Blocks (Hard) 解析(思維、前綴和、貪心)
今天我們來看看CF1141F2(Hard)
題目連結
題目
給你一個數列\(a\),要你從中找出若干個數字和一樣的disjoint的連續區段,輸出最多的段數和是哪些段。
前言
一開始還是陷入和以前一樣的誤區,總感覺如果暴力把所有可能都找出來要\(O(2^n)\),但其實因為區段是連續的,所以全部找出來只要\(O(n^2)\)
想法
暴力把所有區段找出來,並且以區段和的值當作Key存在map裡,因為區段是連續的,所以全部找出來只要\(O(n^2)\)。
當然,直接全部找很有可能區段會重疊,但其實只要稍微思考一下,如果我們從\(1\)開始枚舉區段的結束位置,並且慢慢從長度\(1\)到長度\(i\)(\(i\)是區段結束的位置)的區段考慮,如果發現同樣的\(sum\)(區段和)在前面已經有出現過了,那就檢查之前那個區段是否和目前檢查的有重和,沒重和才會加進map裡。
我們這樣做能成功的原因是:如果想要找到最多區段,那麼只要區段和是\(sum\),我們都會選「占用最少有潛能的格子」的區段,回到上面所說的找法,如果我發現我目前所看的區段和前面的重合了,如果我硬是把前面已經找到的區段刪掉了,那麼區段和為\(sum\)的區段少一個又多一個,完全沒好處,並且很有可能有結束得比目前區段後面的區段的和會是\(sum\),因此我們可以用這種貪心的做法。
程式碼:
const int _n=1510;
int t,n,a[_n],pre[_n];
struct B{int st,ed;};
map<int,vector<B>> mp;
vector<B> tmp;
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;rep(i,1,n+1)cin>>a[i];rep(i,1,n+1)pre[i]=pre[i-1]+a[i];
rep(i,1,n+1)per(j,0,i){
int sum=pre[i]-pre[j];
if(!mp.count(sum)){
tmp.clear();tmp.pb({j+1,i});
mp[sum]=tmp;
continue;
}
if(mp[sum].back().ed<=j)mp[sum].pb({j+1,i});
}
PII maxx={0,0};for(auto it=mp.begin();it!=mp.end();it++){
if(SZ(it->se)>maxx.fi)maxx.fi=SZ(it->se),maxx.se=it->fi;
}cout<<maxx.fi<<'\n';
rep(i,0,maxx.fi)cout<<mp[maxx.se][i].st<<' '<<mp[maxx.se][i].ed<<'\n';
return 0;
}
標頭、模板請點Submission看
Submission
F2. Same Sum Blocks (Hard) 解析(思維、前綴和、貪心)的更多相关文章
- A. Arena of Greed 解析(思維)
Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...
- C2. Pokémon Army (hard version) 解析(思維)
Codeforce 1420 C2. Pokémon Army (hard version) 解析(思維) 今天我們來看看CF1420C2 題目連結 題目 略,請直接看原題. 前言 根本想不到這個等價 ...
- B. Rock and Lever 解析(思維)
Codeforce 1420 B. Rock and Lever 解析(思維) 今天我們來看看CF1420B 題目連結 題目 給一個數列\(a\),求有多少種\((i,j)\)使得\(i<j\) ...
- E. Enemy is weak 解析(思維、離散化、BIT、線段樹)
Codeforce 61 E. Enemy is weak 解析(思維.離散化.BIT.線段樹) 今天我們來看看CF61E 題目連結 題目 給一個數列\(a\),求有多少\((i,j,k)\),\(i ...
- D. The Wu 解析(思維、二進位運算)
Codeforce 1017 D. The Wu 解析(思維.二進位運算) 今天我們來看看CF1017D 題目連結 題目 略,請直接看原題 前言 官方解答實在看不懂...之後還記得的話再補那個做法吧 ...
- D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)
Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...
- B. GameGame 解析(思維、博弈)
Codeforce 1383 B. GameGame 解析(思維.博弈) 今天我們來看看CF1383B 題目連結 題目 兩個人在玩遊戲,有一個長度為\(n\)的數列\(a\),每次每個人選一個數字和目 ...
- B. Game of the Rows 解析(思維)
Codeforce 839 B. Game of the Rows 解析(思維) 今天我們來看看CF839B 題目連結 題目 有如下圖片所示的飛機座位\(n\)排,和\(k\)隊士兵,每隊數量不一定. ...
- F. Make It Connected 解析(思維、MST)
Codeforce 1095 F. Make It Connected 解析(思維.MST) 今天我們來看看CF1095F 題目連結 題目 給你\(n\)個點,每個點\(u\)還有一個值\(a[u]\ ...
随机推荐
- Asp.Net Core SignalR 系列博客
系列 SignalR+Vue SignalR+Vue 服务端向客户端发送信息 SignalR+Vue+Log4net 实时日志推送 待定...... 源码地址:https://github.com/Q ...
- 你想要的Java资料这里都有!!!
你想要的Java资料这里都有!!! [复制链接] 1.资源标题:程序员的SQL金典(完整) 资源地址:http://down.51cto.com/data/2207566 2.资源标题: ...
- 手把手教你在容器服务 TKE 上使用 LB 直通 Pod
什么是 LB 直通 Pod ? Kubernetes 官方提供了 NodePort 类型的 Service,即给所有节点开一个相同端口用于暴露这个 Service,大多云上 LoadBalancer ...
- 转载:tf.gfile的用法
https://blog.csdn.net/a373595475/article/details/79693430
- Kafka控制器事件处理全流程分析
前言 大家好,我是 yes. 这是Kafka源码分析第四篇文章,今天来说说 Kafka控制器,即 Kafka Controller. 源码类的文章在手机上看其实效果很差,这篇文章我分为两部分,第一部分 ...
- Python-开发规范-遵循PEP8规范
Python中空白 1. 4个空格表示缩进,用4个空格代替一个TAB 2. 不再逗号.分号.冒号前加空格,应该在其后加空格 3. 关系运行符.数学运算符.逻辑运算符.赋值运算符 前后都加一个空格 4. ...
- Python-如何拆分含有多种分隔符的字符串?
案例: 把某个字符串依据分隔符拆分,该字符包含不同的多种分隔符,如下 s = '12;;7.osjd;.jshdjdknx+' 其中 ; . + 是分隔符 有哪些解决方案? 方法1:通过str.spl ...
- Python练习题 021:递归方法求阶乘
[Python练习题 021] 利用递归方法求5!. ---------------------------------------------- 首先得弄清楚:5! 指的是"5的阶乘&qu ...
- 007 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 01 Java标识符
007 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 01 Java标识符 Java变量与常量主要内容 Java变量与常量主要内容如下,主要是对以下内容的学习,没 ...
- 批处理文件的@echo off
转载:https://blog.csdn.net/zl1zl2zl3/article/details/79218448 @echo off 关闭回显 @echo on 打开回显 ...