cf 442 div2 F. Ann and Books(莫队算法)

题意:

\(给出n和k,和a_i,sum_i表示前i个数的和,有q个查询[l,r]\)

每次查询区间\([l,r]内有多少对(i,j)满足l <= i <= j <= r 且 sum[j] - sum[i-1] = k\)

思路:

区间左右端点的挪动对答案的贡献符合加减性质,直接用莫队算法即可

复杂度\(O(n * sqrt(n) * log(maxsum))\) 过高

考虑先离散化预处理出所有位置 将\(log\)去掉

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5 + 10;
struct Q{
int l,r,bl,id;
Q(){};
bool operator<(const Q&rhs){
if(bl == rhs.bl) return r < rhs.r;
return bl < rhs.bl;
}
}qr[N];
int n,k;
LL ans[N],value[N];
int x[N],y[N],z[N],cnt[N * 3],type[N];
vector<LL> se;
int main(){ while(cin>>n>>k){
memset(cnt, 0, sizeof(cnt));
se.clear();
for(int i = 1;i <= n;i++) scanf("%d",&type[i]);
for(int i = 1;i <= n;i++){
scanf("%d",&value[i]);
if(type[i] == 1) value[i] += value[i-1];
else value[i] = value[i-1] - value[i];
}
for(int i = 0;i <= n;i++) {
se.push_back(value[i]);
se.push_back(value[i] + k);
se.push_back(value[i] - k);
}
sort(se.begin(), se.end());
se.erase(unique(se.begin(),se.end()),se.end());
for(int i = 0;i <= n;i++){
x[i] = lower_bound(se.begin(),se.end(),value[i]) - se.begin();
y[i] = lower_bound(se.begin(),se.end(),value[i] + k) - se.begin();
z[i] = lower_bound(se.begin(),se.end(),value[i] - k) - se.begin();
}
int block_size = sqrt(n + 0.5);
int q;
cin>>q;
for(int i = 0;i < q;i++){
scanf("%d%d",&qr[i].l,&qr[i].r);
qr[i].id = i;
qr[i].l--;
qr[i].bl = qr[i].l / block_size;
}
sort(qr, qr + q);
int L = 0,R = -1;
LL res = 0;
for(int i = 0;i < q;i++){
while(qr[i].l > L) {
cnt[x[L]]--;
res -= cnt[y[L++]];
}
while(qr[i].l < L) {
res += cnt[y[--L]];
cnt[x[L]]++;
}
while(qr[i].r > R){
res += cnt[z[++R]];
cnt[x[R]]++;
}
while(qr[i].r < R) {
cnt[x[R]]--;
res -= cnt[z[R--]];
}
ans[qr[i].id] = res;
}
for(int i = 0;i < q;i++) printf("%lld\n",ans[i]);
}
return 0;
}

cf 442 div2 F. Ann and Books(莫队算法)的更多相关文章

  1. Codeforces 877F Ann and Books 莫队

    转换成前缀和, 预处理一下然后莫队. #include<bits/stdc++.h> #define LL long long #define fi first #define se se ...

  2. Codeforces #442 Div2 F

    #442 Div2 F 题意 给出一些包含两种类型(a, b)问题的问题册,每本问题册有一些题目,每次查询某一区间,问有多少子区间中 a 问题的数量等于 b 问题的数量加 \(k\) . 分析 令包含 ...

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

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  4. Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...

  5. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

  6. BZOJ-2038 小Z的袜子(hose) 莫队算法

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

  7. 【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)(组合计数+概率+莫队算法+分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2038 学了下莫队,挺神的orzzzz 首先推公式的话很简单吧... 看的题解是从http://for ...

  8. bzoj 3809 Gty的二逼妹子序列(莫队算法,块状链表)

    [题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基 ...

  9. bzoj 3289 Mato的文件管理(莫队算法+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3289 [题意] 回答若干个询问:[l,r]区间内的逆序对个数. [思路] 莫队算法,B ...

随机推荐

  1. hive 优化

    参考: http://www.csdn.net/article/2015-01-13/2823530 http://www.cnblogs.com/smartloli/p/4288493.html h ...

  2. Ruby 基础教程1-6

    1.循环实现方法 循环语句 (while;for; loop,until) 循环方法(times,each) 2.for           for 变量 in 对象             主体   ...

  3. Bing wallpaper api

    list: http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-cn idx:-1为明天,1为 ...

  4. unity3d 角色头顶信息3D&2D遮挡解决方案(一)

    先上效果图,只凭文字描述,脑补应该有些困难- - 如图:有三个角色(我们暂且从左到右叫它们A.B.C),一个2D UI(中间动作选择的框框),一个cube(右边的方块) cube挡住了角色C的头顶信息 ...

  5. List和Turple

    List 格式:classmates = ['Michael', 'Bob', 'Tracy'] 读取list长度用:len(classmetes) 索引:索引正向从0开始,逆向从-1开始 在末尾增加 ...

  6. pyhon文件操作典型代码实现(非常经典!)

    1. 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: 实现代码: import os all_files = os.listdir(os.chdir("D:\\" ...

  7. leetcode7_C++整数反转

      给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 输出:  示例 2: 输入: - 输出: - 示例 3: 输入: 输出: 注意: 假设我们的环境只能存 ...

  8. FPGA学习-VGA接口

    一般FPGA开发板的VGA会向用户暴露两共五个种接口,第一种是时序信号,用于同步传输和显示:第二种是色彩信号,用于随着时序把色彩显示到显示器上 时序接口 行同步信号-用于指示一行内像素的显示 场同步信 ...

  9. vim常用命令—撤销与反撤销

    命令模式下(即按ESC后的模式) u 撤销 Ctrl r (组合键) 反撤销<后悔撤销>

  10. 简析@Resource 和 @Autowired的区别

    @Autowird @Autowird 属于spring框架,默认使用类型(byType)进行注入,例如下面代码: @Autowired public IUserService userService ...