题目大意:给定n个数有正有负,有Q次询问,每次询问区间[l,r]中有几个子区间满足和为k

做法:显然的莫队

每次用map记录一下当前区间[l,r]中的前缀和的值的个数

然后r的话找sum[r]-k的,l找sum[l]+k即可

不过是一道卡常题,不能用map要用unordered_map才能过

代码:

#pragma GCC optimize(3)
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define N 100005
#define ll long long
#include <tr1/unordered_map>
using namespace std;
int n,k,opt[N],Q;ll a[N],ans[N];
struct Node{int l,r,id;}q[N];
tr1::unordered_map<ll,ll> mp;
inline int gt(int x){return (x-1)/610+1;}
inline bool cmp(Node aa,Node bb){if (gt(aa.l)==gt(bb.l)) return aa.r<bb.r;else return gt(aa.l)<gt(bb.l);}
inline void solve(){
int l=1,r=0;ll ans1=0;mp[0]++;
for (int i=1;i<=Q;i++){
while (l>q[i].l){l--;ans1=ans1+mp[a[l-1]+k];mp[a[l-1]]++;}
while (r<q[i].r){r++;ans1=ans1+mp[a[r]-k];mp[a[r]]++;}
while (l<q[i].l){mp[a[l-1]]--;ans1=ans1-mp[a[l-1]+k];l++;}
while (r>q[i].r){mp[a[r]]--;ans1=ans1-mp[a[r]-k];r--;}
ans[q[i].id]=ans1;
}
}
inline int read(){
char ch;int f=1,w=0;
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) w=w*10+ch-'0';
return w*f;
}
int main(){
n=read();k=read();
for (int i=1;i<=n;i++) opt[i]=read();
for (int i=1;i<=n;i++){
scanf("%lld",&a[i]);
if (opt[i]==2) a[i]=-a[i];
}a[0]=0;
for (int i=1;i<=n;i++) a[i]+=a[i-1];
Q=read();
for (int i=1;i<=Q;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+Q+1,cmp);
solve();
for (int i=1;i<=Q;i++) printf("%lld\n",ans[i]);
return 0;
}

  

CF877F的更多相关文章

  1. [CF877F]Ann and Books

    题目大意: 有$n(n\le10^5)$个数$w_{1\sim n}(|w_i|\le10^9)$,并给定一个数$k(|k|\le10^9)$.$q(q\le10^5)$次询问,每次询问区间$[l,r ...

  2. CF877F题解

    题目大意 有一个序列,每个位置上有 \(1\) 或 \(2\) 两种元素若干,每次询问一个区间,求这个区间有多少个子区间满足 \(1\) 类元素恰好比 \(2\) 类元素多 \(k\) 个. 莫队 要 ...

随机推荐

  1. Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

    在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equ ...

  2. Android项目-高考作文功能简介(一)

    前言 :  开发安卓也已2年多了近3年了, 在自己刚入行的时候就有自己独立开发一个App的想法. 后来自己做了<<高考作文>>这一App. 后面续续断断的维护者. 也因为功能简 ...

  3. 设计模式之——工厂模式(C)

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41219129 主要介绍抽象工厂模式,以及工厂方法和抽象工厂 ...

  4. Touch Handling in Cocos2D 3.x(六)

    使英雄变成可触碰的对象 这是另一个非常有用的特性.很多用户需要捡起已经存在的英雄然后满屏幕移动它们.让我们按以下步骤实现该功能: 如果用户触摸屏幕空白位置,一个新的英雄将被创建 如果用户触摸一个已经存 ...

  5. 海量数据挖掘MMDS week2: Nearest-Neighbor Learning最近邻学习

    http://blog.csdn.net/pipisorry/article/details/48894963 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  6. SpringMVC注解控制器详解

    主要包括四类:@Component.@Repository @Service.@Controller 说明: @Controller 控制层,就是我们的action层 @Service 业务逻辑层,就 ...

  7. Mahout 系列之--canopy 算法

    Canopy 算法,流程简单,容易实现,一下是算法 (1)设样本集合为S,确定两个阈值t1和t2,且t1>t2. (2)任取一个样本点p属于S,作为一个Canopy,记为C,从S中移除p. (3 ...

  8. MulticastSocket 使用

    /** * ServerMulticastSocketTest.java * 版权所有(C) 2014 * 创建者:cuiran 2014-1-9 下午3:22:01 */ package com.u ...

  9. C++智能指针及其简单实现

    本文将简要介绍智能指针shared_ptr和unique_ptr,并简单实现基于引用计数的智能指针. 使用智能指针的缘由 1. 考虑下边的简单代码: int main() { ); ; } 就如上边程 ...

  10. 一键安装Android开发环境

    一键安装Android开发环境 1 下载tadp-3.0r4-linux-x64.run 进入下面的地址下载: https://developer.nvidia.com/gameworksdownlo ...