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同学 ...
随机推荐
- 洛谷P1364 医院设置(Floyd)
题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为l.如上 ...
- eclipse开发安卓 发短信打电话发送邮件功能
1.在mainfiest中添加 //添加拨打电话的功能 <uses-permission android:name="android.permission.CALL_PHON ...
- 送礼物(二分加双向DFS)
题目链接 题意:给你n个礼物重量,给你一个M力量,看你一次性搬动不超过M的礼物重量. 思路:看似背包,但M太大.所以要用DFS,但n也有45,所以考虑双向DFS先搜前半部分满足情况的所有重量,然后去重 ...
- nginx查看变量值
nginx查看变量值 location / { echo $host; #域名 echo $remote_addr; echo $remote_user; echo $time_local; echo ...
- css 导航菜单+下拉菜单
一.导航菜单 1.横向导航 代码如下: <!doctype html> <html> <head> <meta charset="utf-8&quo ...
- AndroidManifest.xml配置文件详解(转)
转载博客:http://blog.csdn.net/shagoo/article/details/7485958# AndroidManifest.xml配置文件对于Android应用开发来说是非常重 ...
- js 对象浅拷贝和深拷贝
var model={name:"boy",age:13}; var CopyModel=model; console.log(CopyModel.name); model.nam ...
- 分布式调度框架TBSchedule使用方法
一.TBSchedule简介 TBSchedule是来自淘宝的分布式调度开源框架,基于Zookeeper纯Java实现,其目的是让一种批量任务或者不断变化的任务,能够被动态的分配到多个主机的JVM中的 ...
- Webx.0-Web4.0:Web4.0
ylbtech-Webx.0-Web4.0:Web4.0 Web系统是人类迄今最伟大的发明之一,也是计算机影响人类最深远的表现. 1.返回顶部 1. Web系统是人类迄今最伟大的发明之一,也是计算机影 ...
- MVC路由解析---MapRoute
文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 引言 前面我们讲了IgnoreRout ...