博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块
阅读量:6071 次
发布时间:2019-06-20

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

题目描述

输入

输出

样例输入

3 4
1 2 2
1 2 1 3
1 2 1 1
1 3 1 3
2 3 2 3

样例输出

2 2
1 1
3 2
2 1

提示

N=100000,M=1000000

 

莫队+树状数组:

先考虑每次询问没有权值区间限制的情况,将询问离线排序,用一个数组记录答案,莫队即可。

但现在每次询问有了查询的权值区间,显然一个数组无法记录答案,我们用树状数组来记录答案。

对于第一问直接用树状数组即可,对于第二问先用数组记录每个权值是否出现过再用树状数组维护即可。

莫队时间复杂度是$O(mlog_{n}\sqrt{n})$,查询时间复杂度是$O(mlog_{n})$。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long longusing namespace std;struct lty{ int l,r; int a,b; int num;}q[1000010];int ans1[1000010];int ans2[1000010];int v1[100010];int v2[100010];int t[100010];int s[100010];int n,m;int L,R;int block;inline bool cmp(lty x,lty y){ return (x.l/block)==(y.l/block)?x.r
q[i].l) { L--; if(!t[s[L]]) { add2(s[L],1); } t[s[L]]++; add1(s[L],1); } while(R
q[i].r) { if(t[s[R]]==1) { add2(s[R],-1); } t[s[R]]--; add1(s[R],-1); R--; } ans1[q[i].num]=ask1(q[i].b)-ask1(q[i].a-1); ans2[q[i].num]=ask2(q[i].b)-ask2(q[i].a-1); } for(int i=1;i<=m;i++) { printf("%d %d\n",ans1[i],ans2[i]); }}

莫队+分块:

可以发现莫队+树状数组的做法时间复杂度主要在双指针移动时对答案的维护。

我们将树状数组改成分块,那么单次移动指针时间复杂度为$O(1)$,而单次查询的时间复杂度是$O(\sqrt{n})$。

这样莫队的时间复杂度是$O(m\sqrt{n})$,查询的时间复杂度为$O(m\sqrt{n})$。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long longusing namespace std;struct lty{ int l,r; int a,b; int num;}q[1000010];int ans1[1000010];int ans2[1000010];int sum1[100010];int sum2[100010];int v1[100010];int v2[100010];int t[100010];int s[100010];int n,m;int L,R;int block;inline bool cmp(lty x,lty y){ return (x.l/block)==(y.l/block)?x.r
q[i].l) { L--; if(!t[s[L]]) { add2(s[L],1); } t[s[L]]++; add1(s[L],1); } while(R
q[i].r) { if(t[s[R]]==1) { add2(s[R],-1); } t[s[R]]--; add1(s[R],-1); R--; } ans1[q[i].num]=ask1(q[i].a,q[i].b); ans2[q[i].num]=ask2(q[i].a,q[i].b); } for(int i=1;i<=m;i++) { printf("%d %d\n",ans1[i],ans2[i]); }}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10602963.html

你可能感兴趣的文章
用yum安装mariadb
查看>>
一点IT"边缘化"的人的思考
查看>>
Gallery循环滑动
查看>>
Sql与C#中日期格式转换总结
查看>>
iOS开发流程总结
查看>>
hadoop datanode 启动出错
查看>>
js颜色拾取器
查看>>
IDEA使用(1)intellIJ idea 配置 svn
查看>>
Thread Safety in Java(java中的线程安全)
查看>>
WPF 降低.net framework到4.0
查看>>
数据管理DMS 全量SQL诊断:你的SQL是健康的蓝色,还是危险的红色?
查看>>
搭建一个通用的脚手架
查看>>
开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
查看>>
开源磁盘加密软件VeraCrypt教程
查看>>
本地vs云:大数据厮杀的最终幸存者会是谁?
查看>>
阿里云公共镜像、自定义镜像、共享镜像和镜像市场的区别 ...
查看>>
shadowtunnel v1.7 发布:新增上级负载均衡支持独立密码
查看>>
Java线程:什么是线程
查看>>
mysql5.7 创建一个超级管理员
查看>>
【框架整合】Maven-SpringMVC3.X+Spring3.X+MyBatis3-日志、JSON解析、表关联查询等均已配置好...
查看>>