题目大意

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

莫队

要是看到很难维护的东西,又允许离线,多半就是莫队。(雾)

来看看一个区间在满足条件的情况有啥可以用到的东西:

\[s1[R] - s1[L-1] = s2[R] - S2[L-1] + k
\]

\(s1[i]\) 表示从 \(1\) 到 \(i\) 有多少个一类元素,\(s2\) 同理。

移项:

\[(s1[R]-s2[R])=(s1[L-1]-s2[L-1])+k
\]

转化成了这样一个问题:

\[\sum_{i=L-1}^{R-1}\sum_{j=i+1}^R[val[j]=val[i]+k]
\]

其中 \(val[i]\) 表示 \(s1[i] - s2[i]\)。

首先我们在莫队的过程中维护一个桶,表示目前区间中有多少个 \(val[i]\)。

在莫队的转移过程中,我们得考虑新加入的元素是在左侧还是在右侧。

如果在左侧,\(ans+=Bucket[val[i]+k]\)(因为区间的右侧要比自己大);如果在右侧,则 \(ans+=Bucket[val[i]-k]\)。

关于如何维护桶,离散化就行了。

记得离散化的数组不仅要加入 \(val[i],val[i]+k\) 和 \(val[i]-k\),还要加入 \(0,k\) 和 \(-k\)。(因为 \(val[0]=0\))

code:

#include<algorithm>
#include<cstdio>
#include<cmath>
const int M=1e5+5;
typedef long long ll;
int len;ll lsh[M*3];
int n,m,k,p,t[M],v[M],nxt[M],pre[M];ll CB[M*3];ll now,val[M],ans[M];
struct Query{
int L,R,p,id;
inline bool operator<(const Query&it)const{
return p==it.p?p&1?R<it.R:R>it.R:L<it.L;
}
}q[M];
inline void Add(const int&id,const int&to){
now+=CB[to];++CB[v[id]];
}
inline void Del(const int&id,const int&to){
--CB[v[id]];now-=CB[to];
}
signed main(){
register int i,L=1,R=0;
scanf("%d%d",&n,&k);lsh[++len]=0;lsh[++len]=k;lsh[++len]=-k;
for(i=1;i<=n;++i)scanf("%d",t+i);
for(i=1;i<=n;++i){
scanf("%lld",val+i);
if(t[i]==1)val[i]=val[i-1]+val[i];
else val[i]=val[i-1]-val[i];
lsh[++len]=val[i];lsh[++len]=val[i]-k;lsh[++len]=val[i]+k;
}
std::sort(lsh+1,lsh+len+1);len=std::unique(lsh+1,lsh+len+1)-lsh-1;
for(i=0;i<=n;++i){
v[i]=std::lower_bound(lsh+1,lsh+len+1,val[i])-lsh;
pre[i]=std::lower_bound(lsh+1,lsh+len+1,val[i]-k)-lsh;
nxt[i]=std::lower_bound(lsh+1,lsh+len+1,val[i]+k)-lsh;
}
scanf("%d",&m);p=ceil(n/sqrt(m*2.0/3));
for(i=1;i<=m;++i){
scanf("%d%d",&q[i].L,&q[i].R);--q[i].L;
q[i].id=i;q[i].p=q[i].L/p;
}
std::sort(q+1,q+m+1);
for(i=1;i<=m;++i){
const int&QL=q[i].L,&QR=q[i].R;
while(R<QR)++R,Add(R,pre[R]);
while(L>QL)--L,Add(L,nxt[L]);
while(L<QL)Del(L,nxt[L]),++L;
while(R>QR)Del(R,pre[R]),--R;
ans[q[i].id]=now;
}
for(i=1;i<=m;++i)printf("%lld\n",ans[i]);
}

CF877F题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. Mybatis foreach的用法

    本文援引:https://www.cnblogs.com/fnlingnzb-learner/p/10566452.html 在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况 ...

  2. K8s多节点部署+负载均衡+keepalived ——囊萤映雪

    K8s多节点部署+负载均衡+keepalived --囊萤映雪 1.多节点master2 部署 2.负载均衡部署+keepalived 1.多节点master2部署: #从master01节点上拷贝证 ...

  3. 带你十天轻松搞定 Go 微服务系列(九、链路追踪)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...

  4. tarjan2

    反过来调过去,我还是感觉没学明白缩点 讲一个有向图中的所有强连通分量缩成一个点后,构成的新图是一个DAG. 一个点所在的强连通分量一定被该点所在DFS搜索树所包含 树上的边大致分为:树枝边,前向边(从 ...

  5. Vue脚手架报错 Component name "Student" should always be multi-word vue/multi-word-component-names

    报错信息分析: 新手在第一个次使用脚手架的时候难免会遇到各种各样奇怪的问题,最近在学习Vue的过程中就出现了如下问题 通过阅读报错信息可知: 是我们的组件名有一些问题,(报错信息翻译过来大概就是组件名 ...

  6. Realtime Data Processing at Facebook

    概要 这篇论文发表于2016年,主要是介绍Facebook内部的流式计算平台的设计与思考,对于流式计算的关键特性的实现选型上进行深度对比分析. 流式计算系统5个衡量指标 文中提到有5个重要的考量部分 ...

  7. Linux 时间操作及其同步

    完整格式支持链接:https://blog.imakiseki.cf/2022/02/27/techdev/linux-time-operations-and-sync/ 本文将以 Arch Linu ...

  8. kali linux 中python2不带pip的解决方法

    在使用kali2020版本时,发现pip只能安装python3的模块,没办法安装python2模块,但是我有需要用到python2来运行脚本,在此贴出解决办法 https://bootstrap.py ...

  9. windows上安装foremost

    做CTF题需要这工具来提取文件里的隐藏文件, 网上大部分是linux版本,之前好不容易找了一个exe文件结果还不能用.找了很长时间终于找到了: https://github.com/raddyfiy/ ...

  10. 配置IPv6地址跳变——网络测试仪实操

    第一部分:什么是IPv6地址跳变? IPv6地址跳变是指IPv6地址进行一系列有规则的变化,Renix支持对IPv6地址进行递增.递减.列表和随机变化. 如当用户想要仿真大量的源IPv6地址变化的数据 ...