题解【[AHOI2013]作业】
\]
数据貌似很水,据说 \(A_i\leq n\) ,连离散化都不需要。
不知道为啥设块大小为 \(\frac{n}{\sqrt m}\) 会一直 Runtime Error on test 1,3,4 ,改成 \(\sqrt n\) 就 \(A\) 了,据说是 \(m=0\) 的问题,但我明明特判了阿 qwq 。
\]
给出一个长度为 \(n\) 的序列 \(A\) ,一共 \(m\) 次询问,每次需要回答 " 区间 \([l,r]\) 内有多少个位置上的数的大小在 \([a,b]\) 内" 以及 " 区间 \([l,r]\) 内出现的所有数中,有多少个数的大小在 \([a,b]\) 内 " 。
\]
莫队 \(+\) 树状数组。
我们知道莫队可以解决 " 区间内数的出现次数 " 这类问题。
在上文提到的,\(A_i \leq n\) 。
所以可以直接开个两个桶,c[x][1] 表示值为 \(x\) 的数的出现次数,c[x][2] 表示值为 \(x\) 的数有没有出现过。
然后我们发现每个询问答案要求的其实是 \(\sum\limits_{i=a}\limits^b c[i][1]\) 和 \(\sum\limits_{i=a}\limits^b c[i][2]\) ,本质上是一个区间求和,但是它还需要支持单点修改(插入和删除)。
于是我们可以用一个 支持 \(O(\log n)\) 单点修改以及区间求和的数据结构 维护这两个桶,此时树状数组就是一个不错的选择。
时间复杂度 \(O(n \sqrt n \log n)\) 。
\]
#include<cstdio>
#include<algorithm>
#include<cmath>
#define RI register int
using namespace std;
inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
}
const int N=100100,M=100100,MaxV=100100;
int n,m;
int S;
int block(int x)
{
return (x-1)/S+1;
}
int a[N];
struct ask{
int l,r;
int a,b;
int id;
int ans1,ans2;
}q[M];
bool cmp(ask a,ask b)
{
return block(a.l)==block(b.l)?a.r<b.r:a.l<b.l;
}
bool rebuild(ask a,ask b)
{
return a.id<b.id;
}
int cnt[MaxV];//再开一个辅助桶便于维护
int c[MaxV][3];
void BITadd(int x,int t,int val)
{
for(;x<=n;x+=x&-x)c[x][t]+=val;
}
int BITask(int x,int t)
{
int ans=0;
for(;x;x-=x&-x)ans+=c[x][t];
return ans;
}
void add(int x)
{
cnt[a[x]]++;
BITadd(a[x],1,1);
if(cnt[a[x]]==1)BITadd(a[x],2,1);
}
void sub(int x)
{
cnt[a[x]]--;
BITadd(a[x],1,-1);
if(cnt[a[x]]==0)BITadd(a[x],2,-1);
}
int main()
{
n=read(),m=read();
if(!m)
return 0;
S=sqrt(n);
for(RI i=1;i<=n;i++)
a[i]=read();
for(RI i=1;i<=m;i++)
q[i].l=read(),q[i].r=read(),q[i].a=read(),q[i].b=read(),q[i].id=i;
sort(q+1,q+1+m,cmp);
int l=1,r=0;
for(RI i=1;i<=m;i++)
{
while(r<q[i].r)add(++r);
while(r>q[i].r)sub(r--);
while(l<q[i].l)sub(l++);
while(l>q[i].l)add(--l);
q[i].ans1=BITask(q[i].b,1)-BITask(q[i].a-1,1);
q[i].ans2=BITask(q[i].b,2)-BITask(q[i].a-1,2);
}
sort(q+1,q+1+m,rebuild);
for(RI i=1;i<=m;i++)
printf("%d %d\n",q[i].ans1,q[i].ans2);
return 0;
}
\]
题解【[AHOI2013]作业】的更多相关文章
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
- Bzoj 3236: [Ahoi2013]作业 莫队,分块
3236: [Ahoi2013]作业 Time Limit: 100 Sec Memory Limit: 512 MBSubmit: 1113 Solved: 428[Submit][Status ...
- 【Luogu4396】[AHOI2013]作业(莫队)
[Luogu4396][AHOI2013]作业(莫队) 题面 洛谷 题解 模板题 #include<iostream> #include<cstdio> #include< ...
- 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块
[BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...
- BZOJ 3236: [Ahoi2013]作业
3236: [Ahoi2013]作业 Time Limit: 100 Sec Memory Limit: 512 MBSubmit: 1393 Solved: 562[Submit][Status ...
- BZOJ 3236: [Ahoi2013]作业( 莫队 + BIT )
莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ----------------------------------------------- ...
- BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块
BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了 ...
- [AHOI2013]作业
[AHOI2013]作业 题目大意: 给定一个长度为\(n(n\le10^5)\)的数列\(A(1\le A_i\le n)\).\(m(m\le10^6)\)次询问,每次询问区间\([l,r]\)内 ...
- BZOJ3236: [AHOI2013]作业
BZOJ3236: [AHOI2013]作业 题目描述 传送门 行,我知道是Please contact lydsy2012@163.com! 传送门2 题目分析 这题两问还是非常,emmmm. 首先 ...
- bzoj 3236: [Ahoi2013]作业(缺线段树)
3236: [Ahoi2013]作业 Time Limit: 100 Sec Memory Limit: 512 MBSubmit: 1744 Solved: 702[Submit][Status ...
随机推荐
- Spring Boot2.X整合消息中间件RabbitMQ原理简浅探析
目录 1.简单概述RabbitMQ重要作用 2.简单概述RabbitMQ重要概念 3.Spring Boot整合RabbitMQ 前言 RabbitMQ是一个消息队列,主要是用来实现应用程序的异步和解 ...
- MongoDB高级用法
MongoDB高级查询用法大全 转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册:http://ww ...
- html 小游戏合集(1.0)
最近做了个小游戏合集,有点沙雕,毕竟是1.0,将就看看. <!DOCTYPE html> <html> <head> <meta charset=" ...
- nginx负载均衡动态自动更新(微博开源模块nginx-upsync-module使用)
这几天项目有个需求:负载要求能根据节点健康状态动态的增减.nginx自带的upstram已经很强大,而且基于Nginx Upstream配置动态更新已经有很多开源方案,大多数都是基于生成配置文件后进行 ...
- html5中的Web Storage
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage.sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有 ...
- 成功填坑! Java引入QQ登录时,AccessToken [accessToken=, expireIn=];
主要就是会一直进入下面这一行,也就是accessTokenObj.getAccessToken().equals("") 此时前端显示如下 AccessToken [accessT ...
- Go 每日一库之 viper
简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库. viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/ ...
- [DP][SA][可持久化线段树]黑红兔
源自 xyz32768 菜鸡的 FJ 省冬令营模拟赛题 原题 CF1063F Statement 给定一个长度为 \(n\) 的字符串 \(s\),仅包含小写英文字母 要从中从左往右选出若干段不相交的 ...
- [LOJ#2743][DP]「JOI Open 2016」摩天大楼
题目传送门 DP 经典题 考虑从小到大把数加入排列内 如下图(\(A\) 已经经过排序): 我们考虑如上,在 \(i\) ( \(A_i\) )不断增大的过程中,维护上面直线 \(y=A_i\) 之下 ...
- 之前见汤姆大叔 写过一系列的 js 深入理解 呢 很是感觉经典
最近要把这些给翻个遍 加油 js 隐式全局变量 读后感 1:js 没有变量名称是否重复定义的检查,在cshrp里有这样的检查, 没有变量名称重复的检查,这样 当变量名称 重复定义的时候 相同命名的变 ...