The 2024 ICPC Asia East Continent Online Contest (I) 4/12 A/F/G/M
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;
}

浙公网安备 33010602011771号