BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)
解题思路
莫队+树状数组。把求\([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]作业(莫队+树状数组)的更多相关文章
- 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 ...
- COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...
- [AHOI2013]作业 莫队 树状数组
#include<cmath> #include<cstdio> #include<algorithm> #include<string> #inclu ...
- bzoj3236 作业 莫队+树状数组
莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ 3236 AHOI 2013 作业 莫队+树状数组
BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...
- BZOJ 3236: [Ahoi2013]作业( 莫队 + BIT )
莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ----------------------------------------------- ...
- Bzoj 3236: [Ahoi2013]作业 莫队,分块
3236: [Ahoi2013]作业 Time Limit: 100 Sec Memory Limit: 512 MBSubmit: 1113 Solved: 428[Submit][Status ...
- BZOJ 3236 莫队+树状数组
思路: 莫队+树状数组 (据说此题卡常数) yzy写了一天(偷笑) 复杂度有点儿爆炸 O(msqrt(n)logn) //By SiriusRen #include <cmath> #in ...
- bzoj 3289: Mato的文件管理 莫队+树状数组
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...
随机推荐
- <Jmeter入门不放弃>之<3.两种常见录制脚本的方法>
关于录制,我想表达的是,并不要以为他很低端,解决需求才是王道,大家这里参考学习的时候,我就不在这里配截图了,因为需要你打开工具根据文档自己去找,才有印象,大家一定要启动JMeter!跟着理解操作 录制 ...
- 探索Redis设计与实现8:连接底层与表面的数据结构robj
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 【Tomcat】1.Tomcat在Windows系统的安装和使用
1.下载与安装 安装Tomcat的[前提条件]是安装好JDK或者JRE(本文略过)Tomcat在Windows系统中可以通过[压缩包]或[安装包]来安装建议使用[安装包]来简化安装步骤登录官网http ...
- 修改Mysql数据库的字符集
1.先检查数据库的默认字符集是否是引起不能存储中文的原因: 登录数据库后执行下面的命令 mysql> show variables like 'character%'; 由上图可以看出,data ...
- find php.ini 和 php的执行目录 bin目录
有的时候一台新服务器,有些软件的目录和文件的位置我们不知道在哪里,我们可以用find来寻找 找php.ini find / -name php.ini 找php的执行目录 find / -name p ...
- QMUI android 框架 git下载项目运行报错解决 input String“”
1.编译源码,input String“” 解决办法: 打开qmuidemo里面的gradle文件,注释掉顶部的 //def cmd = 'git rev-list HEAD --count'//de ...
- angular 通过路由获取ID
constructor( private dataService: TestListsService, private route: ActivatedRoute, ) { // 通过路由获取ID c ...
- 什么是AngularJs?特点是什么?和JQuery什么区别和联系
什么是AngularJs? AngularJs是js框架,集中操作数据,不关注Dom操作,适用于以数据操作为主的的SPA(单页应用). 它的特点 采用MVC模型 双向数据绑定 依赖注入 模块化 与jQ ...
- MFC DLL 导出函数的定义方式
一直在鼓捣DLL,每天的工作都是调试一个一个的DLL,往DLL里面添加自己的代码,但是对于DLL一直不太了解啊!今天一查资料,才发现自己对于DLL编写的一些基本知识也不了解.要学习,这篇文章先总结DL ...
- HBase优化——读写优化
Hbase2.0查询优化 1)设置scan缓存 HBase中Scan查询可以设置缓存,方法是setCaching(),这样可以有效的减少服务端与客户端的交互,更有效的提升扫描查询的性能. Scan s ...