CodeForces 639 A.Bear and Displayed Friends(水~)

Description
一个人有n个朋友,他和第i个朋友的关系程度用t[i]表示,现在他和朋友们打游戏,最多可以和k个在线的朋友打游戏,如果在线朋友很多那就选择关系最好的k个,起初所有朋友都不在线,有两种操作:
1 x:朋友x上线
2 x:查询朋友x是否在和这个人打游戏
Input
第一行三个整数n,q,k表示朋友数,操作数和每次打游戏人数上限,之后n个不同的整数t[i]表示和第i个朋友的关系程度,之后q行每行一个操作,保证一个朋友不会上线两次(1<=n,q<=150000,1<=k<=min(6,n))
Output
对于每次查询,如果该朋友正在陪这个人打游戏则输出YES,否则输出NO
Sample Input
4 2 8
300 950 500 200
1 3
2 4
2 3
1 1
1 2
2 1
2 2
2 3
Sample Output
NO
YES
NO
YES
YES
Solution
维护一个长度为k的序列表示正在打游戏的人,每次有新的朋友上线则根据关系程度排个序选前k个,查询的时候也是暴力查,时间复杂度O(qk)
Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 150005
int n,k,m,v[maxn];
int a[7],res;
bool cmp(int a,int b)
{
    return v[a]<v[b];
}
int main()
{
    while(~scanf("%d%d%d",&n,&k,&m))
    {
        for(int i=1;i<=n;i++)scanf("%d",&v[i]);
        res=0;
        while(m--)
        {
            int type,x;
            scanf("%d%d",&type,&x);
            if(type==1)
            {
                if(res<k)a[++res]=x;
                else
                {
                    sort(a+1,a+res+1,cmp);
                    if(v[x]>v[a[1]])a[1]=x;
                }
            }
            else
            {
                int gg=0;
                for(int i=1;i<=res;i++)
                    if(a[i]==x)
                    {
                        gg=1;
                        break;
                    }
                printf("%s\n",gg?"YES":"NO");
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值