zoukankan      html  css  js  c++  java
  • LUOGU P4113 [HEOI2012]采花

    传送门

    解题思路

    莫队题卡莫队。。。莫队只能拿到100分,满分200。正解主席树??发个莫队100分代码。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    
    using namespace std;
    const int MAXN = 2000005;
    
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    
    int n,m,c,col[MAXN],ans[MAXN];
    int bl[MAXN],siz,cnt[MAXN];
    
    struct Ask{
        int l,r,id;
    }q[MAXN];
    
    inline bool cmp(Ask A,Ask B){
        if(bl[A.l]==bl[B.l]) return A.r<B.r;
        return bl[A.l]<bl[B.l];
    }
    
    inline bool cmp_(Ask A,Ask B){
        return A.id<B.id;
    }
    
    int main(){
        n=rd(),c=rd(),m=rd();
        siz=sqrt(n)+1;
        for(register int i=1;i<=n;i++){
            col[i]=rd();
            bl[i]=(i-1)/siz+1;
        }
        for(register int i=1;i<=m;i++)
            q[i].l=rd(),q[i].r=rd(),q[i].id=i;
        sort(q+1,q+1+m,cmp);
        int L=1,R=0,now=0;
        for(register int i=1;i<=m;i++){
            while(L<q[i].l) {cnt[col[L]]--;now-=cnt[col[L]]==1;L++;}
            while(L>q[i].l) {L--;cnt[col[L]]++;now+=cnt[col[L]]==2;}
            while(R<q[i].r) {R++;cnt[col[R]]++;now+=cnt[col[R]]==2;}
            while(R>q[i].r) {cnt[col[R]]--;now-=cnt[col[R]]==1;R--;}
            ans[q[i].id]=now;
        }
        sort(q+1,q+1+m,cmp_);
        for(register int i=1;i<=m;i++) 
            printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    AVL树
    快速排序
    基数排序LSD_Radix_Sort
    归并排序
    JDBC连接池与工具类
    cookie的基础以及小案例
    javase基础4
    tomcat的request和response小案例
    javase基础3
    Servlet以及一个简单的登录案例
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9676850.html
Copyright © 2011-2022 走看看