【BZOJ3809】Gty的二逼妹子序列 莫队 分块
题目描述
给你一个长度为\(n\)的数列,还有\(m\)个询问,对于每个询问\((l,r,a,b)\),输出区间\([l,r]\)有多少范围在\([a,b]\)的权值。
\(n\leq 100000,m\leq 1000000\)
题外话
Q:这道题和BZOJ3809有什么区别呢?
A:卡空间。
题解
考虑莫队。
每次转移时如果用树状数组很明显会TLE。所以要分块。
每\(\sqrt n\)个数分一块。这样转移是\(O(1)\)的,查询是\(O(\sqrt n)\)的。
时间复杂度:\(O(n\sqrt m+m\sqrt n)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<cmath>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void sort(int &a,int &b)
{
if(a>b)
swap(a,b);
}
void open(const char *s)
{
#ifdef DEBUG
char str[100];
sprintf(str,"%s.in",s);
freopen(str,"r",stdin);
sprintf(str,"%s.out",s);
freopen(str,"w",stdout);
#endif
}
int sz1,sz2;
//sz1=sqrt(n)
//sz2=n/sqrt(m)
int b1(int x)
{
return (x+sz1-1)/sz1;
}
int b2(int x)
{
return (x+sz2-1)/sz2;
}
namespace orzzjt
{
int a[100010];
int b[100010];
void change(int x,int v)
{
a[x]+=v;
b[b1(x)]+=v;
}
int query(int x,int y)
{
int s=0;
int i;
int bx=b1(x);
int by=b1(y);
if(bx==by)
{
for(i=x;i<=y;i++)
s+=a[i];
}
else
{
for(i=x;i<=bx*sz1;i++)
s+=a[i];
for(i=(by-1)*sz1+1;i<=y;i++)
s+=a[i];
for(i=bx+1;i<=by-1;i++)
s+=b[i];
}
return s;
}
}
struct ques
{
int l,r,a,b,id;
};
ques b[1000010];
int cmp(ques a,ques b)
{
if(b2(a.l)!=b2(b.l))
return b2(a.l)<b2(b.l);
return a.r<b.r;
}
int a[100010];
int ans[1000010];
int c[100010];
void add(int x)
{
c[x]++;
if(c[x]==1)
orzzjt::change(x,1);
}
void del(int x)
{
c[x]--;
if(!c[x])
orzzjt::change(x,-1);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
sz1=sqrt(n);
sz2=n/sqrt(m);
sz2=max(sz2,1);
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&b[i].l,&b[i].r,&b[i].a,&b[i].b);
b[i].id=i;
}
sort(b+1,b+m+1,cmp);
int l=1,r=0;
for(i=1;i<=m;i++)
{
while(r<b[i].r)
add(a[++r]);
while(l>b[i].l)
add(a[--l]);
while(r>b[i].r)
del(a[r--]);
while(l<b[i].l)
del(a[l++]);
ans[b[i].id]=orzzjt::query(b[i].a,b[i].b);
}
for(i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}
【BZOJ3809】Gty的二逼妹子序列 莫队 分块的更多相关文章
- [BZOJ3809]Gty的二逼妹子序列[莫队+分块]
题意 给出长度为 \(n\) 的序列,\(m\) 次询问,每次给出 \(l,r,a,b\) ,表示询问区间 \([l,r]\) 中,权值在 \([a,b]\) 范围的数的种类数. \(n\leq 10 ...
- Bzoj 3809: Gty的二逼妹子序列 莫队,分块
3809: Gty的二逼妹子序列 Time Limit: 35 Sec Memory Limit: 28 MBSubmit: 868 Solved: 234[Submit][Status][Dis ...
- bzoj 3809 Gty的二逼妹子序列 —— 莫队+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 据说一开始应该想到莫队+树状数组,然而我想的却是莫队+权值线段树... 如果用权值线段 ...
- bzoj 3809 Gty的二逼妹子序列——莫队+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 容易想到树状数组维护值域.但修改和查询都是 log 太慢. 考虑有 nsqrt(n) ...
- [AHOI2013]作业 & Gty的二逼妹子序列 莫队
---题面--- 题解: 题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队. 考虑区间[l, r]转移到[l, r + 1],那么对于维护 ...
- BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块
Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...
- [bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业
[bzoj3809]Gty的二逼妹子序列/[bzoj3236][Ahoi2013]作业 bzoj bzoj 题目大意:一个序列,m个询问在$[l,r]$区间的$[x,y]$范围内的数的个数/种类. ...
- [bzoj3809]Gty的二逼妹子序列_莫队_分块
Gty的二逼妹子序列 bzoj-3809 题目大意:给定一个n个正整数的序列,m次询问.每次询问一个区间$l_i$到$r_i$中,权值在$a_i$到$b_i$之间的数有多少个. 注释:$1\le n\ ...
- bzoj3809 Gty的二逼妹子序列 & bzoj3236 [Ahoi2013]作业 莫队+分块
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3809 https://lydsy.com/JudgeOnline/problem.php?id ...
随机推荐
- Python全栈开发之路 【第二篇】:Python基础之数据类型
本节内容 一.字符串 记住: 有序类型:列表,元组,字符串 ---> 都可迭代: 无序类型:字典,集合 ---> 不可迭代: 特性:不可修改 class str(object): &quo ...
- 16-使用Selenium模拟浏览器抓取淘宝商品美食信息
淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击.输入.下拉等,这样我们只需要关心操作而不需要关心后台发生了 ...
- 各种jar包
springframework下载地址:http://maven.springframework.org/release/org/springframework/spring/ commons开头的j ...
- InvalidDataAccessResourceUsageException:mysql保留字引发的血案
org.springframework.dao.InvalidDataAccessResourceUsageException: could NOT EXECUTE statement; SQL [n ...
- 抽象代数-p22商群
G/e={g{e}|g∈G}={{g}|g∈G}=G G/G={gG|g∈G}={G} (gG=G左乘g是G上的双射,它的逆映射是左乘g^-1) 所以 G/G 只有一个元素,所有G 就只能是 ...
- ModelAttribute用法之一
@ModelAttribute也可以做为Model输出到View时使用,比如: 测试例子 package com.my.controller; import java.util.ArrayList ...
- ios不触发事件也能播放音频
ios不触发事件也能播放音频. 首先界面初始化预加载一个没有声音的音频,代码如下: html: js: $(function(){ $("#start_audio")[0].pla ...
- [转帖]中关村:LED屏幕和OLED屏幕有什么区别?答案在这里
LED屏幕和OLED屏幕有什么区别?答案在这里 中关村在线 01-0810:40 目前的电视市场,更新换代的频率越来越快,无论是国产品牌还是合资品牌,都不约而同的推出了全新产品.这离不开人们对更好 ...
- 剑指offer(11)
题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 我们一先想到的应该是循环两次链表,第一次获得它的长度,然后用长度-k,得出目标节点在链表的第几位,再循环一次. 如果要求只用一次循环的话,我 ...
- String类内存空间详解
java.lang.String类内存问题详解 字符串理解的难点在于其在堆内存空间上的特殊性,字符串String对象在堆内存上有两种空间: 字符串池(String pool):特殊的堆内存,专门存放S ...