zoukankan      html  css  js  c++  java
  • Codeforces 658B Bear and Displayed Friends【set】

    题目链接:

    http://codeforces.com/contest/658/problem/B

    题意:

    给定元素编号及亲密度,每次插入一个元素,并按亲密度从大到小排序。给定若干操作,回答每次询问的元素是否排在前k个。

    分析:

    先附上我的垃圾做法:
    之前没怎么用过set,比赛的时候第一反应就是利用优先级队列,每次将元素直接插入队列中,由于k最大为6,所以遍历队列的前k个,然后看是否有查询的元素。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int maxn = 1500005;
    int t[maxn];
    vector<int>v;
    int main (void)
    {
        int n, k ,q;
        scanf("%d%d%d", &n, &k, &q);
        for(int i = 1; i <= n; i++){
             scanf("%d", &t[i]);
        }
        int num, a;
        priority_queue<int, vector<int>, less<int> >que;
        for(int i = 0; i < q; i++){
            scanf("%d%d", &num, &a);
            if(num == 1){
                que.push(t[a]);
            }else{
                int flag =  0, cnt = 0;
                while(cnt < k && !que.empty() ){
                    int tmp = que.top();
                    if(tmp == t[a]){
                       printf("YES
    ");
                        flag = 1;
                        break;
                    }
                    que.pop();
                    cnt++;
                    v.push_back(tmp);
                }
                for(int i = 0 ; i < v.size(); i++)
                        que.push(v[i]);
                v.clear();
                if(!flag) printf("NO
    ");
            }
        }

    其实用set可以非常快的解决:

    #include <cstdio>
    #include<iostream>
    #include<set>
    using namespace std;
    set<int>s;
    const int maxn = 150005;
    int t[maxn];
    
    int main (void)
    {
      int n, k, q; cin>>n>>k>>q;
      for(int i = 1; i <= n; i++){
            cin>>t[i];
       }
      int type, a;
      for(int i = 0; i < q; i++){
        cin>>type>>a;
        if(type == 1){
            s.insert(t[a]);
            if(s.size() > k) s.erase(s.begin());
        }else{
            if(!s.count(t[a])) cout<<"NO"<<endl;
            else cout<<"YES"<<endl;
        }
      }
      return 0;
    }
    
  • 相关阅读:
    c语言 判断文件是否存在
    lua 二进制函数使用
    linux sort 多列正排序,倒排序
    free命令学习 输出理解
    nginx 配置实现逻辑预算
    nginx 使用ctx实现数据共享,修改上下文
    lua中的数学库
    tornado文件上传实例
    ajax技术初识与应用
    web框架--XSS攻击和CSRF请求伪造
  • 原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758693.html
Copyright © 2011-2022 走看看