hdu5437Alisha’s Party set模拟

//一个人邀请n个人做客
//先开m次门, 第i次开门 ,
//是当第ti个人到了,放pi个人回来
//放的pi个人是在门外的人以礼物的价格排序
//如果礼物一样 , 先到的先进
//当所有人都到了后 , 开门将所有人放进来
//最后给出询问 
//问第qi次到达的是谁
//直接set模拟就行
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
using namespace std ;
const int maxn = 15e4+10 ;
struct node
{
    int v , id ;
    bool operator <(struct node tmp)const
    {
        if(v == tmp.v)
        return id < tmp.id ;
        return v > tmp.v  ;
    }
}p[maxn];
set<node> se ;
pair<int,int> op[maxn] ;
int ans[110] ;
char str[maxn][210] ;
struct Query
{
    int id ;
    int v ;
    bool operator <(struct Query tmp)const
    {
        if(v == tmp.v)
        return id < tmp.id ;
        return v < tmp.v ;
    }
}q[110] ;
int main()
{
   // freopen("in.txt" , "r" , stdin) ;
    int t ;
    scanf("%d" ,&t) ;
    while(t--)
    {
        se.clear() ;
        int n ; int m , Q ;
        scanf("%d%d%d" ,&n , &m , &Q) ;
        for(int i = 1;i <= n;i++)
        {
            scanf("%s%d" , str[i] , &p[i].v) ;
            p[i].id = i ;
        }
        for(int i = 1;i <= m;i++)
        {
            int a , b ;
            scanf("%d%d" , &a , &b) ;
            op[i] = make_pair(a , b) ;
        }
        op[m+1] = make_pair(n , n) ;
        sort(op+1 , op+1+m+1) ;
        for(int i = 1;i <= Q;i++)
        {
            scanf("%d" , &q[i].v) ;
            q[i].id = i ;
        }
        sort(q+1 , q+1+Q) ;
        set<node>::iterator it ;
        int pos = 1 ;
        int j = 1 ;
        int tmp = 1;
        for(int i = 1;i <= m+1;i++)
        {
            while(pos <= op[i].first && pos <= n)
            se.insert(p[pos++]) ;
            int x = op[i].second ;
            int y = se.size() ;
            x  = min(x ,y) ;
            while(q[j].v < min(pos,tmp+x) && j <= Q)
            {
                it = se.begin() ;
                int temp = q[j].v - tmp;
                while(temp--)
                it++ ;
                ans[q[j].id] = it->id ;
                j++ ;
            }
            if(j > Q)break ;
            tmp += x ;
            while(x--)
            se.erase(se.begin()) ;
        }
        for(int i = 1;i <= Q;i++)
        printf("%s%c" , str[ans[i]] , i == Q ?'\n' :' ') ;
    }
    return 0 ;
}




















你可能感兴趣的:(hdu5437Alisha’s Party set模拟)