首页 > 代码库 > HDU1899 Sum the K-th's

HDU1899 Sum the K-th's

题解:

动态求第k大数问题。

此题a[i]的值比较大。

如果直接用map的话TLE,所以需要hash

具体做法是将a[i]排序并且unique。然后将a[i]的值映射到i下。

注意在最后求和时要换回来即可

代码:

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<map>#include<set>using namespace std;using namespace std;#define pb push_back#define mp make_pair#define se second#define fs first#define ll long long#define CLR(x) memset(x,0,sizeof x)#define SZ(x) ((int)(x).size())#define FOR(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++)typedef pair<int,int> P;const double eps=1e-9;const int maxn=100010;const int N=1e9;const int mod=1e9+7;ll read(){    ll x=0,f=1;char ch=getchar();    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}    while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}    return x*f;}//-----------------------------------------------------------------------------int n,m,k,T,tot,b;int a[maxn],t[maxn],c[maxn];int lowbit(int x){return x&-x;}void add(int x,int v){    while(x<=tot){        c[x]+=v;        x+=lowbit(x);    }}int sum(int x){    int cnt=0;    while(x){        cnt+=c[x];        x-=lowbit(x);    }    return cnt;}int bs(){    int l=0,r=tot;    int goal=-1;    while(l<=r){        int m=(l+r)>>1;        if(sum(m)>=k){            goal=m;            r=m-1;        }        else l=m+1;    }    return t[goal];}int Bin(int v){    int l=1,r=tot;    while(l<=r){        int m=(l+r)>>1;        if(v==t[m]) return m;        if(v>t[m]) l=m+1;        else       r=m-1;    }}int main(){    T=read();    while(T--){        n=read();m=read();k=read();        for(int i=1;i<=n;i++){            a[i]=read();            t[i]=a[i];        }        sort(t+1,t+n+1);        tot=0;        for(int i=1;i<=n;i++){            if(i==1||t[i]!=t[i-1]){                t[++tot]=t[i];                c[tot]=0;            }        }        for(int i=1-m+n;i<=n;i++){            b=Bin(a[i]);            add(b,1);        }        for(int i=2;i<=1+m;i++){            b=Bin(a[i]);            add(b,1);        }        int ans=0;        ans+=bs();        ans%=mod;        int r,l;        for(int i=2;i<=n;i++){            b=Bin(a[i-1]);            add(b,1);            b=Bin(a[i]);            add(b,-1);            r=i+m;            if(r>n) r-=n;            b=Bin(a[r]);            add(b,1);            l=i-1-m;            if(l<=0) l+=n;            b=Bin(a[l]);            add(b,-1);            ans+=bs();            ans%=mod;        }        printf("%d\n",ans);    }    return 0;}

 

HDU1899 Sum the K-th's