• HYSBZ-5016 一个简单的询问


    5016: [Snoi2017]一个简单的询问



    Description

     
    给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出
     
    get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次。

    Input

    第一行,一个数字N,表示序列长度。
    第二行,N个数字,表示a1~aN
    第三行,一个数字Q,表示询问个数。
    第4~Q+3行,每行四个数字l1,r1,l2,r2,表示询问。
    N,Q≤50000
    N1≤ai≤N
    1≤l1≤r1≤N
    1≤l2≤r2≤N
    注意:答案有可能超过int的最大值

    Output

    对于每组询问,输出一行一个数字,表示答案

    Sample Input

    5
    1 1 1 1 1
    2
    1 2 3 4
    1 1 4 4

    Sample Output

    4
    1

    代码

    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    #define MN 50000
    #define f(c)   for(int i=1;i<=c;i++)
    using namespace std;
    int in(){int f=1,x=0;char c=getchar();
       for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
       for(;'0'<=c&&c<='9';c=getchar())x=(x<<1)+(x<<3)+(c^48);return x*f;}
    struct Mo{int l,r,id,ad;}q[MN*4+5];
    int n,Be[MN+5],size,a[MN+5],num1[MN+5],num2[MN+5],m,tot=0,L=0,R=0;
    long long res=0,Ans[MN+5];
    bool cmp(Mo a,Mo b){return Be[a.l]==Be[b.l]?a.r<b.r:a.l<b.l;}
    int main(){n=in();size=sqrt(n);
        f(n)a[i]=in(),Be[i]=(i-1)/size+1;m=in();
        f(m){int l1=in(),r1=in(),l2=in(),r2=in();
            q[++tot]=(Mo){r1,r2,i,1};q[++tot]=(Mo){r1,l2-1,i,-1};
            q[++tot]=(Mo){l1-1,r2,i,-1};q[++tot]=(Mo){l1-1,l2-1,i,1};}
        sort(q+1,q+tot+1,cmp);
        f(tot){while(L<q[i].l)++L,res+=num2[a[L]],++num1[a[L]];
            while(L>q[i].l)res-=num2[a[L]],--num1[a[L]],--L;
            while(R<q[i].r)++R,res+=num1[a[R]],++num2[a[R]];
            while(R>q[i].r)res-=num1[a[R]],--num2[a[R]],--R;
        Ans[q[i].id]+=q[i].ad*res;}f(m)printf("%lld
    ",Ans[i]);return 0;
    }
  • 相关阅读:
    JS浅拷贝和深拷贝
    使用阿里云短信服务
    autojs相关的文档地址记录和简单使用
    Linux 根目录所在分区被脏数据占满
    openstack宿主机故障,虚拟实例恢复
    openstack创建vlan网络并配置网络设备
    联想 lenove 3750 M4服务器更改启动项和管理口IP
    ansible常用方法
    Mysql数据库-多实例主从复制-主从故障详解
    Linux 系统优化-workstation实践
  • 原文地址:https://www.cnblogs.com/muzu/p/7859964.html
Copyright © 2020-2023  润新知