codeforces 877F F. Ann and Books hash+莫队算法
题意:给你一堆数字,每个数字有正负之分,求任意区间内和为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+莫队算法相关推荐
- 【打CF,学算法——四星级】CodeForces 86D Powerful array (莫队算法)
[CF简介] 题目链接:CF 86D 题面: D. Powerful array time limit per test 5 seconds memory limit per test 256 meg ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 9894 Solved: 4561 [Su ...
- hdu 5213(容斥原理+莫队算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5213 莫队算法是离线处理一类区间不修改查询类问题的算法.就是如果你知道了[L,R]的答案.你可以在O( ...
- 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法
[题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...
- Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队算法
链接: http://codeforces.com/problemset/problem/86/D 题意: 给你一个数组,每次询问一个区间,求对于每个数,算出这个数在这个区间出现的个数的平方再*这个数 ...
- 莫队算法 (普通莫队、带修莫队、树上莫队)
莫队算法 主要基于分块的思想 用结构体记录询问的左右端点及询问编号 (这是一个离线算法) 通过排序优化指针扫描顺序优化时间复杂度 . 1.普通莫队 例题:SP3267 DQUERY - D-query ...
- 曼哈顿距离最小生成树莫队算法
参考资料:https://www.cnblogs.com/CsOH/p/5904430.html https://blog.csdn.net/huzecong/article/details/8576 ...
- 【算法竞赛学习笔记】莫队算法-超优雅的暴力算法
title : 莫队算法 tags : ACM,暴力 date : 2021-10-30 author : Linno 普通莫队 常用操作:分块/排序/卡常/离散化等,直接上板子. luoguP270 ...
- 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) ...
最新文章
- 【Qt】ubuntu14.04+qt5.6+opencv2.4编程注意事项
- 支付宝,马云其人与我们的心态
- Using jQuery to add a dynamic “Back To Top” floating button with smooth scroll
- 误区30日谈21-24
- 仿 vue-cli 搭建属于自己的脚手架
- 升序堆和降序堆(优先队列) 洛谷1801
- HIVE学习之(三)
- LeetCode 16. 3Sum Closest(最接近的三数之和)
- 你好,我是社恐患者的猫
- 无法启动此程序因为计算机丢失msvcr110.dll,计算机中丢失msvcr110.dll怎么办
- PHP将图片和文字合成到一张背景图上
- 【160313 18:00】四则运算 2 的单元测试
- 苹果电脑(mac os x)键盘使用技巧
- 数据库集群技术(转载)
- RESTful接口介绍与实现
- Unexpected token u in JSON at position解决方法
- 无人机航测案例-湘南某县增减挂钩拆旧地块航拍任务
- 教你如何将你的Qt项目打包安装在MeeGo系统中
- OBS无法捕捉显示屏
- 行业分类参考-做所有事情都要归于行业
热门文章
- excel筛选排序从小到大_excel表格怎么按字数的多少来排列!
- cv2.imread读取图像结果none_python cv2.imread 读取中文路径的图片返回为None的问题
- 算法题目——杨辉三角问题
- 幂等问题 vs 如何判断是否是4的幂
- android system window,Android之属性fitsSystemWindows
- [Java基础]字节,字符打印流
- [剑指offer]面试题7:用两个栈实现队列
- LeetCode 24两两交换链表中的节点-中等
- FFT字符串匹配(解决通配符问题)
- CF611F. New Year and Cleaning