\[\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. js面试题之手写节流函数和防抖函数

    函数节流:不断触发一个函数后,执行第一次,只有大于设定的执行周期后才会执行第二次 /* 节流函数:fn:要被节流的函数,delay:规定的时间 */ function throttle(fn,dela ...

  2. git stash使用

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/daguanjia11/article/ ...

  3. react-antd-input-onPressEnter

    2020-01-11 ant-Design ,Input , onPressEnter 和 onChange 的区别 需求:看下图,右边栏配置开关组件的内容.输入内容,不想要左边实时更改 原来的代码: ...

  4. cometoj 茶颜悦色|扫描线+懒惰标记

    传送门 题目描述 茶颜悦色也太好喝了!鸡尾酒在长沙的各种茶颜悦色的店铺中流连忘返.他发现长沙有炒鸡多的茶颜悦色店,走两步就能遇到一家. “方圆一公里能有十家茶颜悦色!”鸡尾酒感叹了起来. 于是他想到了 ...

  5. CCPC-Wannafly Winter Camp Day1 (Div2 ABCFJ) 待补...

    Day1 Div2 场外链接 按题目顺序~ A 机器人 传送门 题意:有两条平行直线A.B,每条直线上有n个点,编号为1~n.在同一直线上,从a站点到b站点耗时为两点间的距离.存在m个特殊站点,只有在 ...

  6. 为QLabel增加Clicked信号

    QT为QLabel添加Click事件(如果我们使用组件,我们关心的是信号槽:如果我们自定义组件,我们关心的是事件) 其实就是改写了一个函数:mouseReleaseEvent,当在QLabel放开鼠标 ...

  7. Java虚拟机OOM问题和四大引用问题简述

    一.请你谈谈实际的项目中在Java虚拟机会抛出哪些异常,每个异常都是怎么产生的? 1.java.lang.StackOverflowError 栈空间满了 public static void sta ...

  8. Redis系列之----Redis的过期设置及淘汰策略

    Redis的过期时间机制和内存淘汰策略    Redis的数据是存储在内存中的,而服务器的内存大小是有限制的,除非宕机,否则这些数据会一直存在,对于一些不再使用的key,也应当进行删除,否则会浪费内存 ...

  9. OpenStack Identity API v3 extensions (CURRENT)

    Table Of Contents Identity API v3 extensions (CURRENT) OS-ENDPOINT-POLICY API Associate policy and e ...

  10. 唬人的Java泛型并不难

    泛型 public interface Foo<E> {}public interface Bar<T> {}public interface Zar<?> {} ...