锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-12-11 18:37:00 nmb悬臂梁传感器

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  #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 
#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 
#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=pi1Ai可以 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的影响:

相关文章