<题面>

卡常终究比不上算法的优化……

这是莫队的有点小坑的题,

首先不一定能想到,想到不一定打对,打对不一定打好。


首先你会发现,这个题的时限是很长的~

$n$和$m$也是很大的。

于是我们可以计算一个时间复杂度,顺便搞一个块长。

首先有$\Theta (M)$的询问,设块长为$L$,

于是左端点移动,不跨块,移动不超过$L$

右端点移动$N$

然后就有左面的总共移动$M \times L $

右面的移动$\frac{N}{L}\times N$这里应该就是说,每次要挪一个 $N$,而左端点只挪$\frac{N}{L}$次。

(转移一会再算)

这样莫队总复杂度:$\Theta(M \times L + \frac{N^2}{L})$

所以当块长为$\sqrt{\frac{N^2}{M}}=\frac{N}{\sqrt{M}}$时复杂度是最优的(基本不等式)

然后我们想转移,他让我们求一个区间数的个数。

那么,我们就可以用个数据结构,来维护$[a,b]$中数的个数和去重后的数个数

仔细算下,$\log N$的时间复杂度还能承受。

所以选择树状数组或是线段树(常数有点大,用zkw好一些(但是用线段树的A的很困难~))

维护权值。

这样就可以通过用树状数组前缀和或是线段树区间查询解决转移问题。

总复杂度:$\Theta(N\sqrt{M}\log N)$

跑得还好说。

(有人说分块也行,大家加油咯!)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define N 101101
#define LL long long //#include "debug.h" using namespace std;
struct QUERY{
int l,r,a,b,t;
LL ans1,ans2;
}query[N*10];
int num[N];
int pre[N],n,qn,sqn;
int inpart[N];
int tot[N],pretot[N];
inline int lowbit (int x){ return x&(-x); }
inline int getpart(int x){ return (x-1)/sqn+1; }
LL sum (int x){
LL s=0;
for(int i=x;i;i-=lowbit(i)) s+=pre[i];
return s;
}
LL gettot (int x){
LL s=0;
for(int i=x;i;i-=lowbit(i)) s+=pretot[i];
return s;
}
void chatot (int pos,int x){
while(pos<=n){
pretot[pos]+=x;
pos+=lowbit(pos);
}
}
void change (int pos,int x){
if(tot[pos]==1&&x==-1)
chatot(pos,-1);
else if(tot[pos]==0&&x== 1)
chatot(pos,1);
tot[pos]+=x;
while(pos<=n){
pre[pos]+=x;
pos+=lowbit(pos);
}
}
//bool CMP (const QUERY &a,const QUERY &b){
// if(inpart[a.l]==inpart[b.r])
// return a.r<b.r;
// return a.l<a.l;
//}
bool CMP(const QUERY &x,const QUERY &y){
return inpart[x.l]<inpart[y.l]||(inpart[x.l]==inpart[y.l]&&(inpart[x.l]&1?x.r<y.r:x.r>y.r));
}
bool Cmp (const QUERY &a,const QUERY &b){
return a.t<b.t;
}
int main (){
int a,b,c,d;
scanf("%d%d",&n,&qn);sqn=sqrt(1ll*n*n/qn)+1;
for(int i=1;i<=n;i++){
scanf("%d",num+i);
inpart[i]=getpart(i);
}
for(int i=1;i<=qn;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
query[i].l=a,query[i].r=b,query[i].t=i;
query[i].a=c,query[i].b=d;
}
sort(query+1,query+qn+1,CMP);
//for(int i=1;i<=qn;i++)cout<<query[i].l<<" "<<query[i].r<<endl;
int l=1,r=1,ql,qr;
change(num[1],1);
for(int i=1;i<=qn;i++){//pour(tot,1,n,3,"Tot");
ql=query[i].l,qr=query[i].r,
a =query[i].a,b =query[i].b;
while(l<ql)change(num[l] ,-1),l++;
while(l>ql)change(num[l-1], 1),l--;
while(r<qr)change(num[r+1], 1),r++;
while(r>qr)change(num[r] ,-1),r--;
query[i].ans1=sum(b)-sum(a-1);
query[i].ans2=gettot(b)-gettot(a-1);
}
sort(query+1,query+qn+1,Cmp);
for(int i=1;i<=qn;i++)
printf("%lld %lld\n",query[i].ans1,query[i].ans2);
return 0;
}

作业-[luogu4396][AHOI2013]-莫队的更多相关文章

  1. 洛谷P4396 作业 [AHOI2013] 莫队

    正解:莫队 解题报告: 传送门! 天呐太久没做莫队了连板子都认不出来了,,,所以复健下做下莫队的题目QAQ 就很板子鸭,和莫队板子比好像只有一个离散化,,,?就不讲了QAQ 等下直接放代码QAQ ov ...

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

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

  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. 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块

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

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

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

  8. 【分块,莫队】【P4396】【AHOI2013】作业

    传送门 Description 此时己是凌晨两点,刚刚做了Codeforces的小A掏出了英语试卷.英语作业其实不算多,一个小时刚好可以做完.然后是一个小时可以做完的数学作业,接下来是分别都是一个小时 ...

  9. [AHOI2013]作业 & Gty的二逼妹子序列 莫队

    ---题面--- 题解: 题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队. 考虑区间[l, r]转移到[l, r + 1],那么对于维护 ...

随机推荐

  1. vue/cli 3.0脚手架搭建

    在vue 2.9.6中,搭建vue-cli脚手架的流程是这样的: 首先 全局安装vue-cli,在cmd中输入命令: npm install --global vue-cli  安装成功:  安装完成 ...

  2. Codeforces 548E Mike ans Foam (与质数相关的容斥多半会用到莫比乌斯函数)

    题面 链接:CF548E Description Mike is a bartender at Rico's bar. At Rico's, they put beer glasses in a sp ...

  3. Tomcat小技巧

    目录 1.项目路径忽略项目名 2.配置tomcat虚拟目录 3.显示目录文件列表 4.设置URL不区分大小写 1.项目路径忽略项目名 server.xml中修改Context标签中的path属性为/ ...

  4. 2016.11.5初中部上午NOIP普及组比赛总结

    2016.10.29初中部上午NOIP普及组 这次比赛算是考的最差的一次之一了,当中有四分之三是DP. 进度: 比赛:没分+0+没分+40=40 改题:AC+0+没分+40=140 TurnOffLi ...

  5. 如何玩转跨库Join?跨数据库实例查询应用实践

    背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...

  6. MyEclipse使用总结——将原有的MyEclipse中的项目转成maven项目[转]

    前面一篇文章中我们了解了 在myeclipse中新建Maven框架的web项目 那么如果我们原来有一些项目现在想转成maven项目应该怎么做呢 我收集到了三种思路: 一.新建一个maven项目,把原项 ...

  7. git difff

    Generate patch through git diff http://stackoverflow.com/questions/1191282/how-to-see-the-changes-be ...

  8. Android之相关术语

    Dalvik: Android特有的虚拟机,和JVM不同,Dalvik虚拟机非常适合在移动终端上使用! AVD: (android virtual machine):安卓虚拟设备,就是安卓的模拟器 A ...

  9. Plugin org.apache.maven.plugins:maven-clean-plugin:2.4.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.4.1

    Plugin org.apache.maven.plugins:maven-clean-plugin:2.4.1 or one of its dependencies could not be res ...

  10. FFmpeg工具

    [0]安装ffmpeg //Linux系统下安装sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next sudo apt-get update ...