博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cf 442 div2 F. Ann and Books(莫队算法)
阅读量:6546 次
发布时间:2019-06-24

本文共 2404 字,大约阅读时间需要 8 分钟。

(莫队算法)

题意:

\(给出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
#define LL long longusing 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
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;}

转载于:https://www.cnblogs.com/jiachinzhao/p/7738382.html

你可能感兴趣的文章
第18章 使用MariaDB数据库管理系统
查看>>
浅谈MySQL的B树索引与索引优化
查看>>
【喜报】HCIE--PASS !最可怕的敌人,就是没有坚强的信念!
查看>>
想学前端,为什么不看这些书呢?
查看>>
记一次mapreduce读取不到输入文件的问题
查看>>
我的友情链接
查看>>
MariaDB集群Galera Cluster的研究与测试
查看>>
SONY控制键盘JX-11,EVI-D70P控制方案
查看>>
Spring AOP 之二:Pointcut注解表达式
查看>>
在普通台式机上搭建服务器虚拟化架构Esxi平台
查看>>
电话线路 30B+D 名词解释
查看>>
python字典嵌套字典实例
查看>>
吉炬消费系统软件输入密码后无法打开软件界面故障处理
查看>>
Hibernate学习系列————注解一对多双向实例
查看>>
Cannot load from mysql.proc
查看>>
网络运维之 EX4200消除var分区使用过高的告警
查看>>
【最好的流程是没有流程】
查看>>
Apache Thrift 教程
查看>>
Python Epoll
查看>>
AS3歌词同步详解
查看>>