zoukankan      html  css  js  c++  java
  • CCF 试题编号: 201909-4 试题名称: 推荐系统

    这题是stl的综合应用,map要想快,直接上unordered_map,这样查询接近O(1),是不是很嗨皮。
    思路其实还是很简单的,type+id做个Hash,由于set.insert的第一个返回值是指向该插入元素的迭代器,所以,对于每一个type+id我们都可以存下它对应的迭代器,这样删除不就很快了吗,省去查找。
    这题是我第一次用c++11的语法, 原谅我的low,嘻嘻,auto还挺好用。

    #include <bits/stdc++.h>
    using namespace std;
    
    const long long BASE=1e10;
    
    struct Pair {
        long long score,hash_val;
        Pair(long long s,long long h) {
            score=s;
            hash_val=h;
        }
        bool operator < (const Pair &b) const {
            if (score!=b.score) {
                return score>b.score;
            }
            long long id1=hash_val%BASE,id2=b.hash_val%BASE;
            long long type1=hash_val-id1,type2=b.hash_val-id2;
            if (type1!=type2) {
                return type1<type2;
            }
            return id1<id2;
        }
    };
    
    set<Pair> s;
    // set<pair<long long,long long> > del;
    //unordered_map<long long,long long>mp;
    unordered_map<long long,set<Pair>::iterator >mp;
    long long num[55],top[55],total,totaltop;
    vector<long long> ans[55];
    long long M,N;
    
    long long Hash(long long type,long long id)
    {
    	return type*BASE+id;
    }
    
    void select()
    {
        memset(num,0,sizeof(num));
        long long cnt=0;
    //    for (set<Pair>:: iterator it=s.begin();it!=s.end()&&cnt<total;it++) {
    //        long long id=it->hash_val%BASE,type=it->hash_val/BASE;
    //
    ////        printf("SELECT: 
    ");
    ////        printf("type: %I64d id: %I64d
    ",type,id);
    //        if (num[type]<top[type]) {
    //            cnt++;
    //            num[type]++;
    //            ans[type].push_back(id);
    ////            printf("IN:
    ");
    ////            printf("type: %I64d id: %I64d
    ",type,id);
    //        }
    //        else continue;
    //    }
    
        for (auto it:s) {
            long long id=it.hash_val%BASE,type=it.hash_val/BASE;
            if (num[type]<top[type]) {
                num[type]++;
                cnt++;
                ans[type].push_back(id);
            }
            if (cnt==total||cnt==totaltop) break;
        }
    //    printf("ANS:
    ");
    //    for (int i=0;i<M;i++) {
    //        for (int j=0;j<ans[i].size();j++) {
    //            printf("%I64d ",ans[i][j]);
    //        }
    //        puts("");
    //    }
    //    puts("");
    }
    
    void print() {
        for (set<Pair>::iterator it=s.begin();it!=s.end();it++) {
            printf("sc:%I64d type:%I64d id:%I64d
    ",it->score,it->hash_val/BASE,it->hash_val%BASE);
        }
        puts("");
    }
    
    int main()
    {
    //    long long hash_val=Hash(12,23);
    //    printf("%I64d %I64d
    ",hash_val%BASE,hash_val-hash_val%BASE);
    //
    //    s.insert(Pair(5,Hash(2,1)));
    //    s.insert(Pair(5,Hash(2,2)));
    //    s.insert(Pair(6,Hash(7,2)));
    //    mp[Hash(1,1)]=s.insert(Pair(5,Hash(1,1))).first;
    //    s.erase(mp[Hash(1,1)]);
    //    for (set<Pair>::iterator it=s.begin();it!=s.end();it++) {
    //        printf("%lld %lld %lld
    ",it->score,it->hash_val%BASE,it->hash_val-it->hash_val%BASE);
    //    }
        freopen("in.txt","r",stdin);
        long long sc,id,opnum,op,type,comm;
        scanf("%I64d%I64d",&M,&N);
        for (int i=0;i<N;i++) {
            scanf("%I64d%I64d",&id,&sc);
            for (int j=0;j<M;j++) {
                mp[Hash(j,id)]=s.insert(Pair(sc,Hash(j,id))).first;
            }
        }
    //    print();
        scanf("%I64d",&opnum);
        for (int i=0;i<opnum;i++) {
            scanf("%I64d",&op);
            if (op==1) {
                scanf("%I64d%I64d%I64d",&type,&comm,&sc);
                mp[Hash(type,comm)]=s.insert(Pair(sc,Hash(type,comm))).first;
    //            print();
            }
            else if (op==2) {
                scanf("%I64d%I64d",&type,&comm);
                s.erase(mp[Hash(type,comm)]);
    //            print();
            }
            else {
                scanf("%I64d",&total);
                totaltop=0;
                for (int j=0;j<M;j++) {
                    scanf("%I64d",&top[j]);
                    totaltop+=top[j];
                    ans[j].clear();
                }
    //            print();
                select();
                for (int j=0;j<M;j++) {
                    if (ans[j].size()==0) {
                        printf("-1
    ");
                    }
                    else {
                        int anssize=ans[j].size();
    //                    for (int k=0;k<anssize;k++){
    //                        printf("%I64d",ans[j][k]);
    //                        if (k==anssize-1) putchar('
    ');
    //                        else putchar(' ');
    //                    }
                        for (int i=0;i<anssize;i++) {
                            printf("%I64d",ans[j][i]);
                            if (i==anssize-1) {
                                putchar('
    ');
    
                            }
                            else {
                                putchar(' ');
                            }
                        }
                    }
                    ans[j].clear();
                }
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    Qt 资料大全
    Node.js+websocket+mongodb实现即时聊天室
    win系统下nodejs安装及环境配置
    nginx关于 error_page指令详解.md
    移动前端开发之viewport,devicePixelRatio的深入理解
    Iphone各个型号机型的详细参数,尺寸和dpr以及像素
    H5前端的关于像素解释
    从Pc转向H5开发遇到的适配问题思考
    Safari无痕模式下,storage被禁用问题
    滴滴开源 Vue 组件库— cube-ui
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12328857.html
Copyright © 2011-2022 走看看