经典问题:查询有多少段区间和等于k值
题目连接
题意:在大小为1e5以内的数组求存在多少个区间和的值等于k的次方
这种题很经常见,总是想着用两个for循环解决,但是一定会超时。
题解:算出前缀和,使用map去查找mp[sum[i+1]-tmp]的个数,加起来就是答案,这样复杂度在O(n)加上mp的查找时间,基本上不会超时
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define pb push_back
#define fi first
#define se second
const int N = 1e5+5;
const ll eps = 1e15;
ll a[N];
ll sum[N];
map<ll,int>mp;
int main()
{
ll n,k,i,j;
ll tmp=1;
ll ans=0;
scanf("%lld%lld",&n,&k);
sum[0]=0;
for(i=1;i<=n;i++) {scanf("%lld",&a[i]);sum[i]=sum[i-1]+a[i];}
for(i=0;i<n;i++)
{
mp[sum[i]]++;
tmp=1;
while(tmp<eps&&k!=-1&&k!=1)
{
if(mp[sum[i+1]-tmp]!=0) ans+=mp[sum[i+1]-tmp];
tmp=tmp*k;
}
if(k==-1)
{
if(mp[sum[i+1]-1]!=0) ans+=mp[sum[i+1]-1];
if(mp[sum[i+1]+1]!=0) ans+=mp[sum[i+1]+1];
}
else if(k==1)
{
if(mp[sum[i+1]-1]!=0) ans+=mp[sum[i+1]-1];
}
}
cout<<ans<<endl;
}
经典问题:查询有多少段区间和等于k值的更多相关文章
- SQL查询出某字段不等于某值的行(其中有为NULL的字段)
表1如下:TBD1100 TBD1101 TBD1102------------------------------------------ 1001 水果 ...
- LeetCode 560. Subarray Sum Equals K (子数组之和等于K)
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- (转)经典SQL查询语句大全
(转)经典SQL查询语句大全 一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql s ...
- Sql server 查询指定时间区间工作日数、休息日数等日期操作
1.查询指定时间区间的工作日 这个主要难点是法定节假日,国家的法定节假日每年都不一样,还涉及到调休,所以我们设计一个假日表.主要字段有年份,类型(是否调休),假期日期.如下: CREATE TABLE ...
- Oracle查询某段日期内某个时间段的数据
示例: 查询最近一周12:30分到13:00这段时间内的订单量: SELECT * FROM T_ORDER O WHERE O.CREATEDATETIME BETWEEN SYSDATE AND ...
- 什么是core dump linux下用core和gdb查询出现"段错误"的地方
什么是core dump linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-31932 ...
- linux下用core和gdb查询出现"段错误"的地方【转】
转自:http://blog.chinaunix.net/uid-30091091-id-5754288.html 原文地址:linux下用core和gdb查询出现"段错误"的地方 ...
- 经典线程同步 关键段CS
上一篇<秒杀多线程第四篇 一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文首先介绍下如何使用关键段,然 ...
- 多线程面试题系列(5):经典线程同步 关键段CS
上一篇提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题.本文首先介绍下如何使用关键段,然后再深层次的分析下关键段的实现机制与原理.关键段CRITIC ...
随机推荐
- U盘在制作Ubuntu启动盘后Windows系统下显示空间不对的解决办法(Ubuntu系统下格式化U盘的方法)
用Ubuntu系统自带的启动盘制作工具后,将U盘拿到Windows系统下使用显示出的空间与U盘大小不同. 解决该问题的办法: 使用Linux终端: 第一步:sudo fdisk -l 这个命令主要是查 ...
- 微信小程序 drawImage 问题
好久没写了,其实可写的还是挺多,主要还是懒吧... 最近公司项目使用小程序做序列帧动画,大概有 116 张图,共9.6M. 比较闲的日子里实验了一番,主要有以下几种方法, 1. css backgro ...
- spark + yarn调试问题java.nio.channels.ClosedChannelException
spark客户端提交任务至yarn,后台抛错,FinalStatus:UNDEFINED. ./spark-submit --class org.apache.spark.examples.Spar ...
- linux目录结构及文件权限
安装banner用到的指令: 第一步: sudo apt-get update 第二步: sudo apt-get install sysvbanner 成功了 创建新用户指令: sudo addus ...
- 解析TCP三次握手
转自:http://www.jellythink.com/archives/705 三次握手又是什么? TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/I ...
- UVA 12657 Boxes in a Line(双向链表+小技巧)
题意:对于一行按照顺序排列盒子数字与位置都为 1,2,3,4....n 执行四种操作 c = 1 x 放到 y 的左边 c =2 x 放到 y 的右边 c =3 交换 x, y c =4 ...
- 【Semantic segmentation】Fully Convolutional Networks for Semantic Segmentation 论文解析
目录 0. 论文链接 1. 概述 2. Adapting classifiers for dense prediction 3. upsampling 3.1 Shift-and-stitch 3.2 ...
- LA 3720 高速公路(互质判斜率)
https://vjudge.net/problem/UVALive-3720 题意: 有一个n行m列的点阵,问一共有多少条非水平非垂直的直线至少穿过其中的两个点. 思路: 没思路的题. 首先枚举矩形 ...
- spring boot2.1读取 apollo 配置中心2
第二篇:创建spring boot2.1项目 引用apollo的java客户端jar包 <dependency> <groupId>com.ctrip.framework.ap ...
- Android开发-ADT Bundle安装
此次安装是在Android Studio的机器上.安装Eclipse是因为目前很多Android程序是Eclipse开发的,要想快速看到运行效果就是安装Eclipse. 1.所有的资源都在:http: ...