训练了一波读脑残题
训练了一波后台数据出错还没得骂的心态,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(); } } }