【数学+思维】ZZULIOJ 1531: 小L的区间求和
- 题目描述
接下来一行输入n个整数,表示序列中的数。
- 样例输入
5 7
1 2 4 1 1
- 样例输出
3 题解:
先将数组的前缀和数组构建起来。在构建过程中模K,所以此时前缀和数组中所有数属于[0,K-1],假如有两个位置i,j,前缀和数组pre[i] == pre[j],那么不模K的前缀和数组 pre[j]-pre[i]的结果一定是K的倍数,j-i就是长度。
所以我们的目的就成不断的了找:pre[i] == pre[j],保存长度 = j-i并更新。下面代码用:map首先都初始化为-1,之后遍历过程中遇到了就记录pre[i]的值第一次出现的位置
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int NN = 1e5; int N,K;
int a[NN+];//源数组
int pre[NN+];//前缀和数组
map<int,int> mp; //mp[n] = i 表示前缀和数组中数字n在位置i第一次出现
int main(){
cin>>N>>K;
for(int i =;i<=N;i++){ //读入数据
scanf("%d",&a[i]);
}
for(int i = ;i<=N;i++){ //构建前缀和数组并取余K
pre[i] = (a[i]+pre[i-])%K;
mp[pre[i]] = -;//都初始化为-1
}
int maxlen = ; //最长长度
for(int i = ;i<=N;i++){
if(mp[pre[i]] == -){
mp[pre[i]] = i;//改成第一次出现的位置
}else{
maxlen = max(maxlen,i-mp[pre[i]]);//i是pre[i]此时的位置 mp[pre[i]]是pre[i]第一次出现的位置,两个相减为k的倍数
}
}
cout<<maxlen<<endl;
return ;
}
另一种用vector的写法,vector存前缀和数组元素出现的位置
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int NN = 1e5; int N,K;
int a[NN+];//源数组
int pre[NN+];//前缀和数组
vector<int> ve[];
int main(){
cin>>N>>K;
for(int i =;i<=N;i++){ //读入数据
scanf("%d",&a[i]);
}
ve[].push_back();
for(int i = ;i<=N;i++){ //构建前缀和数组并取余K
pre[i] = (a[i]+pre[i-])%K;
ve[pre[i]].push_back(i);
}
int maxlen = ;
for(int i = ;i<K;i++){
if(ve[i].size()>)
maxlen = max(maxlen,ve[i][ve[i].size()-] - ve[i][]); //最后一次出现的位置 - 第一次出现的位置
}
cout<<maxlen<<endl;
return ;
}
【数学+思维】ZZULIOJ 1531: 小L的区间求和的更多相关文章
- 小L的区间求和
题目描述 在给定的一个整数序列中,小L希望找到一个连续的区间,这个区间的和能够被k整除,请你帮小L算一下满足条件的最长的区间长度是多少. 输入 第一行输入两个整数n.k.(1 <= n < ...
- hdu1166(线段树单点更新&区间求和模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:中文题诶- 思路:线段树单点更新,区间求和模板 代码: #include <iost ...
- 小L的占卜
小L的占卜 题目描述 小 X 的妹妹小 L 是一名 XXX 国的占卜师,她平日的工作就是为 X 国进行占卜. X 国的占卜殿中有一条长度为 NNN 米的走廊,先人在走廊的每一米都放置了一座神龛,第 i ...
- 2018.12.1 万圣节的小L
我回来啦 试题描述 今天是万圣节,小L同学开始了一年一度的讨要糖果游戏,但是在刚刚过去的比赛中小有成就的他打算给自己增加一点难度:如果没有讨到每一家的糖果就算输. 已知小L共有n(n不大于10000) ...
- 洛谷U4727小L的二叉树[树转序列 LIS]
题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...
- ACM D的小L
D的小L 时间限制:4000 ms | 内存限制:65535 KB 难度:2 描述 一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...
- nyoj-366-D的小L(求全排列)
D的小L 时间限制:4000 ms | 内存限制:65535 KB 难度:2 描述 一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡 ...
- 洛谷U4727 小L 的二叉树
U4727 小L 的二叉树 题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树 ...
- 程序设计中的数学思维函数总结(代码以C#为例)
最近以C#为例,学习了程序设计基础,其中涉及到一些数学思维,我们可以巧妙的将这些逻辑问题转换为代码,交给计算机运算. 现将经常会使用到的基础函数做一总结,供大家分享.自己备用. 1.判断一个数是否为奇 ...
随机推荐
- ElementUI 源码简析——源码结构篇
ElementUI 作为当前运用的最广的 Vue PC 端组件库,很多 Vue 组件库的架构都是参照 ElementUI 做的.作为一个有梦想的前端(咸鱼),当然需要好好学习一番这套比较成熟的架构. ...
- nu.xom:Serializer
Serializer: 机翻 /* 使用用于控制空格,规范化,缩进,换行和基本URI的各种选项以特定编码输出Document对象 */ Serializer(OutputStream out) :创建 ...
- dijkstra算法学习笔记
dijkstra是一种单源最短路径算法,即求一个点到其他点的最短路.不能处理负边权. 最近某种广为人知的算法频繁被卡,让dijkstra逐渐成为了主流,甚至在初赛中鞭尸了SPFA(? dijkstra ...
- c++小游戏——彩票
#include <cstdlib> #include <iostream> #include <cstdio> #include <cmath> #i ...
- 个人永久性免费-Excel催化剂功能第82波-复制粘贴按源区域大小自动扩展收缩目标区域
日常工作中,复制粘贴的操作,永远是最高频的操作,没有之一,在最高频的操作上,进行优化,让过程更智能,比一天到晚鼓吹人工智能替换人的骇人听闻的新闻来得更实际.此篇带来一点点的小小的改进,让日后无数的复制 ...
- 基于 HTML5 WebGL 的民航客机飞行监控系统
前言 前些日子出差,在飞机上看到头顶的监控面板,除了播放电视剧和广告之外,还会时不时的切换到一个飞机航行的监控系统,不过整个监控系统让人感到有一点点的简陋,所以我就突发奇想制作了一个采用 HT for ...
- Vue模板语法与常用指令
Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数,结合相应系统,在应用状态改变时 ...
- golang在多个go routine中进行map或者slice操作应该注意的对象。
因为golang的map和列表切片都是引用类型,且非线程安全的,所以在多个go routine中进行读写操作的时候,会产生“map read and map write“的panic错误. 某一些类型 ...
- 那些年,想和你一起认识的SpringCloud Eureka
前几天鲁班LB跟我说:你玩把游戏都要半个钟啦,为何不用这时间来看看书,如果涨工资还可以帮我买个皮肤. 面对如此合理的这需求,但我不以为然,事实上并不是我不想学习,而是 ↓ 实力不允许呀~ 直到有一天, ...
- c&c服务器(command and control server)
远程命令和控制服务器,目标机器可以接收来自服务器的命令,从而达到服务器控制目标机器的目的.该方法常用于病毒木马控制被感染的机器.