NC231684. 2021年CCPC中国大学生程序设计竞赛名额分配
描述
输入描述
第一行两个整数。表示2020年总决赛获奖队伍数量,全国网络预选赛队伍数量
下面行,每行包含两个字符串
,两个整数
,
下面行,每行包含两个字符串
,两个整数
保证中只出现小写英文字母以及 * 。保证
各不相同。
输出描述
输出所有已知学校(2021年总决赛拥有有效队伍的学校以及全国预选赛的所有学校) ,各自获得的名额数量,以字典序从小到大的顺序输出,每行形如 学校名: 所获名额数量,每个学校各占一行。
示例1
输入:
10 5 nanjingdaxue chuochuorangchuochuobie 9 1148 qinghuadaxue sangedinglia 11 1340 beijingdaxue nishizi 10 780 qinghuadaxue miaomiaomiaomiaomiaomiaomiao 10 1126 xianjiaotongdaxue chabuduodele 10 1211 nanjingyoudiandaxue Cirtrus 10 1361 zhejiangdaxue SolitaryDream 8 788 tengxun tengxundaibiaodui* 8 842 kuangshi kuangshidaibiaodui* 8 1251 changchunligongdaxue dlrowollehstup 3 324 qinghuadaxue chongqizhengtu 12 1036 qinghuadaxue heihei 12 1230 qinghuadaxue sangedingxiang 12 2030 beijingdaxue chongshengcaigou 11 1523 beijingligongdaxue ddlzhanshen 10 1623
输出:
beijingdaxue: 7 beijingligongdaxue: 4 changchunligongdaxue: 1 nanjingdaxue: 1 nanjingyoudiandaxue: 2 qinghuadaxue: 8 xianjiaotongdaxue: 2 zhejiangdaxue: 1
C++ 解法, 执行用时: 80ms, 内存消耗: 14208K, 提交时间: 2021-12-19 16:16:28
#include<bits/stdc++.h> using namespace std; #define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i) #define fi first #define se second #define pb emplace_back #define SZ(x) ((int)(x).size()) #define ALL(x) (x).begin(),(x).end() using ll=long long; using pa=pair<int,int>; template<class A,class B>inline bool upmx(A&x,const B&y){return x<y?x=y,1:0;} template<class A,class B>inline bool upmn(A&x,const B&y){return x>y?x=y,1:0;} const int mo=998244353; constexpr int Pow(int a,int b,int p=mo){int r=1;for(;b;b>>=1,a=1ll*a*a%p)if(b&1)r=1ll*r*a%p;return r;} constexpr int reduce(int x){return x+(x>>31&mo);} constexpr int& inc(int &x,int y){return x=reduce(x+y-mo);} constexpr int& dec(int &x,int y){return x=reduce(x-y);} #ifdef flukehn void debug_out(){cerr<<endl;} template <typename Head,typename... Tail> void debug_out(Head H,Tail... T){ cerr<<" "<<H;//to_string(H); debug_out(T...); } #define dbg(...) cerr<<"L"<<__LINE__<<" ["<<#__VA_ARGS__<<"]:",debug_out(__VA_ARGS__) #define debug(...) cerr<<__VA_ARGS__//fprintf(stderr, __VA_ARGS__) #else #define dbg(...) 0 #define debug(...) 0 #endif struct T{ string s,t; int u,v; bool operator<(const T&b)const{ if(u!=b.u)return u>b.u; return v<b.v; } }; istream& operator>>(istream &in,T &a){ in>>a.s>>a.t>>a.u>>a.v; return in; } map<string,int> f; T a[10111],b[10111]; int n,m; int main(){ #ifdef flukehn freopen("a.in","r",stdin); #endif ios::sync_with_stdio(0),cin.tie(0); cin>>n>>m; For(i,0,n)cin>>a[i]; For(i,0,m)cin>>b[i]; sort(a,a+n); sort(b,b+m); vector<string> w; //w.resize(unique(ALL(w))-w.begin()); w.clear(); set<string> S; int p=0; map<string,vector<T> >g; map<string,int> cl; For(i,0,m){ if(!g.count(b[i].s)){ if(p<10){ cl[b[i].s]=1; f[b[i].s]+=4; }else if(p<30){ cl[b[i].s]=2; f[b[i].s]+=3; }else if(p<60){ cl[b[i].s]=3; f[b[i].s]+=2; }else if(p<100){ cl[b[i].s]=4; f[b[i].s]+=1; } ++p; } g[b[i].s].pb(b[i]); } vector<T> q; for(auto [s, t]:g){ int c=cl[s]; if(c==1) { if(SZ(t)>=5) q.pb(t[4]); if(SZ(t)>=6) q.pb(t[5]); }else if(c==2){ if(SZ(t)>=4) q.pb(t[3]); if(SZ(t)>=5) q.pb(t[4]); }else if(c==3){ if(SZ(t)>=3) q.pb(t[2]); if(SZ(t)>=4) q.pb(t[3]); }else if(c==4){ if(SZ(t)>=2) q.pb(t[1]); if(SZ(t)>=3) q.pb(t[2]); }else{ if(SZ(t)>=1) q.pb(t[0]); if(SZ(t)>=2) q.pb(t[1]); } } sort(ALL(q)); For(i,0,min(180,SZ(q))) f[q[i].s]++; q.clear(); for(auto [s,t]:g){ if(!f.count(s)) q.pb(t[0]); } sort(ALL(q)); For(i,0,min(40,SZ(q))) f[q[i].s]++; For(i,0,m) if(!f.count(b[i].s)) f[b[i].s]=0; //for(auto [s,t]:f)cout<<s<<": "<<t<<"\n"; //dbg("----"); w.clear(); For(i,0,n)if(a[i].t.back()!='*'&&a[i].u)w.pb(a[i].s); int A=SZ(w); int J=(A*10+99)/100,Y=(A*30+99)/100,T=(A*60+99)/100; S.clear(); For(i,0,SZ(w)){ if(S.count(w[i]))continue; S.insert(w[i]); f[w[i]]+=1+(i<J)+(i<Y)+(i<T); } for(auto [s,t]:f)cout<<s<<": "<<t<<"\n"; }