Link

题目大意:\(n\)个数,\(m\)个询问,每次四个参数,\(l,r,a,b\),问区间\([l,r]\)中出现过的,数值在\([a,b]\)区间中的数的个数以及区间\([l,r]\)中数值在\([a,b]\)中的数的个数。

注意理解 这两个是不一样的。

\(\text{Solution:}\)

观察到区间颜色出现次数可以想到莫队。

由于多了一个限制,那么我们考虑如何更新答案,并利用前缀思想:

指针移动的时候,维护颜色数以及这个颜色的值,对应在一个树状数组上更新。注意维护两个树状数组,分别处理两个询问。其他的和普通莫队没什么区别。

复杂度\(O(n\sqrt{n}\log n).\)此处替换\(m\)因为它们同阶。

其实还有莫队套分块的更优复杂度以及\(KDT,cdq\)分治等多种做法,在此不做赘述。

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) (x&(-x))
const int MAXN=1e6+10;
int col[MAXN],cnt[MAXN],a[MAXN],n,m,tr[MAXN];
int bl[MAXN],siz,bnum,now,tr1[MAXN];
pair<int,int>ans[MAXN];
inline bool R(char C){return C>='0'&&C<='9';}
inline int read(){
int s=0;
char ch=getchar();
while(!R(ch))ch=getchar();
while(R(ch))s=s*10+ch-48,ch=getchar();
return s;
}
inline void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>=10)write(x/10);
putchar(x%10+48);
}
struct Q{
int l,r,a,b,id;
}q[MAXN];
inline bool cmp(Q a,Q b){return (bl[a.l]^bl[b.l])?bl[a.l]<bl[b.l]:(bl[a.l]&1)?a.r<b.r:a.r>b.r;}
inline void change(int x,int v){for(;x<=n;x+=lowbit(x))tr[x]+=v;}
inline int sum(int x){int res=0;for(;x;x-=lowbit(x))res+=tr[x];return res;}
inline void change2(int x,int v){for(;x<=n;x+=lowbit(x))tr1[x]+=v;}
inline int sum2(int x){int res=0;for(;x;x-=lowbit(x))res+=tr1[x];return res;} inline void del(int x){
--cnt[a[x]];
if(!cnt[a[x]])now--,change(a[x],-1);
change2(a[x],-1);
}
inline void add(int x){
if(!cnt[a[x]])change(a[x],1),now++;
++cnt[a[x]];change2(a[x],1);
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;++i)a[i]=read();
siz=sqrt(n);bnum=ceil((double)n/siz);
for(int i=1;i<=bnum;++i)for(int j=(i-1)*siz+1;j<=i*siz;++j)bl[j]=i;
for(int i=1;i<=m;++i){
q[i].id=i;
q[i].l=read();
q[i].r=read();
q[i].a=read();
q[i].b=read();
}
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;++i){
int ql=q[i].l,qr=q[i].r;
while(l<ql)del(l++);
while(l>ql)add(--l);
while(r<qr)add(++r);
while(r>qr)del(r--);
ans[q[i].id].first=sum2(q[i].b)-sum2(q[i].a-1);
ans[q[i].id].second=sum(q[i].b)-sum(q[i].a-1);
}
for(int i=1;i<=m;++i)write(ans[i].first),putchar(' '),write(ans[i].second),putchar('\n');
return 0;
}

【题解】[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. Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...

  2. [PyTorch 学习笔记] 4.3 优化器

    本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson4/optimizer_methods.py https: ...

  3. 分享一个后端专用login模板

    给大家啊分享一个后端专用login模板 Java工程师再也不用这样啦---> html源码 <html lang="en"> <head> <m ...

  4. C++——百分率

    代码如下: #include <iostream> #include <cmath> using namespace std; int main() { double a; c ...

  5. robotframework运行时后台报错UnicodeDecodeError,无日志输出

    解决办法: 1.找到对应位置的testrunner.py文件,修改字符集为GBK 2.删除同级目录下的testrunner.pyc 3.重启ride

  6. Node.js连接MongoDB数据库

    首先要启动MongoDB服务器 先找到你的mongoDb安装目录,我的如下:就在bin文件夹下创建一个data文件夹,data内包含两个空文件夹,如下: 接着回到bin文件夹处,按住shift键,右击 ...

  7. docker下部署jira破解版

    1. 制作Docker破解容器 在/opt/jira下新建一个Dockerfile文件 touch Dockerfile 编辑Dockerfile文件 vim Dockerfile FROM cpta ...

  8. 软件测试----xml文件介绍

    软件测试 目录 软件测试 一.什么是XML?: 二.XML和HTML的差异: 三.XML的特点 1.XML可以自定义标签 2.XML必须包含根元素 如上所示, 3.XML标签对大小写敏感 4.XML ...

  9. vue | vue实现列表同时展开与单独展开

    需求:每个li标签在点击的时候,都同时展开. 但是碰见几个问题: 1.如果点第一个li 所有li都会展开: 2.点击第一个li,第一个li展开,点击第二个li,第一个li闭合,第二个li展开 这两种情 ...

  10. es创建普通索引以及各种查询

    创建索引 创建普通索引: PUT /my_index { "settings": { "index": { "number_of_shards&quo ...