CCF认证201909-4 推荐系统

训练了一波读脑残题

训练了一波后台数据出错还没得骂的心态,or蜜汁 题意?

复习了一波STL用法,练了一波手速,

题解:码农大模拟,end。。

#include<bits/stdc++.h>
#define fi first
#define se second
#define io std::ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n){ll r=1%P;for (a%=P; n; a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
struct cmpp{   //重载set运算符 ,让set从begin开始最大
    bool operator()(const pii& a, const pii& b){
        if(a.fi==b.fi)
            return a.se<b.se;
        return a.fi>b.fi ;
    }
};
unordered_map<int,int> mp[51];
set<pii,cmpp> se[51];
struct node
{
    int t;
    int id;
    int s;
    node(){}
    node(int x,int y,int z)
    {
      t=x;
      id=y;
      s=z;
    }
};
bool cmp(node a,node b)
{   if(a.s==b.s)
     {
       if(a.t==b.t)
        return a.id<b.id;
       return a.t<b.t;
     }
    return a.s>b.s;
}
vector<node> ans;
vector<int> anss[51];
int main()
{
    io;
    int m,n;
    cin>>m>>n;
    for(int i=1;i<=n;i++)
    {
       int id;int s;
       cin>>id>>s;
       for(int i=1;i<=m;i++)
       {
           mp[i][id]=s;
           se[i].insert(make_pair(s,id));
       }
    }
    int q;
    cin>>q;
    while(q--)
    {
        int op;
        cin>>op;
        if(op==1)
        {    int t,id,s;
            cin>>t>>id>>s;
            t++;
            mp[t][id]=s;
            se[t].insert(make_pair(s,id));
        }
        if(op==2)
        {   int t,id;
            cin>>t>>id;
            t++;
            int s=mp[t][id];
            mp[t][id]=0;
            se[t].erase(se[t].find(make_pair(s,id)));
        }
        if(op==3)
        {
            int k;
            cin>>k;
            for(int i=1;i<=m;i++)
            {   int x;
                cin>>x;
                int cnt=0;
                for(auto v:se[i])
                {
                   if(cnt==x||cnt==k)break;
                   ans.push_back(node(i,v.se,v.fi));
                   cnt++;
                }
            }
            sort(ans.begin(),ans.end(),cmp);
            int cnt=0;
            for(auto v:ans)
            {
                if(cnt==k)
                break;
                int id=v.id;
                int t=v.t;
                anss[t].push_back(id);
                cnt++;
            }
            /*for(int i=1;i<=m;i++)   //其实把这行注释带上才是正解,但是这题脑残,我也不知道题意没读懂还是后台数据错了,
            {
                sort(anss[i].begin(),anss[i].end());
            }*/
            for(int i=1;i<=m;i++)
            {
                if(anss[i].size()==0)
                    cout<<-1<<endl;
                else
                {
                    for(int x: anss[i])
                    {
                        cout<<x<<' ';
                    }
                    cout<<endl;
                }
                anss[i].clear();
            }
            ans.clear();
        }
    }
}
原文地址:https://www.cnblogs.com/acmLLF/p/13654240.html