题意:给你一堆数字,每个数字有正负之分,求任意区间内和为k的子区间的个数。

题解:

先把前缀和都求出来,构成一个数组sum。

建立一个hash表,然后考虑区间sum[l,r],从左到右扫,每扫到一个前缀sum[i],从把答案加上hash_table[sum[i] - k],并且hash_table[sum[i-1]]++;

这是对于固定区间的做法,要用莫队得证明区间左右端点移动的时间复杂度为O(1):

当l增大1时,ans -= hash_table[sum[l-1]+k],(即把sum[l-1]的贡献消除)hash_table[sum[l-1]]--,l++;

当l减小1时,l--,ans += hash_table[sum[l-1]+k](即把sum[l-1]的贡献加上)hash_table[sym[l-1]]++;

。。。。

然后就ojbk了

代码:

#include <bits/stdc++.h>
#include<tr1/unordered_map>
using namespace std;
#define int long long
int n,k,q,sn;
const int maxn = 100007;
int a[maxn];
int sum[maxn],res[maxn];
int qcnt = 0;struct work{int id,l,r;bool operator<(const work &q)const{int bk1 = (l-1)/sn,bk2 = (q.l-1)/sn;if(bk1 == bk2)return r < q.r;return bk1 < bk2;}
}qs[maxn];
tr1::unordered_map<int,int>mp;
main(){ scanf("%lld%lld",&n,&k);sn = 2*(int)sqrt(n+0.5);for(int i = 1;i <= n;++i) {int tmp;scanf("%lld",&tmp);a[i] = tmp == 1?1:-1;}for(int i = 1;i <= n;++i){int tp;scanf("%lld",&tp);a[i] *= tp;sum[i] = sum[i-1] + a[i];}scanf("%lld",&q);while(q--){int l,r;scanf("%lld%lld",&l,&r);qs[qcnt] = (work){qcnt,l,r};qcnt++;}sort(qs,qs+qcnt);int l = -1,r = -1;int ans = 0;//mp[0] = 1;for(int i = 0;i < qcnt;++i){if(l == -1) l = qs[i].l,r = qs[i].l-1,mp[sum[qs[i].l-1]] ++;for(;l < qs[i].l;l++){mp[sum[l-1]] --;ans -= mp[sum[l-1]+k];}for(r++;r <= qs[i].r;r++){ans += mp[sum[r]-k];mp[sum[r]]++;}--r;for(--l;l >= qs[i].l;--l){ans += mp[sum[l-1]+k];mp[sum[l-1]]++;}++l;for(r;r > qs[i].r;--r){ mp[sum[r]]--;ans -= mp[sum[r]-k];}res[qs[i].id] = ans;}for(int i = 0;i < qcnt;i++){printf("%lld\n",res[i]);}return 0;
}

codeforces 877F F. Ann and Books hash+莫队算法相关推荐

  1. 【打CF,学算法——四星级】CodeForces 86D Powerful array (莫队算法)

    [CF简介] 题目链接:CF 86D 题面: D. Powerful array time limit per test 5 seconds memory limit per test 256 meg ...

  2. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Su ...

  3. hdu 5213(容斥原理+莫队算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5213 莫队算法是离线处理一类区间不修改查询类问题的算法.就是如果你知道了[L,R]的答案.你可以在O( ...

  4. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

  5. Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队算法

    链接: http://codeforces.com/problemset/problem/86/D 题意: 给你一个数组,每次询问一个区间,求对于每个数,算出这个数在这个区间出现的个数的平方再*这个数 ...

  6. 莫队算法 (普通莫队、带修莫队、树上莫队)

    莫队算法 主要基于分块的思想 用结构体记录询问的左右端点及询问编号 (这是一个离线算法) 通过排序优化指针扫描顺序优化时间复杂度 . 1.普通莫队 例题:SP3267 DQUERY - D-query ...

  7. 曼哈顿距离最小生成树莫队算法

    参考资料:https://www.cnblogs.com/CsOH/p/5904430.html https://blog.csdn.net/huzecong/article/details/8576 ...

  8. 【算法竞赛学习笔记】莫队算法-超优雅的暴力算法

    title : 莫队算法 tags : ACM,暴力 date : 2021-10-30 author : Linno 普通莫队 常用操作:分块/排序/卡常/离散化等,直接上板子. luoguP270 ...

  9. SPOJ DQUERY - D-query (莫队算法)

    Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, j) ...

最新文章

  1. 【Qt】ubuntu14.04+qt5.6+opencv2.4编程注意事项
  2. 支付宝,马云其人与我们的心态
  3. Using jQuery to add a dynamic “Back To Top” floating button with smooth scroll
  4. 误区30日谈21-24
  5. 仿 vue-cli 搭建属于自己的脚手架
  6. 升序堆和降序堆(优先队列) 洛谷1801
  7. HIVE学习之(三)
  8. LeetCode 16. 3Sum Closest(最接近的三数之和)
  9. 你好,我是社恐患者的猫
  10. 无法启动此程序因为计算机丢失msvcr110.dll,计算机中丢失msvcr110.dll怎么办
  11. PHP将图片和文字合成到一张背景图上
  12. 【160313 18:00】四则运算 2 的单元测试
  13. 苹果电脑(mac os x)键盘使用技巧
  14. 数据库集群技术(转载)
  15. RESTful接口介绍与实现
  16. Unexpected token u in JSON at position解决方法
  17. 无人机航测案例-湘南某县增减挂钩拆旧地块航拍任务
  18. 教你如何将你的Qt项目打包安装在MeeGo系统中
  19. OBS无法捕捉显示屏
  20. 行业分类参考-做所有事情都要归于行业

热门文章

  1. excel筛选排序从小到大_excel表格怎么按字数的多少来排列!
  2. cv2.imread读取图像结果none_python cv2.imread 读取中文路径的图片返回为None的问题
  3. 算法题目——杨辉三角问题
  4. 幂等问题 vs 如何判断是否是4的幂
  5. android system window,Android之属性fitsSystemWindows
  6. [Java基础]字节,字符打印流
  7. [剑指offer]面试题7:用两个栈实现队列
  8. LeetCode 24两两交换链表中的节点-中等
  9. FFT字符串匹配(解决通配符问题)
  10. CF611F. New Year and Cleaning