The 9th Hebei Collegiate Programming Contest

题目链接: https://codeforces.com/gym/105909

榜单链接:https://board.xcpcio.com/provincial-contest%2F2025%2Fhebei?group=official

1. H签到题

#include <bits/stdc++.h>
using namespace std;
int main(){
    string s; cin>>s; int n=s.size();
    if(s.substr(n-12,n)=="isallyouneed"){
        cout<<"Yes"<<endl;
        cout<<s.substr(0,n-12)<<endl;
    }else{
        cout<<"No"<<endl;
    }
    return 0;
}

2.  Problem K. UNO!

 用数组去模拟链表

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m;
    cin>>n>>m;
    vector<int> a(n);
    for (int i=0;i<n;i++) cin>>a[i];
    string s;
    cin >> s;
    vector<int> pre(n),nxt(n);
    for(int i=0;i<n;i++){
        nxt[i]=(i+1)%n;
        pre[i]=(i-1+n)%n;
    }
    vector<bool> alive(n,true);
    int dir=1,pos=0;
    for(int i=0;i<m;i++){
        int cur=pos; char ch=s[i];
        auto x=[&](int num){
            return nxt[num];
        };
        auto y=[&](int num){
            return pre[num];
        };
        int nxt_pos=-1;
        if(ch=='R'){
            dir*=-1;
            if(dir==1){
                nxt_pos=x(cur);
            }else{
                nxt_pos=y(cur);
            }
        }else if(ch=='S'){
            if(dir==1){
                int f=x(cur);
                nxt_pos=x(f);
            }else{
                int f=y(cur);
                nxt_pos=y(f);
            }
        }else if(ch=='D'){
            int v;
            if (dir==1){
                v=x(cur);
            }else{
                v=y(cur);
            }
            a[v]+=2;
            if(dir==1){
                int s=x(v);
                nxt_pos=s;
            } else {
                int s=y(v);
                nxt_pos=s;
            }
        }else{
            if(dir==1){
                nxt_pos=x(cur);
            }else {
                nxt_pos=y(cur);
            }
        }       
        a[cur]--;
        if(a[cur]==0) {
            alive[cur]=false;
            int l=pre[cur];
            int r=nxt[cur];
            nxt[l]=r;
            pre[r]=l;
        }
        pos=nxt_pos;
    }
    for (int x : a) cout << x << endl;
    return 0;
}

