经典问题:查询有多少段区间和等于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 ...
随机推荐
- 多线程中sleep和wait的区别,以及多线程的实现方式及原因,定时器--Timer
1. Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即 ...
- Django学习笔记之Django QuerySet的方法
一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get.filter.exclude.delete神马的感觉就已经无所不能了,但随着项目但业 ...
- Linux简单编程学习心得
在Linux环境下简单编程学习心得 linux编程过程 在上周的<信息安全设计基础>的课程学习中学习到了在虚拟的linux环境下简单的编程.学习过程中接触到了vim.gcc和gcd在实验楼 ...
- git-修改远程的URL
git remote set-url命令修改remote URL git remote set-url传递两个参数 remote name.例如,origin或者upstream new remote ...
- uboot下如何查看内存里的数据
答:使用md工具 md.b $address $count (从地址$address处显示$count个字节的数据,b=byte,8位) md.w $address $count (从地址$addre ...
- PHP设计模式(四):生成器模式
- java 二维码生成
直接上代码: 二维码生成核心类: package com.bbkj.wechat.tool; import java.awt.image.BufferedImage; import java.io.F ...
- RunLoop Note
I. Begin from Apple Document Apple describes the priciples of runloop in Threading Programming Guide ...
- 在Mac中如何正确地设置JAVA_HOME
前期准备 下载JDK安装包:在JDK1.8下载中选择Mac的JDK安装包 安装JDK:这里只要按照安装指引一步一步安装即可 查找JAVA_HOME 打开Mac的终端,检查JDK是否安装成功:java ...
- Vuex最基本样例
通过vue-cli建立基本脚手架(需要安装vuex),需要新建一个store.js文件.基本目录如下 1,store.js文件代码: import Vue from 'vue' import Vuex ...