首页 > 代码库 > AC日记——曼哈顿交易 洛谷 P3730

AC日记——曼哈顿交易 洛谷 P3730

曼哈顿交易

 

思路:

  都是套路;

 

代码:

#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define maxn 100005int n,m,bel[maxn],num[maxn],ai[maxn],size,block;int ans[maxn],num_[maxn],num__[maxn],cnt,bi[maxn];struct QueryType {    int l,r,k,id;        bool operator<(const QueryType &o)const{        if(bel[l]==bel[o.l]) return (bel[l]&1)?r>o.r:r<o.r;        return l<o.l;    }};struct QueryType qu[maxn];inline void in(int &now){    char Cget=getchar();now=0;    while(Cget>9||Cget<0) Cget=getchar();    while(Cget>=0&&Cget<=9)    {        now=now*10+Cget-0;        Cget=getchar();    }}inline void updata(int x){    if(num[x]) num_[num[x]]--,num__[bel[num[x]]]--;    else cnt++;    num_[++num[x]]++,num__[bel[num[x]]]++;}inline void updata_(int x){    num_[num[x]]--,num__[bel[num[x]--]]--;;    if(num[x]) num_[num[x]]++,num__[bel[num[x]]]++;    else cnt--;}inline int query(int k){    if(k>cnt) return -1;    int i=0;for(;k>num__[i];k-=num__[i++]);    int j=i*block;for(;k>num_[j];k-=num_[j++]);    return j;}int main(){    freopen("trade.in","r",stdin);    freopen("trade.out","w",stdout);    in(n),in(m),block=sqrt(n);    for(int i=1;i<=n;i++) in(ai[i]),bi[i]=ai[i],bel[i]=i/block;    sort(bi+1,bi+n+1),size=unique(bi+1,bi+n+1)-bi-1;    for(int i=1;i<=n;i++) ai[i]=lower_bound(bi+1,bi+size+1,ai[i])-bi;    for(int i=1;i<=m;i++) in(qu[i].l),in(qu[i].r),in(qu[i].k),qu[i].id=i;    int l=1,r=0;sort(qu+1,qu+m+1);    for(int no=1;no<=m;no++)    {        while(r<qu[no].r) updata(ai[++r]);        while(r>qu[no].r) updata_(ai[r--]);        while(l<qu[no].l) updata_(ai[l++]);        while(l>qu[no].l) updata(ai[--l]);        ans[qu[no].id]=query(qu[no].k);    }    for(int i=1;i<=m;i++) printf("%d\n",ans[i]);    return 0;}

 

AC日记——曼哈顿交易 洛谷 P3730