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;
}
posted @ 2025-09-19 08:50  LYET  阅读(14)  评论(0)    收藏  举报