• luogu P2709 小B的询问 最简单的莫队


    块内按右端点sort,块外按左端点sort

    话说我刚开始这么修改。。。

    inline void del(int i) {cnt-=(c[a[i]]*c[a[i]]),cnt+=(c[a[i]]-1)*(c[a[i]]-1),--c[a[i]];}
    inline void ins(int i) {cnt-=(c[a[i]]*c[a[i]]),cnt+=(c[a[i]]+1)*(c[a[i]]+1),++c[a[i]];}

    十分暴力?没事不影响复杂度。。

    后来看题解发现可以改成这样

    inline void del(int i) {--c[a[i]],cnt-=2*c[a[i]]+1;}
    inline void ins(int i) {++c[a[i]],cnt+=2*c[a[i]]-1;}

    十分简练?我数学太菜了。。。

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #define R register int
    using namespace std;
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    int n,m,k,T,l=1,r=0;
    long long cnt=0,ans[50010];
    int c[50010],a[50010];
    struct seg {
        int l,r,rk;
        bool operator <(const seg& y)const{return (l-1)/T==(y.l-1)/T?r<y.r:l<y.l;}
    }q[50010];
    inline void del(int i) {--c[a[i]],cnt-=2*c[a[i]]+1;}
    inline void ins(int i) {++c[a[i]],cnt+=2*c[a[i]]-1;}
    signed main() {
        n=g(),m=g(),k=g(); T=1.2*sqrt(n);
        for(R i=1;i<=n;++i) a[i]=g();
        for(R i=1;i<=m;++i) q[i].l=g(),q[i].r=g(),q[i].rk=i;
        sort(q+1,q+m+1);
        for(R i=1;i<=m;++i) {
            while(l<q[i].l) del(l++);
            while(l>q[i].l) ins(--l);
            while(r<q[i].r) ins(++r);
            while(r>q[i].r) del(r--);
            ans[q[i].rk]=cnt;
        } for(R i=1;i<=m;++i) printf("%lld
    ",ans[i]);
    }

    2019.04.12

  • 相关阅读:
    redis乐观锁
    redis
    解决创建Redis容器没有conf配置文件
    redis缓存配置
    Docker架构
    Flask获取数据的一些方法
    Nginx正向代理、反向代理与负载均衡
    Sanic
    Dockerfile详解
    Centos7上安装docker
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10693525.html
Copyright © 2020-2023  润新知