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同学 ...
随机推荐
- QT blockingmaster例子学习
dialog.h: #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include "masterthread.h&q ...
- BZOJ 3585: mex(分块+莫队)
传送门 解题思路 首先直接莫队是能被卡的,时间复杂度不对.就考虑按照值域先进行分块再进行莫队,然后统计答案的时候就暴力扫所有的块,直到一个块内元素不满,再暴力扫这个块就行了,时间复杂度O(msqrt( ...
- 【Java架构:基础技术】一篇文章搞掂:Spring Boot
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文是对<Spring Boot 实战第4版>的总结,大家也可以去仔细研读该书 注意,书中使用的Spring Boot ...
- thinkcmf5 pc切换手机
1.在simplewind\cmf\common.php 里找到“获取当前主题名”添加 if(cmf_is_mobile()){ $theme = config('cmf_mobile_default ...
- centos 安装 Lamp(Linux + Apache + PHP) 并安装 phpmyadmin
来源:http://www.laozhe.net/302.html 一般情况下,安装的都是最新的正式版,除非你有特殊需求,要安装指定的版本,本文暂不讨论.从最基础的开始,一点点完成一个可用的 Linu ...
- DCloud-Video:Html5 Video 实现方案
ylbtech-DCloud-Video:Html5 Video 实现方案 1.返回顶部 1.1. http://ask.dcloud.net.cn/article/569 1.2. 一. Html5 ...
- PHP的安装配置
一.安装 PHP的安装可以很简单的使用yum命令进行安装. #添加php7.0源(这是centos7的命令,centos6.5的命令不同,不要照搬)rpm -Uvh https://dl.fedora ...
- Python Numpy 矩阵级基本操作(2)
1.开方与求e指数 import numpy as np from numpy.matlib import randn print "Test sqrt and exp" arr ...
- python学习笔记:文件操作和集合
一.文件操作 文件读写步骤:有一个文件,打开文件,操作文件读写文件,关闭文件. python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例) 模式 可做操作 若文件不存在 是否覆盖 r ...
- WPF 依赖附加属性
附加属性的本质是一个依赖属性,与普通的依赖属性区别: 1:注册方法名不一样,如 DependencyProperty.RegisterAttached 2:没有普通的属性包装器,而是通过get和set ...