Codeforces Round 771 (Div.2) C
刚开始c题用dp做的,一直没做出来
B. Odd Swap Sort
题意
给定一个序列\(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
题意
给定一个排列\(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";
}

浙公网安备 33010602011771号