传送门

解题思路

  莫队+树状数组。把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数。时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> using namespace std;
const int MAXM = 1000005;
const int MAXN = 100005; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
} int n,m,ans[MAXM][2],a[MAXN],f[MAXM*3],g[MAXM*3],siz,cnt[MAXM*3];
int cpy[MAXM*3],num; struct Data{
int l,r,a,b,id;
friend bool operator<(Data A,Data B){
if(A.l/siz!=B.l/siz) return A.l<B.l;
if((A.l/siz)&1) return A.r>B.r;
return A.r<B.r;
}
}data[MAXM]; inline void add1(int x,int k){
for(;x<=n;x+=x&-x) f[x]+=k;
}
inline void add2(int x,int k){
for(;x<=n;x+=x&-x) g[x]+=k;
}
inline int query1(int x){
if(x<1) return 0;int ret=0;
for(;x;x-=x&-x) ret+=f[x];
return ret;
}
inline int query2(int x){
if(x<1) return 0;int ret=0;
for(;x;x-=x&-x) ret+=g[x];
return ret;
} int main(){
n=rd(),m=rd();siz=sqrt(n)+1;
for(int i=1;i<=n;i++) a[i]=rd(),cpy[++num]=a[i];
for(int i=1;i<=m;i++){
data[i].l=rd(),data[i].r=rd(),data[i].a=rd();
data[i].b=rd(),data[i].id=i;cpy[++num]=data[i].a;
cpy[++num]=data[i].b;
}
sort(cpy+1,cpy+1+num);int u=unique(cpy+1,cpy+1+num)-cpy-1;
for(int i=1;i<=n;i++) a[i]=lower_bound(cpy+1,cpy+1+u,a[i])-cpy;
for(int i=1;i<=m;i++){
data[i].a=lower_bound(cpy+1,cpy+1+u,data[i].a)-cpy;
data[i].b=lower_bound(cpy+1,cpy+1+u,data[i].b)-cpy;
}
sort(data+1,data+1+m);
int L=1,R=0,l,r;
for(int i=1;i<=m;i++){
l=data[i].l,r=data[i].r;
while(R>r) {add1(a[R],-1);if(cnt[a[R]]==1) add2(a[R],-1);cnt[a[R]]--;R--;}
while(R<r) {R++;add1(a[R],1);if(!cnt[a[R]]) add2(a[R],1);cnt[a[R]]++;}
while(L>l) {L--;add1(a[L],1);if(!cnt[a[L]]) add2(a[L],1);cnt[a[L]]++;}
while(L<l) {add1(a[L],-1);if(cnt[a[L]]==1) add2(a[L],-1);cnt[a[L]]--;L++;}
ans[data[i].id][0]=query1(data[i].b)-query1(data[i].a-1);
ans[data[i].id][1]=query2(data[i].b)-query2(data[i].a-1);
}
for(int i=1;i<=m;i++)
printf("%d %d\n",ans[i][0],ans[i][1]);
return 0;
}

BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)的更多相关文章

  1. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  2. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...

  3. [AHOI2013]作业 莫队 树状数组

    #include<cmath> #include<cstdio> #include<algorithm> #include<string> #inclu ...

  4. bzoj3236 作业 莫队+树状数组

    莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  5. BZOJ 3236 AHOI 2013 作业 莫队+树状数组

    BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出     题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...

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

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

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

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

  8. BZOJ 3236 莫队+树状数组

    思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...

  9. bzoj 3289: Mato的文件管理 莫队+树状数组

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...

随机推荐

  1. QT blockingmaster例子学习

    dialog.h: #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include "masterthread.h&q ...

  2. BZOJ 3585: mex(分块+莫队)

    传送门 解题思路 首先直接莫队是能被卡的,时间复杂度不对.就考虑按照值域先进行分块再进行莫队,然后统计答案的时候就暴力扫所有的块,直到一个块内元素不满,再暴力扫这个块就行了,时间复杂度O(msqrt( ...

  3. 【Java架构:基础技术】一篇文章搞掂:Spring Boot

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文是对<Spring Boot 实战第4版>的总结,大家也可以去仔细研读该书 注意,书中使用的Spring Boot ...

  4. thinkcmf5 pc切换手机

    1.在simplewind\cmf\common.php 里找到“获取当前主题名”添加 if(cmf_is_mobile()){ $theme = config('cmf_mobile_default ...

  5. centos 安装 Lamp(Linux + Apache + PHP) 并安装 phpmyadmin

    来源:http://www.laozhe.net/302.html 一般情况下,安装的都是最新的正式版,除非你有特殊需求,要安装指定的版本,本文暂不讨论.从最基础的开始,一点点完成一个可用的 Linu ...

  6. DCloud-Video:Html5 Video 实现方案

    ylbtech-DCloud-Video:Html5 Video 实现方案 1.返回顶部 1.1. http://ask.dcloud.net.cn/article/569 1.2. 一. Html5 ...

  7. PHP的安装配置

    一.安装 PHP的安装可以很简单的使用yum命令进行安装. #添加php7.0源(这是centos7的命令,centos6.5的命令不同,不要照搬)rpm -Uvh https://dl.fedora ...

  8. Python Numpy 矩阵级基本操作(2)

    1.开方与求e指数 import numpy as np from numpy.matlib import randn print "Test sqrt and exp" arr ...

  9. python学习笔记:文件操作和集合

    一.文件操作 文件读写步骤:有一个文件,打开文件,操作文件读写文件,关闭文件. python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例) 模式 可做操作 若文件不存在 是否覆盖 r ...

  10. WPF 依赖附加属性

    附加属性的本质是一个依赖属性,与普通的依赖属性区别: 1:注册方法名不一样,如 DependencyProperty.RegisterAttached 2:没有普通的属性包装器,而是通过get和set ...