(hdu 5437)

1.Alisha’s Party

   优先队列模拟,共k个人,每个人有一个价值,m次进入,每次价值最大的进去,价值相同id小的先进去,a b前a个没进去的人进去b个,不够b个,都进去,m次操作后,剩下的都进去,最后输出查询的第i个进去的人的名字

  需要注意的是,m是乱序给的,需要按照a进行排序

  

#include<bits/stdc++.h>
using namespace std;
const int maxn=150005;
char name[maxn][205];
typedef pair<int,int> dl;
dl pt[maxn],px[maxn];
int ans[maxn],T[maxn],k,m,Q,u,v;

struct node{
    int id,val;
    node(int a=0,int b=0):id(a),val(b){}
    bool operator < (const node& x)const{
        if(x.val==val)
          return x.id<id;
        return x.val>val;
    }
};

void input(){
    scanf("%d%d%d",&k,&m,&Q);
    for(int i=1;i<=k;i++){
        scanf("%s%d",name[i],&u);
        pt[i]=make_pair(i,u);
    }
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        px[i]=make_pair(u,v);
    }
    for(int i=0;i<Q;i++)
      scanf("%d",T+i);
    sort(px+1,px+1+m);
}
priority_queue<node> q;

void solve(){
    while(!q.empty())q.pop();
    int cnt1=0,cnt2=0;
    for(int i=1;i<=m;i++){
        while(cnt1<px[i].first){
            cnt1++;
            q.push(node(pt[cnt1].first,pt[cnt1].second));
        }
        int w=cnt2+px[i].second;
        while(cnt2<w&&!q.empty()){
            ++cnt2;
            node tmp=q.top();q.pop();
            ans[cnt2]=tmp.id;
        }
    }
    for(int i=cnt1+1;i<=k;i++)
      q.push(node(pt[i].first,pt[i].second));
    while(!q.empty()){
        ++cnt2;
        node tmp=q.top();q.pop();
        ans[cnt2]=tmp.id;
    }
    bool ok=0;
    for(int i=0;i<Q;i++){
        if(ok)putchar(' ');
        else ok=1;
        printf("%s",name[ans[T[i]]]);
    }
    puts("");
}

int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        input();
        solve();
    }
    return 0;
}

 

posted @ 2016-08-01 10:23  N维解析几何  阅读(169)  评论(0编辑  收藏  举报