题目传送门:洛谷P4396

题意简述:

给定一个长度为\(n\)的数列。有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不同的数的个数。

题解:

第一问可以用主席树维护,但是第二问呢?

考虑离线处理询问,用莫队算法。

问题转化为加入一个数,删除一个数,统计数值在一个区间中的数的个数。

离散化后可以用树状数组维护,但是复杂度多个log,变成了\(O(n\sqrt{n}\log n)\)。

考虑对数值也分块,先离散化,然后也是根号分块。修改时是$O(1)$的,查询是$O(\sqrt{n})$的。

那么考虑莫队的复杂度,有\(O(n\sqrt{n})\)次修改,但是只有$O(n)$次查询,那么总复杂度仍然是$O(n\sqrt{n})$。

 #include<bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i=(a);i<=(b);++i) int n,q,S,T,U;
int a[],b[],blk[];
struct D{int l,r,a,b,id;}Q[];
bool cmp(D i,D j){return blk[i.l]==blk[j.l]?i.r<j.r:blk[i.l]<blk[j.l];}
int cnt[],bel[],sum[],num[];
pair<int,int> Ans[]; void Ins(int p,int x){
if(!cnt[p]) ++num[bel[p]];
cnt[p]+=x, sum[bel[p]]+=x;
if(!cnt[p]) --num[bel[p]];
} pair<int,int> Qur(int a,int b){
if(a>b) return make_pair(,);
int S=,N=;
if(bel[a]==bel[b]) F(i,a,b) {if(cnt[i]) S+=cnt[i], ++N;}
else{
F(i,bel[a]+,bel[b]-) S+=sum[i], N+=num[i];
F(i,a,bel[a]*U) if(cnt[i]) S+=cnt[i], ++N;
F(i,bel[b]*U-U+,b) if(cnt[i]) S+=cnt[i], ++N;
}
return make_pair(S,N);
} int main(){
scanf("%d%d",&n,&q); S=sqrt(n)+0.5;
F(i,,n) blk[i]=(i-)/S+;
F(i,,n) scanf("%d",a+i), b[i]=a[i];
sort(b+,b+n+); T=unique(b+,b+n+)-b-;
U=sqrt(T)+0.5;
F(i,,T) bel[i]=(i-)/U+;
F(i,,n) a[i]=lower_bound(b+,b+T+,a[i])-b;
F(i,,q) scanf("%d%d%d%d",&Q[i].l,&Q[i].r,&Q[i].a,&Q[i].b), Q[i].id=i;
sort(Q+,Q+q+,cmp);
int L=,R=;
F(i,,q){
while(L>Q[i].l) --L, Ins(a[L],);
while(R<Q[i].r) ++R, Ins(a[R],);
while(L<Q[i].l) Ins(a[L],-), ++L;
while(R>Q[i].r) Ins(a[R],-), --R;
Ans[Q[i].id]=Qur(lower_bound(b+,b+T+,Q[i].a)-b,upper_bound(b+,b+T+,Q[i].b)-b-);
}
F(i,,q) printf("%d %d\n",Ans[i].first,Ans[i].second);
return ;
}

bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)的更多相关文章

  1. [AHOI2013]作业 (莫队+分块)

    [AHOI2013]作业 (莫队+分块) 题面 给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间[l,r],首先你要统计该区间内大于等于a,小于等于b的数的个数,其次是所有大于等于a,小 ...

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

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

  3. 洛谷 P4396 (离散化+莫队+树状数组)

    ### 洛谷P4396  题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...

  4. 洛谷 P4396 [AHOI2013]作业

    题目描述 题目传送门 分析 因为询问是关于区间的,并且没有强制在线,所以能用莫队解决 但是还要支持查询区间内大于等于 \(a\),小于等于 \(b\) 的数的个数和数值的个数 所以还要套一个数据结构 ...

  5. bzoj3809 Gty的二逼妹子序列 & bzoj3236 [Ahoi2013]作业 莫队+分块

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3809 https://lydsy.com/JudgeOnline/problem.php?id ...

  6. BZOJ3236:[AHOI2013]作业(莫队,分块)

    Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 ...

  7. 洛谷P4396 [AHOI2013]作业(树套树)

    题意 题目链接 Sol 为什么一堆分块呀..三维数点不应该是套路离线/可持久化+树套树么.. 亲测树状数组套权值线段树可过 复杂度\(O(nlog^2n)\),空间\(O(nlogn)\)(离线) # ...

  8. 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 ...

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

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

随机推荐

  1. SGU326_Perspective

    NBA打比赛.所有的比赛被分为多个团队.有的比赛是团内的,有的是与团外的队伍打的. 给出团内每个队伍已得分,以及总共有多少场比赛,还有团内所有队伍之间有多少场比赛? 问1队是否可能是分数最高的一个队伍 ...

  2. 【Java并发编程】之一:可重入内置锁

    每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁.线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁.获得内置锁的唯一途径就是进入由这个锁保护的同步代码块 ...

  3. Mininet 系列实验(五)

    实验内容 实现一个单个交换机的拓扑,添加一个交换机,和N个主机到网络中.交换机和主机之间的每个链路能够设置带宽.延迟时间.以及丢包率.创建一个包含一个交换机和四个主机的网络,使用iperf测试主机之间 ...

  4. Linux系统中/opt 和 /usr目录

    重点:usr是Unix Software Resource的缩写,即“UNIX操作系统软件资源”所放置的目录. 下面是个人找到的适合类似我这种从Windows转向Linux小白的文章. Ref:htt ...

  5. 【Learning】插头DP

    简介 插头DP(轮廓线DP)是用来解决网格图回路问题的一种算法. 插头DP解决的经典问题就是统计经过所有格子的哈密顿回路条数,某些格子有障碍. ​ 如果问题稍微进阶一点的话,不一定要求路径是回路.路径 ...

  6. Java考试题之五

    QUESTION 102 Given: 23. Object [] myObjects = { 24. new Integer(12), 25. new String("foo") ...

  7. 【agc019F】Yes or No

    Portal -->agc019F Description 给你\(n+m\)个询问,其中\(n\)个的答案是\(Yes\),\(m\)个的答案是\(No\),现在依次回答这些询问,每回答一个询 ...

  8. Access to a protected network share using Win32 C++

    WNetAddConnection2 DWORD WNetAddConnection2A( LPNETRESOURCEA lpNetResource, LPCSTR lpPassword, LPCST ...

  9. [转]Multivariate Time Series Forecasting with LSTMs in Keras

    1. Air Pollution Forecasting In this tutorial, we are going to use the Air Quality dataset. This is ...

  10. chrome神插件之:SwitchyOmega的安装设置

    转至:http://yiweifen.com/v-1-118586.html 前言 往常找某草的网站基本上是这样的:先FQ,然后谷歌找1024,出现很多某草的更新地址,大多都是广告,大约需要花十几分钟 ...