您的位置:首页 > 其它

[bzoj 3809]Gty的二逼妹子序列

2018-03-03 09:33 337 查看
Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题。

对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数。 为了方便,我们规定妹子们的美丽度全都在[1,n]中。

给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=1000000)次询问“l,r,a,b”,每次输出sl…sr中,权值∈[a,b]的权值的种类数。

这道题啊,莫队加上树状数组的方法比较明显,但时间复杂度为O(n*sqrt(n)*log(n)),会超时。

于是我们就换一个思维,对妹子们的美丽度进行分块,这样一来,虽然询问变成了O(sqrt(n)),但修改变成了O(1),总时间复杂度缩小到O(n*sqrt(n)),这题就可以卡过去了。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
int l,r,id,s,sl,sr;
}q[1000010];
int n,m;
int a[100010],belong[100010],bl[100010],br[100010],num[100010],t[100010];
void fk()
{
int cnt=sqrt(n);
for(int i=1;i<=n;i++)
{
int bg=(i-1)/cnt+1;
belong[i]=bg;
if(bl[bg]==0)bl[bg]=i,br[bg-1]=i-1;
}
br[belong
]=n;
}
bool cmp1(node a,node b)
{
if(belong[a.l]==belong[b.l])
{
if(a.r>b.r)return false;
if(a.r<b.r)return true;
return 0;
}
if(belong[a.l]>belong[b.l])return false;
if(belong[a.l]<belong[b.l])return true;
return 0;
}
bool cmp2(node a,node b)
{
if(a.id>b.id)return false;
if(a.id<b.id)return true;
return 0;
}
void del(int x)
{
num[x]--;
if(num[x]==0)t[belong[x]]--;
}
void add(int x)
{
num[x]++;
if(num[x]==1)t[belong[x]]++;
}
int sle(int x,int y)
{
int sum=0;
int bx=belong[x],by=belong[y];
if(bx==by)
{
for(int i=x;i<=y;i++)
{
if(num[i]>0)sum++;
}
return sum;
}
for(int i=bx+1;i<=by-1;i++)sum+=t[i];
for(int i=x;i<=br[bx];i++)
{
if(num[i]>0)sum++;
}
for(int i=bl[by];i<=y;i++)
{
if(num[i]>0)sum++;
}
return sum;
}
void solve()
{
int l=1,r=0;
for(int i=1;i<=m;i++)
{
for(int j=q[i].r+1;j<=r;j++)del(a[j]);
for(int j=r+1;j<=q[i].r;j++)add(a[j]);
for(int j=l;j<=q[i].l-1;j++)del(a[j]);
for(int j=q[i].l;j<=l-1;j++)add(a[j]);
l=q[i].l,r=q[i].r;
q[i].s=sle(q[i].sl,q[i].sr);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&q[i].l,&q[i].r,&q[i].sl,&q[i].sr);q[i].id=i;
}
fk();
sort(q+1,q+m+1,cmp1);
solve();
sort(q+1,q+m+1,cmp2);
for(int i=1;i<=m;i++)printf("%d\n",q[i].s);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bzoj 莫队 分块