Problem M. 第九届河北省大学生程序设计竞赛

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m;
    cin>>n>>m;      //题数/队数
    vector<bitset<18>> a(m);   //各队
    for(int i=0;i<m;i++){
        string s; cin>>s;
        for(int j=0;j<n;j++){
            a[i][j]=(s[j]=='1');
        }
    }
    int rk_p,rk_q,rk_r;  //排名
    cin>>rk_p>>rk_q>>rk_r;   //过题数
    int score_p,score_q,score_r;
    cin>>score_p>>score_q>>score_r;
    for(int k=0;k<(1<<n);k++){
        int bits=__builtin_popcount(k);
        if(bits<10||bits>13) continue;
        vector<int> scores;
        for(int i=0;i<m;i++){
            int cnt=0;
            for(int j=0;j<n;j++){
                if((k>>j&1)&&a[i][j]){
                    cnt++;
                }
            }
            scores.push_back(cnt);
        }
        sort(scores.begin(),scores.end(),greater<int>());
        if(scores[rk_p-1]==score_p&&scores[rk_q-1]==score_q&&scores[rk_r-1]==score_r){
            vector<int> res;
            for(int j=0;j<n;j++){
                if(k>>j&1) res.push_back(j+1);
            }
            cout<<res.size()<<endl;
            for(int& x: res) cout<<x<<" ";
            cout<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
    return 0;
}

注:完成三题后你已经能稳铜奖了

Problem J. Generate 01 String 

#include <bits/stdc++.h>
using namespace std;
int main() {
    string s;
    cin >> s;
    stack<char> st;
    int cnt_1 = count(s.begin(), s.end(), '1');
    int cnt_0 = count(s.begin(), s.end(), '0');
    if (cnt_1 != cnt_0) {
        cout << -1 << endl;
        return 0;
    }
    cout << cnt_1 << endl;
    int i = 0;
    int pos = 1;
    while (i < s.size()) {
        char c = s[i];
        if (st.empty() || st.top() == c) {
            st.push(c);
            cout << pos << " " << c - '0' + 1 << endl;
        }else{
            st.pop();
            pos++;
        }
        i++;
    }
    return 0;
}

注:完成四题后是稳银奖了 

Problem D. 金麦园 

不太会

#include<bits/stdc++.h>
using ll=long long;
using namespace std;
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    ll n,k; std::cin>>n>>k;
    std::vector<ll> a(n);
    for(int i=0;i<n;i++) std::cin>>a[i];
    std::sort(a.begin(),a.end());
    std::vector<ll> b,freq;
    ll cur_num=a[0];
    int cnt=1;
    for(int i=1;i<n;i++){
        if(a[i]==cur_num){
            cnt++;
        }else{
            b.push_back(cur_num); freq.push_back(cnt);
            cur_num=a[i];
            cnt=1;
        }
    }
    b.push_back(cur_num); freq.push_back(cnt);
    std::vector<ll> c(b.size()),d(b.size());
    for(int i=0;i<b.size();i++){
        if(i==0){
            c[i]=freq[i];
            d[i]=b[i]*freq[i];
        }else{
            c[i]=c[i-1]+freq[i];
            d[i]=d[i-1]+b[i]*freq[i];
        }
    }

    auto solve = [&](ll d) -> ll {
        ll res = 0;
        ll cur = 0;
        for(int i=0;i<b.size();i++){
            ll ck = b[i] + d;
            while(cur+1<b.size() && b[cur+1]<=ck) cur++;
            
            res += freq[i]*(freq[i]-1)/2 + freq[i]*(c[cur]-c[i]);
            if(res >= k) return res;
        }
        return res;
    };

    ll left=0, right=b.back()-b[0];
    while(left<right){
        ll mid=left+(right-left)/2;
        if(solve(mid)>=k){
            right=mid;
        }else{
            left=mid+1;
        }
    }

    ll res=0, cur=0;
    for(int i=0;i<b.size();i++){
        ll ck=b[i]+left-1;
        while(cur+1<b.size() && b[cur+1]<=ck) cur++;
        
        if(i==0){
            res += freq[i]*d[cur] - freq[i]*b[i]*c[cur];
        }else{
            res += freq[i]*(d[cur]-d[i-1]) - freq[i]*b[i]*(c[cur]-c[i-1]);
        }
    }
    res += (k-solve(left-1))*left;
    std::cout<<res<<std::endl;
    return 0;
}

Problem A. 棋盘

