您的位置:首页 > 运维架构

VK Cup 2016 - Round 1 (Div. 2 Edition)-B - Bear and Displayed Friends-STL(维护前k大)

2016-03-29 13:07 465 查看
http://codeforces.com/contest/658/problem/B

题意 给n,k,q;

就是让你维护一个kmax的集合

q次操作

操作1 把 节点v加入kmax集合,

操作2 查询v是否在集合里

直接用multiset。就好了。。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;

const double pi=acos(-1.0);
double eps=0.000001;
__int64 min(__int64 a,__int64 b)
{return a<b?a:b;}
__int64 max(__int64 a,__int64 b)
{return a>b?a:b;}

struct node
{
int x,val;
node(){}
node(int a,int b){x=a,val=b;}
bool operator <(const node &b) const
{
return val<b.val;//最小值优先
}
bool operator ==(const node &b) const
{
return x==b.x;
}
};
multiset<node> q;
int n,k,qq;
int t[150005];

node tmp[8];
int main()
{ int i,j;

scanf("%d%d%d",&n,&k,&qq);
for (i=1;i<=n;i++)
scanf("%d",&t[i]);

int cur=0,x,y;
for (i=1;i<=qq;i++)
{
scanf("%d%d",&x,&y);
if (x==1)
{
if (cur<k)
{
q.insert(node(y,t[y]));
cur++;
}
else
{
q.insert(node(y,t[y]));
// printf("%d\n",q.begin()->x);
q.erase(q.begin());
}
}
else
{
int flag=0;
if (q.find(node(y,t[y]))!=q.end())
flag=1;

if (flag) printf("YES\n");
else
printf("NO\n");
}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: