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;
}