资讯详情

The 19th Zhejiang Provincial Collegiate Programming Contest VP记录+补题

A B C D E F G H I J K L M
AC AC AC WA/补题 AC AC AC/待补 AC AC

A.JB Loves Math

题目分析

现在有两个数字 a a a和 b b b,你选择一个奇数 x x x和偶数 y y y,每次可以给 a a a加 x x x或减 y y y,问最小操作次数 a a a变为 b b b。

分类讨论差值。

Code

#include <bits/stdc .h> #define int long long #define endl '\n' using namespace std;  inline void span class="token function">solve(){ 
        
    int a, b; cin >> a >> b;
    int det = abs(a - b);
    if(a == b) cout << 0 << endl;
    else if(a > b && (det & 1 == 0) || a < b && det & 1) cout << 1 << endl;
    else if(a < b && (det / 2) & 1 || a > b) cout << 2 << endl;
    else cout << 3 << endl;
}


signed main(){ 
        
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 0; cin >> t;
    while(t--) solve();
    return 0;
}

B.JB Loves Comma

题目分析

找到cjb然后加个逗号就可以了,样例2好评

Code

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

inline void solve(){ 
        
    string str; cin >> str;
    for(int i = 0; i < str.size(); i++){ 
        
        if(i >= 2 && str[i] == 'b' && str[i - 1] == 'j' && str[i - 2] == 'c') cout << str[i] << ',';
        else cout << str[i];
    }
}

signed main(){ 
        
    solve();
    return 0;
}

C.JB Wants to Earn Big Money

题目分析

直接按照题意模拟,统计两类数量即可。

Code

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

inline void solve(){ 
        
    int n, m, X; cin >> n >> m >> X;
    int ans = 0;
    for(int i = 1; i <= n; i++){ 
        
        int s; cin >> s;
        if(s >= X) ans++;
    }
    for(int i = 1; i <= m; i++){ 
        
        int s; cin >> s;
        if(s <= X) ans++;
    }
    cout << ans << endl;
}

signed main(){ 
        
    ios_base::sync_with_stdio(false), cin.tie(0);
    solve();
    return 0;
}

F.Easy Fix

题目分析

主席树写挂了,赛时没调出来,我是菜狗

给定排列 p 1 , p 2 , p 3 , … , p n p_1, p_2, p_3,\dots, p_n p1​,p2​,p3​,…,pn​,定义 A i A_i Ai​表示在 p i p_i pi​左侧并比 p i p_i pi​小的数字个数, B i B_i Bi​表示在 p i p_i pi​右侧并比 p i p_i pi​小的数字个数, C i = min ⁡ ( A i , B i ) C_i = \min(A_i, B_i) Ci​=min(Ai​,Bi​)。现在给定多个操作 ( l , r ) (l, r) (l,r),求每个操作,交换 ( p i , p j ) (p_i, p_j) (pi​,pj​)后的 ∑ C i \sum C_i ∑Ci​。

首先考虑如何处理初始时的 C i C_i Ci​值,观察到以下性质:

  • 对于 A i A_i Ai​值的求解过程类似求逆序对的思想,可以直接上树状数组维护, O ( n log ⁡ n ) O(n\log n) O(nlogn)求得全部的 A i A_i Ai​
  • 由于是排列, B i = p i − 1 − A i B_i = p_i - 1 - A_i Bi​=pi​−1−Ai​可以 O ( 1 ) O(1) O(1)求得
  • 那么 C i = min ⁡ ( A i , B i ) C_i = \min(A_i, B_i) Ci​=min(Ai​,Bi​)也是 O ( 1 ) O(1) O(1)得到的

由于每个询问相互独立,那么考虑交换 ( p l , p r ) (p_l, p_r) (pl​,pr​)操作对 C i C_i Ci​的影响:

锐单商城 - 一站式电子元器件采购平台