M. Find the Easiest Problem
签到题,直接模拟即可
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;void solve(){int n;cin>>n;map<char,int> cnt;map<string,map<char,int>> isac;for(int i=1;i<=n;i++){string name;char id;string res;cin>>name>>id>>res;if(res=="rejected") continue;if(isac[name][id]) continue;isac[name][id]=1;cnt[id]++;}int mx=0;for(char ch='A';ch<='Z';ch++){mx=max(mx,cnt[ch]);}for(char ch='A';ch<='Z';ch++){if(cnt[ch]==mx){cout<<ch<<endl;return;}}
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int ct=1;cin>>ct;while(ct--){solve();}return 0;
}
A. World Cup
小组出线需要大于两人,淘汰赛第一轮获胜需要战胜六人,接下来每一轮需要战胜一个跟自己一样的对手
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;void solve(){vector<int> a(33);for(int i=1;i<=32;i++){cin>>a[i];}int t=a[1];sort(a.begin()+1,a.end());int pos=0;for(int i=1;i<=32;i++){if(a[i]==t) pos=i;}if(pos==32){cout<<1<<endl;}else if(pos>27){cout<<2<<endl;}else if(pos>13){cout<<4<<endl;}else if(pos>6){cout<<8<<endl;}else if(pos>2){cout<<16<<endl;}else{cout<<32<<endl;}
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int ct=1;cin>>ct;while(ct--){solve();}return 0;
}
F. Make Max
直接用单调栈即可,找到左右两侧所有比他小的数。
vp 时写了个代码很复杂的双向链表
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;void solve(){int n;cin>>n;vector<int> a(n+1),l(n+1),r(n+1);vector<pii> b(n+1);for(int i=1;i<=n;i++){cin>>a[i];b[i].first=a[i];b[i].second=i;}for(int i=1;i<n;i++){r[i]=i+1;}for(int i=2;i<=n;i++){l[i]=i-1;}sort(b.begin()+1,b.end());vector<int> cnt(n+1,1);vector<int> st(n+1);int ans=0;for(int i=1;i<=n;i++){auto [val,idx]=b[i];if(st[idx]) continue;while(1){//1. 两边有个一样的,先走过去if(l[idx]!=0 && a[l[idx]]==val){// if(idx==5) cout<<l[idx]<<endl;st[idx]=1;cnt[l[idx]]+=cnt[idx];idx=l[idx];r[idx]=r[r[idx]];l[r[idx]]=idx;continue;}if(r[idx]!=0 && a[r[idx]]==val){st[idx]=1;cnt[r[idx]]+=cnt[idx];idx=r[idx];l[idx]=l[l[idx]];r[l[idx]]=idx;continue;}//2. 两边只有一边有,且那个大于当前,可以走过去if(l[idx] && !r[idx] && a[l[idx]]>val){st[idx]=1;ans+=cnt[idx];val=a[l[idx]];cnt[l[idx]]+=cnt[idx];idx=l[idx];r[idx]=r[r[idx]];l[r[idx]]=idx;r[l[idx]]=idx;continue;}if(r[idx] && !l[idx] && a[r[idx]]>val){st[idx]=1;ans+=cnt[idx];val=a[r[idx]];cnt[r[idx]]+=cnt[idx];idx=r[idx];l[idx]=l[l[idx]];r[l[idx]]=idx;continue;}if(r[idx] && l[idx]){//两边都有,往小的那边走if(a[r[idx]]<=a[l[idx]] && a[r[idx]]>val){st[idx]=1;ans+=cnt[idx];val=a[r[idx]];cnt[r[idx]]+=cnt[idx];idx=r[idx];l[idx]=l[l[idx]];r[l[idx]]=idx;continue;}else if(a[l[idx]]<=a[r[idx]] && a[l[idx]]>val){bool f=0;if(idx==7) f=1;st[idx]=1;ans+=cnt[idx];// if(f){// cout<<l[idx]<<endl;// cout<<cnt[l[idx]]<<endl;// }val=a[l[idx]];cnt[l[idx]]+=cnt[idx];idx=l[idx];r[idx]=r[r[idx]];l[r[idx]]=idx;continue;}}break;}}cout<<ans<<endl;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int ct=1;cin>>ct;while(ct--){solve();}return 0;
}
G. The Median of the Median of the Median
二分中位数转化成一个确定性的问题,转化成 01 序列后用前缀和计算当前二分的值和中位数的大小关系
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;void solve(){int n;cin>>n;vector<int> a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}auto check=[&](int x)-> bool {//判断 x 是否大于等于中位数vector<int> s(n+1);for(int i=1;i<=n;i++){if(a[i]<=x) s[i]=1;else s[i]=-1;s[i]+=s[i-1];}vector<vector<int>> b(n+1,vector<int>(n+1));vector<vector<int>> sb(n+1,vector<int>(n+1));for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){if(s[j]-s[i-1]>=0) b[i][j]=1;else b[i][j]=-1;}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){sb[i][j]=sb[i-1][j]+sb[i][j-1]-sb[i-1][j-1]+b[i][j];}}int res=0;for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){if(sb[j][j]-sb[i-1][j]-sb[j][i-1]+sb[i-1][i-1]>=0){res++;}else{res--;}}}return res>=0;};int l=1,r=1e9;while(l<r){int mid=l+r>>1;//如果mid>=中位数if(check(mid)) r=mid;else l=mid+1;}cout<<r<<endl;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int ct=1;// cin>>ct;while(ct--){solve();}return 0;
}