\[\texttt{Preface}
\]

数据貌似很水,据说 \(A_i\leq n\) ,连离散化都不需要。

不知道为啥设块大小为 \(\frac{n}{\sqrt m}\) 会一直 Runtime Error on test 1,3,4 ,改成 \(\sqrt n\) 就 \(A\) 了,据说是 \(m=0\) 的问题,但我明明特判了阿 qwq 。

\[\texttt{Description}
\]

给出一个长度为 \(n\) 的序列 \(A\) ,一共 \(m\) 次询问,每次需要回答 " 区间 \([l,r]\) 内有多少个位置上的数的大小在 \([a,b]\) 内" 以及 " 区间 \([l,r]\) 内出现的所有数中,有多少个数的大小在 \([a,b]\) 内 " 。

\[\texttt{Solution}
\]

莫队 \(+\) 树状数组。

我们知道莫队可以解决 " 区间内数的出现次数 " 这类问题。

在上文提到的,\(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)\) 。

\[\texttt{Code}
\]

#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;
}

\[\texttt{Thanks} \ \texttt{for} \ \texttt{watching}
\]

题解【[AHOI2013]作业】的更多相关文章

  1. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  2. Bzoj 3236: [Ahoi2013]作业 莫队,分块

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1113  Solved: 428[Submit][Status ...

  3. 【Luogu4396】[AHOI2013]作业(莫队)

    [Luogu4396][AHOI2013]作业(莫队) 题面 洛谷 题解 模板题 #include<iostream> #include<cstdio> #include< ...

  4. 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块

    [BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...

  5. BZOJ 3236: [Ahoi2013]作业

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1393  Solved: 562[Submit][Status ...

  6. BZOJ 3236: [Ahoi2013]作业( 莫队 + BIT )

    莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ----------------------------------------------- ...

  7. BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块

    BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了 ...

  8. [AHOI2013]作业

    [AHOI2013]作业 题目大意: 给定一个长度为\(n(n\le10^5)\)的数列\(A(1\le A_i\le n)\).\(m(m\le10^6)\)次询问,每次询问区间\([l,r]\)内 ...

  9. BZOJ3236: [AHOI2013]作业

    BZOJ3236: [AHOI2013]作业 题目描述 传送门 行,我知道是Please contact lydsy2012@163.com! 传送门2 题目分析 这题两问还是非常,emmmm. 首先 ...

  10. bzoj 3236: [Ahoi2013]作业(缺线段树)

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1744  Solved: 702[Submit][Status ...

随机推荐

  1. 彻底掌握CORS跨源资源共享

    本文来自于公众号链接: 彻底掌握CORS跨源资源共享 ) 本文接上篇公众号文章:彻底理解浏览器同源策略SOP 一.概述 在云时代,各种SAAS应用层出不穷,各种互联网API接口越来越丰富,H5技术在微 ...

  2. 830. String Sort

    830. String Sort 题解 int alpha[256] = {0};//记录字符的次数 bool cmp(char a,char b) { if(alpha[a]==alpha[b])/ ...

  3. [小技巧] Windows 命令行显示英文

    在 Windows 里 " 运行" 使用 cmd 进行命令行, 如果是Windows 中文版的话,里面的命令输出是中文. 如果要显示英文的话,可以使用如下的命令: chcp 437 ...

  4. python 生成器 yield语句

    生成器就是一个返回迭代器(iterator)的函数. 包含了 yield 的函数,就是一个生成器. 生成器每使用yield语句产生一个值,函数就会被冻结(暂停执行),被唤醒后(即再次调用)接着上次执行 ...

  5. 【智能合约】编写复杂业务场景下的智能合约——可升级的智能合约设计模式(附Demo)

    智能合约的现状 以太坊在区块链上实现了智能合约的概念,用于:同质化通证发行(ERC-20).众筹.投票.存证取证等等,共同点是:合约逻辑简单,只是业务流程中的关键节点,而非整个业务流程.而智能合约想解 ...

  6. __init__.py在导包中起到的作用

    说明:__init__.py这个文件本人使用频率不高 例子: __init__.py文件作用:初始化这个包 1.v1.py def vi(): return 'views' 2.views->_ ...

  7. 代码审计之CVE-2018-7600-Drupal远程代码执行漏洞-Render API

    今天学习一下Drupal的另一个漏洞,由于渲染数组不当造成的漏洞 poc: url:http://localhost/drupal-8.5.0/user/register?element_parent ...

  8. 前端之css的基本使用(一),行内、内部、外部样式,语法格式、注释、选择符、属性等

    一.行内.内部.外部样式 1.行内样式 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  9. volatile梳理

    volatile 可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值. 在Java中为了加快程序的运行 ...

  10. redis--->字符串和哈希对比

    redis 的字符串和哈希对比 相同点和不同点 相同点: 首先是他们有很多效果类似的命令,比如set和hset,mset和hmset等等 大多数情况下使用字符串存储的场景使用hash也可以实现. 不同 ...