Codeforces #442 Div2 F
#442 Div2 F
题意
给出一些包含两种类型(a, b)问题的问题册,每本问题册有一些题目,每次查询某一区间,问有多少子区间中 a 问题的数量等于 b 问题的数量加 \(k\) 。
分析
令包含 a 问题的问题册的问题数取正值,包含 b 问题的问题册的问题数取负值,那么问题就是求有多少子区间的和为 \(k\) 。
先求前缀和,记录 \(i\) 出现的次数 \(cnt[i]\)。当计算完前缀和 \(b[i-1]\) 后,考虑前缀和 \(b[i]\) ,\(cnt[b[i]-k]\)为对答案的贡献。
对于这种多个区间的询问,且区间从 \([L,R]\) 到 \([L,R+1]\) 或 \([L-1,R]\) 只需要 \(O(1)\) 的复杂度时,可以用莫队算法去优化,离线 + 分块。
注意,并不能直接用数组去存 \(cnt\) ,用 \(map\) 也会超时,这里可以离散化掉所有可能的值,因为我们只关心某种数字出现的次数。
code
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int MAXN = 1e5 + 10;
const int BLOCK = 300;
int n, k;
ll a[MAXN], b[MAXN];
ll s[MAXN << 2];
int x[MAXN], y[MAXN], z[MAXN];
ll O[MAXN << 2];
struct P {
int l, r, b, i;
bool operator < (const P& o) const {
if(b != o.b) return b < o.b;
return r < o.r;
}
}p[MAXN];
ll ans[MAXN];
int main() {
scanf("%d%d", &n, &k);
for(int i = 0; i < n; i++) {
scanf("%lld", &a[i]);
if(a[i] != 1) a[i] = -1;
}
for(int i = 0; i < n; i++) {
scanf("%lld", &b[i]);
if(!i) b[i] = a[i] * b[i];
else b[i] = b[i - 1] + a[i] * b[i];
}
int c = 0;
b[n] = 0;
for(int i = 0; i <= n; i++) {
s[c++] = b[i];
s[c++] = b[i] + k;
s[c++] = b[i] - k;
}
sort(s, s + c);
int cc = unique(s, s + c) - s;
for(int i = 0; i <= n; i++) {
x[i] = lower_bound(s, s + cc, b[i] - k) - s;
y[i] = lower_bound(s, s + cc, b[i]) - s;
z[i] = lower_bound(s, s + cc, b[i] + k) - s;
}
int q;
scanf("%d", &q);
for(int i = 0; i < q; i++) {
scanf("%d%d", &p[i].l, &p[i].r);
p[i].l--;
p[i].r--;
p[i].b = p[i].l / BLOCK;
p[i].i = i;
}
sort(p, p + q);
int L = 0, R = 0;
ll res = 0;
for(int i = 0; i < q; i++) {
int l = p[i].l, r = p[i].r;
if(!i) {
if(l == 0) O[y[n]]++;
else O[y[l - 1]]++;
for(int j = l; j <= r; j++) {
res += O[x[j]];
O[y[j]]++;
}
} else {
for(int j = R + 1; j <= r; j++) {
res += O[x[j]];
O[y[j]]++;
}
for(int j = L - 1; j >= l; j--) {
if(j == 0) { res += O[z[n]]; O[y[n]]++; }
else { res += O[z[j - 1]]; O[y[j - 1]]++; }
}
for(int j = R; j > r; j--) {
O[y[j]]--;
res -= O[x[j]];
}
for(int j = L; j < l; j++) {
if(j == 0) { O[y[n]]--; res -= O[z[n]]; }
else { O[y[j - 1]]--; res -= O[z[j - 1]]; }
}
}
L = l;
R = r;
ans[p[i].i] = res;
}
for(int i = 0; i < q; i++) printf("%lld\n", ans[i]);
return 0;
}
Codeforces #442 Div2 F的更多相关文章
- Codeforces #541 (Div2) - F. Asya And Kittens(并查集+链表)
Problem Codeforces #541 (Div2) - F. Asya And Kittens Time Limit: 2000 mSec Problem Description Inp ...
- cf 442 div2 F. Ann and Books(莫队算法)
cf 442 div2 F. Ann and Books(莫队算法) 题意: \(给出n和k,和a_i,sum_i表示前i个数的和,有q个查询[l,r]\) 每次查询区间\([l,r]内有多少对(i, ...
- Codeforces #451 Div2 F
#451 Div2 F 题意 给出一个由数字组成的字符串,要求添加一个加号和等号,满足数字无前导 0 且等式成立. 分析 对于这种只有数字的字符串,可以快速计算某一区间的字符串变成数字后并取模的值,首 ...
- Codeforces #452 Div2 F
#452 Div2 F 题意 给出一个字符串, m 次操作,每次删除区间 \([l,r]\) 之间的字符 \(c\) ,输出最后得到的字符串. 分析 通过树状数组和二分,我们可以把给定的区间对应到在起 ...
- Codeforces #442 Div2 E
#442 Div2 E 题意 给你一棵树,每个结点有开关(0表示关闭,1表示开启),两种操作: 反转一棵子树所有开关 询问一棵子树有多少开关是开着的 分析 先 DFS 把树上的结点映射到区间上,然后就 ...
- Codeforces #528 Div2 F (1087F) Rock-Paper-Scissors Champion 树状数组+set
题意:n个人站成一排,初始时刻每个人手中都有一个图案,可能是石头,剪刀,布3个中的1种,之后会随机选取相邻的两个人玩石头剪刀布的游戏,输的人会离开(如果两个人图案相同,则随机选择一个人离开).执行(n ...
- Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)
Problem Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...
- Codeforces #180 div2 C Parity Game
// Codeforces #180 div2 C Parity Game // // 这个问题的意思被摄物体没有解释 // // 这个主题是如此的狠一点(对我来说,),不多说了这 // // 解决问 ...
- Codeforces #541 (Div2) - E. String Multiplication(动态规划)
Problem Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...
随机推荐
- Antlr 在 idea 中正确使用的方式
问题 Caused by: java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN ...
- cf 442 D. Olya and Energy Drinks
cf 442 D. Olya and Energy Drinks(bfs) 题意: 给一张\(n \times m(n <= 1000,m <= 1000)\)的地图 给出一个起点和终点, ...
- 洛谷 P2827 蚯蚓 解题报告
P2827 蚯蚓 题目描述 本题中,我们将用符号 \(\lfloor c \rfloor\) 表示对 \(c\) 向下取整,例如:\(\lfloor 3.0 \rfloor = \lfloor 3.1 ...
- 【BZOJ 3195 】[Jxoi2012]奇怪的道路 装压dp
受惯性思维的影响自动把二进制状态认为是连与不连......... 我们这里二进制状态表示的是奇偶,这样的话我们f[i][j][k]表示的就是前i个城市用了j个边他前k个城市的奇偶状态,然后想想怎么转移 ...
- Android开发注意点小记
暂时主要讨论以下几点: Android引用外部包,报NoClassDefFoundError异常崩溃 同名包引用关系问题 程序图标 9patch图片素材 Android引用外部包,程序报java.la ...
- 安卓和html的互相调用
1.写html和安卓布局 <Button android:id="@+id/btn" android:layout_width="wrap_content" ...
- 用spring的@Validated注解和org.hibernate.validator.constraints.*的一些注解在后台完成数据校验
这个demo主要是让spring的@Validated注解和hibernate支持JSR数据校验的一些注解结合起来,完成数据校验.这个demo用的是springboot. 首先domain对象Foo的 ...
- 跨域请求json数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- nginx重要配置项简要说明
1.重要配置项 以下是一个完整的nginx配置信息. #================================以下是全局配置项 #指定运行nginx的用户和用户组,默认情况下该选项关闭(关闭 ...
- Python基础(5)_文件操作
一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 二.文件打开模式 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文 ...