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]\ ...
随机推荐
- OpenGL的shader编写,GLSL基本语法
重要!!! 文章中涉及到的代码在我的GitHub仓库里应该都能对应找到, 关于学习OpenGL的实操项目一般都会在GLBIproject1,2,...中对应找到 每个仓库中都有不同的版本的项目,更新版 ...
- ASP.NET Core 基于声明的访问控制到底是什么鬼?
从ASP.NET 4.x到ASP.NET Core,内置身份验证已从基于角色的访问控制(RBAC)转变为基于声明的访问控制(CBAC). 我们常用的HttpContext.User属性ASP.NET ...
- 总结一下,selenium 自动化流程如下
自动化程序调用Selenium 客户端库函数(比如点击按钮元素) 客户端库会发送Selenium 命令 给浏览器的驱动程序 浏览器驱动程序接收到命令后 ,驱动浏览器去执行命令 浏览器执行命令 浏览器驱 ...
- 有关图的连通性的Tarjan算法
割点与桥 在一个无向连通图中,若将某个点及其相连的边删除后,图就不连通了,则这样的点被称为割点. 在一个无向连通图中,若将某条边删除后,图就不连通了,则这样的边被称为割边,即桥. 在一张图中求出割点或 ...
- 探讨JVM运行机制和执行流程
JVM是什么 概述 JVM是Java Virtual Machine的缩写.它是一种基于计算设备的规范,是一台虚拟机,即虚构的计算机. JVM屏蔽了具体操作系统平台的信息(显然,就像是我们在电脑上开了 ...
- 剑指offer-递归和循环
1. 斐波那契数列 解: 没啥好说的了,直接上高效的滚动迭代解法.矩阵解法和特征根解法这里不讨论了. class Solution: def Fibonacci(self, n): # write c ...
- 从零搭建Golang开发环境--go修仙序章
1. 什么是go语言 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态 .强类型.编译型语言 .Go 语 ...
- kubernetes1.15极速部署prometheus和grafana
关于prometheus和grafana prometheus负责监控数据采集,grafana负责展示,下图来自官网: 环境信息 硬件:三台CentOS 7.7服务器 kubernetes:1.15 ...
- [学习笔记] 树上倍增求LCA
倍增这种东西,听起来挺高级,其实功能还没有线段树强大.线段树支持修改.查询,而倍增却不能支持修改,但是代码比线段树简单得多,而且当倍增这种思想被应用到树上时,它的价值就跟坐火箭一样,噌噌噌地往上涨. ...
- Redis哨兵知识点总结
1.Redis哨兵介绍 sentinal,中文名是哨兵 A.哨兵是redis集群架构中非常重要的一个组件,主要功能如下 集群监控,负责监控redis master和slave进程是否正常工作 消息通知 ...