Codeforces Round 771 (Div.2) C

刚开始c题用dp做的,一直没做出来

B. Odd Swap Sort

Problem - B - Codeforces

题意

给定一个序列\(a\),如果\(a_i\)\(a_{i+1}\)的和为奇数,可进行一次操作把两者交换。求能进行若干次操作,把原序列变成一个非递减序列。

思路

题目中出现奇偶则从奇偶性考虑,把原序列分为奇数和偶数两个序列,如果两个序列都是非递减的,则说明可以,否则不行。

代码

void solve() {
    int n;
    cin >> n;
 
    vector<int> v(n);
    for(int i = 0; i < n; i++) {
        cin >> v[i];
    }
 
    int a = 0, b = 0;
    for(int i = 0; i < n; i++) {
        if(v[i] & 1) {
            if(v[i] >= a) {
                a = v[i];
            } else {
                cout << "NO\n";
                return;
            }
        } else {
            if(v[i] >= b) { 
                b = v[i];
            } else {
                cout << "NO\n";
                return;
            }
        }
    }
 
    cout << "YES\n";
}

C. Inversion Graph

Problem - C - Codeforces

题意

给定一个排列\(p\),对于逆序对\((p_i,p_j)\),连接\(i,j\)一条无向边。求最终连通块数量。

思路

求每个前缀的最大值,如果一个前缀的最大值等于前缀的长度,则答案加一。

代码

void solve() {
    int n;
    cin >> n;

    int mx = 0, ans = 0;
    for(int i = 1, x; i <= n; i++) {
        cin >> x;
        mx = max(mx, x);
        if(mx == i) ans++;
    }

    cout << ans << "\n";
}
posted @ 2023-07-10 00:16  wuyoudexian  阅读(14)  评论(0)    收藏  举报