[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)),这题就可以卡过去了。
对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[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; }
相关文章推荐
- 【bzoj3809】Gty的二逼妹子序列
- BZOJ 3809 Gty的二逼妹子序列 | 莫队 + 分块
- 【bzoj3809】【GTY的二逼妹子序列】【莫队+分块】
- BZOJ3809[Gty的二逼妹子序列]
- bzoj3809 Gty的二逼妹子序列
- bzoj 3809: Gty的二逼妹子序列
- [BZOJ3809]Gty的二逼妹子序列(莫队+分块)
- BZOJ 3809: Gty的二逼妹子序列 & 3236: [Ahoi2013]作业 [莫队]
- BZOJ 3809: Gty的二逼妹子序列(莫队+分块)
- BZOJ 3809: Gty的二逼妹子序列|莫队算法|分块
- BZOJ-3809 Gty的二逼妹子序列
- 【BZOJ 3809】Gty的二逼妹子序列 莫队+分块
- bzoj 3809: Gty的二逼妹子序列 分块+莫队算法
- 【莫队算法】【权值分块】bzoj3809 Gty的二逼妹子序列
- [bzoj3809]Gty的二逼妹子序列_莫队_分块
- Bzoj3809--Gty的二逼妹子序列
- 【BZOJ 3809】 3809: Gty的二逼妹子序列 (莫队+分块)
- 【bzoj3809】Gty的二逼妹子序列
- [bzoj3809]Gty的二逼妹子序列
- [BZOJ]3809 3809: Gty的二逼妹子序列 莫队+分块