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

124 篇文章 2 订阅
7 篇文章 0 订阅

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]]=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;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值