#include <bits/stdc++.h>
using namespace std;
int main() {
    int T;
    cin>>T;
    while(T--){
        int n; cin>>n;
        vector<vector<long long>> g(3,vector<long long>(n+1));
        for(int r=1;r<3;r++){
            for(int c=1;c<=n;c++){
                cin>>g[r][c];
            }
        }
        vector<vector<long long>> prefix(3,vector<long long>(n+1,0));
        for(int r=1;r<=2;r++){
            for(int c=1;c<=n;c++){
                prefix[r][c]=prefix[r][c-1]+g[r][c];
            }
        }
        int p=n/2,q=p+1; 
        auto solve=[&](long long x,long long y)->long long{
            if(x>y) return 0;
            return prefix[1][y]+prefix[2][y]-(prefix[1][x-1]+prefix[2][x-1]);  
        };
        // long long left_sum=prefix[0][n/2]+prefix[1][n/2];
        // long long right_sum=(prefix[0][n]-prefix[0][n/2])+(prefix[1][n]-prefix[1][n/2]);
        // if(left_sum>right_sum) cout<<"Mandy"<<endl;
        // else if(left_sum<right_sum) cout<<"brz"<<endl;
        // else{
        //     int sum1=prefix[0][n]; int sum2=prefix[1][n];
        //     if(sum1>sum2) cout<<"Mandy"<<endl;
        //     else if(sum1<sum2) cout<<"brz"<<endl;
        //     else cout<<"draw"<<endl;
        // }
        if(solve(1,p)>solve(q,n)) cout<<"Mandy"<<endl;
        else if(solve(1,p+1)<solve(q+1,n)) cout<<"brz"<<endl;
        else if(prefix[1][n]<prefix[2][n]&&solve(1,p)==solve(q,n)) cout<<"draw"<<endl;
        else if(prefix[1][n]>prefix[2][n]&&solve(1,p + 1)==solve(q+1,n)) cout<<"draw"<<endl;
        else if(prefix[1][n]>prefix[2][n]) cout<<"Mandy"<<endl;
        else if(prefix[1][n]<prefix[2][n]) cout<<"brz"<<endl;
        else if(prefix[1][n]==prefix[2][n]) cout<<"draw"<<endl;
    }
    return 0;
}
//两行n列

银首

Problem F. 不死国的生命树 

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
const int LOGN = 20; 
int n, q;
int aVal[MAXN];
int parentArr[MAXN];
vector<int> children[MAXN];
int depthArr[MAXN];
int nxt1[MAXN];
int succ[LOGN+1][MAXN];
int savedPrev[MAXN];
int lastPos[MAXN];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> aVal[i];
    }
    parentArr[1] = 0;
    for (int i = 2; i <= n; i++) {
        int p;
        cin >> p;
        parentArr[i] = p;
        children[p].push_back(i);
    }
    {
        queue<int> que;
        depthArr[1] = 1;
        que.push(1);
        while (!que.empty()) {
            int u = que.front(); que.pop();
            for (int v : children[u]) {
                depthArr[v] = depthArr[u] + 1;
                que.push(v);
            }
        }
    }
    for (int v = 0; v <= n + 2; v++) {
        lastPos[v] = 0;
    }
    vector<pair<int,int>> stk;
    nxt1[1] = 0;
    savedPrev[1] = lastPos[ aVal[1] ];
    lastPos[ aVal[1] ] = 1;
    stk.emplace_back(1, 0);
    while (!stk.empty()) {
        auto &top = stk.back();
        int cur = top.first;
        int &idx = top.second;
        if (idx < (int)children[cur].size()) {
            int v = children[cur][idx++];
            int wantVal = aVal[v] + 1;
            if (wantVal <= n + 1) nxt1[v] = lastPos[wantVal];
            else nxt1[v] = 0;
            savedPrev[v] = lastPos[ aVal[v] ];
            lastPos[ aVal[v] ] = v;
            stk.emplace_back(v, 0);
        } else {
            lastPos[ aVal[cur] ] = savedPrev[cur];
            stk.pop_back();
        }
    }
    for (int i = 1; i <= n; i++) {
        succ[0][i] = nxt1[i];
    }
    for (int k = 1; k <= LOGN; k++) {
        for (int i = 1; i <= n; i++) {
            int mid = succ[k-1][i];
            succ[k][i] = (mid == 0 ? 0 : succ[k-1][mid]);
        }
    }
    cin >> q;
    while (q--) {
        int s, t;
        cin >> s >> t;
        int minDepth = depthArr[t];
        int current = s;
        int ans = 1;
        for (int k = LOGN; k >= 0; k--) {
            int nx = succ[k][current];
            if (nx != 0 && depthArr[nx] >= minDepth) {
                current = nx;
                ans += (1 << k);
            }
        }
        cout << ans << endl;
    }
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值