hdu5437Alisha’s Party set模拟

来源:互联网 发布:原生js实现的效果 编辑:程序博客网 时间:2024/06/05 20:14
//一个人邀请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 ;}

0 0
原创粉丝点击