[AHOI2013]作业

题目大意:

给定一个长度为\(n(n\le10^5)\)的数列\(A(1\le A_i\le n)\)。\(m(m\le10^6)\)次询问,每次询问区间\([l,r]\)内满足\(a\le A_i\le b\)的数有多少,去重后又有多少。

思路:

莫队+分块。

时间复杂度\(\mathcal O(n\sqrt n)\)。

源代码:

#include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1e5+1,M=1e6;
int n,m,block,a[N],ans0[M],ans1[M],cnt[N],sum[N],tot[N],bel[N],beg[N],end[N];
struct Query {
int l,r,a,b,id;
bool operator < (const Query &rhs) const {
if(l/block==rhs.l/block) return r<rhs.r;
return l/block<rhs.l/block;
}
};
Query q[M];
inline void ins(const int &x) {
if(!cnt[x]++) tot[bel[x]]++;
sum[bel[x]]++;
}
inline void del(const int &x) {
if(!--cnt[x]) tot[bel[x]]--;
sum[bel[x]]--;
}
inline std::pair<int,int> query(const int &l,const int &r) {
int ret0=0,ret1=0;
if(bel[l]==bel[r]) {
for(register int i=l;i<=r;i++) {
ret0+=cnt[i];
ret1+=!!cnt[i];
}
return std::make_pair(ret0,ret1);
}
for(register int i=l;i<=end[bel[l]];i++) {
ret0+=cnt[i];
ret1+=!!cnt[i];
}
for(register int i=bel[l]+1;i<bel[r];i++) {
ret0+=sum[i];
ret1+=tot[i];
}
for(register int i=beg[bel[r]];i<=r;i++) {
ret0+=cnt[i];
ret1+=!!cnt[i];
}
return std::make_pair(ret0,ret1);
}
int main() {
n=getint(),m=getint(),block=sqrt(n);
for(register int i=1;i<=n;i++) a[i]=getint();
for(register int i=0;i<m;i++) {
q[i].l=getint();
q[i].r=getint();
q[i].a=getint();
q[i].b=getint();
q[i].id=i;
}
std::sort(&q[0],&q[m]);
for(register int i=1;i<=n;i++) {
bel[i]=i/block;
if(!beg[bel[i]]) beg[bel[i]]=i;
end[bel[i]]=i;
}
for(register int i=0,l=1,r=0;i<m;i++) {
while(r<q[i].r) ins(a[++r]);
while(r>q[i].r) del(a[r--]);
while(l>q[i].l) ins(a[--l]);
while(l<q[i].l) del(a[l++]);
const std::pair<int,int> p=query(q[i].a,q[i].b);
ans0[q[i].id]=p.first;
ans1[q[i].id]=p.second;
}
for(register int i=0;i<m;i++) {
printf("%d %d\n",ans0[i],ans1[i]);
}
return 0;
}

[AHOI2013]作业的更多相关文章

  1. BZOJ 3236: [Ahoi2013]作业

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ3236: [AHOI2013]作业

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

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

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

随机推荐

  1. 拼接html a标签字符串,onClick传递两个字符串类型参数写法

    在参数传递过程中字符串类型的参数要有引号,我一开始拼接的完成后,没有想到要加引号,后来想到了这一问题,可是怎么拼都不对,于是就搜了很多拼接的例子,发现并没有几个能借鉴的,最后终于在一个人的博客中看到, ...

  2. MySQL记录异常实体类设计

    public class LogInfo { /// <summary> /// 应用名 /// </summary> public string AppName { get; ...

  3. 从零开始编写自己的JavaScript框架(一)

    1. 模块的定义和加载 1.1 模块的定义 一个框架想要能支撑较大的应用,首先要考虑怎么做模块化.有了内核和模块加载系统,外围的模块就可以一个一个增加.不同的JavaScript框架,实现模块化方式各 ...

  4. Ansible Tower系列 二(安装 Tower)【转】

    文档:http://docs.ansible.com/ansible-tower/ 安装前检查 python版本为2.6 保持网络畅通 内存预留充足 安装用户为root 软件下载 下载地址:http: ...

  5. 部分Web服务器信息对比

    本文参考wikipedia的Web服务器比较页面的数据,选取了其中自己感兴趣的Web服务器的信息进行了对比,包括,Apache HTTP Server.Apache Tomcat.Nginx.Catt ...

  6. OCR识别-python3.5版

    刚接触,啥子都不会,按着教程走 需求:识别图片中的文字信息环境:windows系统 开发语言:python3.5 使用工具类:1.pyocr 2.PIL 3.tesseract-ocr 步骤: 1.p ...

  7. .NetCore Linux环境下安装InfluxDB以及配置设置

    Linux下安装 确定需要安装的版本,我的linux是干净的,所以我需要先安装wget yum -y install wget 下载安装 wget https://dl.influxdata.com/ ...

  8. hdu 5038 (2014北京网络赛G 排序水题)

    题意:有n个数字,带入10000 - (100 - ai) ^ 2公式得到n个数,输出n个数中频率最大的数,如果有并列就按值从小到大都输出输出,如果频率相同的数字是全部的n个数,就输出Bad....题 ...

  9. oracle的sql语句大小写

    我相信大家都知道,oracle数据库是区分大小写的,而且oracle的默认为大写的,也就是说你在sql脚本上面写的sql语句,oracle运行的时候,它会自动转化为大写的.注意一下,我这里举例子的计算 ...

  10. CentOS6下Jenkins连接Git服务器出错的问题

    今天研究GitLab+Jenkins自动集成时,出现Failed to connect to repository : Command "git config --local credent ...