B. AB Flipping
老规矩,自己要模拟一遍样例,发现样例还不够,就自己构造样例,这样做着做着就会有思路。
分析:假如现在有这样一个字符串 BBBAABABBAAA。会发现前三个和后三个一定是不会被操作的,因为不会满足si = 'A',si+1 = 'B'。然后自己模拟,会发现中间的所有位置一定会可以被操作。
#include<assert.h>
#include<cstdio>
#include<set>
#include<list>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include <stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<sstream>
#include<stack>
#include <utility>
#include<map>
#include <vector>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define inf 0x3f3f3f3f
//2147483647
//#define int long long
//#include <bits/stdc++.h>
typedef long long ll;
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
void solve() {
int n; cin >> n;
string s; cin >> s;
int sz = s.size();
int cnt = 0;
for (int i = 0; i < sz; i++) {
if (s[i] == 'B') cnt++;
else break;
}
for (int i = sz - 1; i >= 0; i--) {
if (s[i] == 'A') cnt++;
else break;
}
//cout << "答案:";
cout << max(0, n - 1 - cnt) << endl;
}
signed main()
{
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
C. Matching Arrays
Example
input
Copy
7
1 0
1
2
1 1
1
2
3 0
2 4 3
4 1 2
3 1
2 4 3
4 1 2
3 2
2 4 3
4 1 2
3 3
2 4 3
4 1 2
5 2
6 4 5 6 2
9 7 9 1 1
output
Copy
YES 2 NO NO YES 2 4 1 YES 4 1 2 NO YES 1 9 9 7 1
分析:因为可以ai对应的bi是可以自己决定的,这代表原有的数组a,b的顺序不重要,只要在输出的时候知道ai对应的bi是什么即可。所以我们对a和b进行预排序,对a排降序,对b排升序。
我们贪心地想,如果1<=i<=x && ai>bi,i>x && ai<=bi,那么就一定YES。反之就是NO。
这样的话ai对应的bi就可以找到了,那么如何输出呢?因为刚刚对a排序,我们现在要“反排序”,使a变回原来的样子,该怎么做?
将a定义成结构体,其中有index存每个元素的原下标,再定义一个cmp用于“反排序“就行。
int b[N];
struct Node {
int index;
int val_a;
int val_b;
}a[N];
bool cmp1(Node e1, Node e2) {
return e1.val_a < e2.val_a;
}
bool cmp2(Node e1, Node e2) {
return e1.index < e2.index;
}
void solve() {
int n, x; cin >> n >> x;
for (int i = 1; i <= n; i++) {
cin >> a[i].val_a;
a[i].index = i;
}
for (int i = 1; i <= n; i++) cin >> b[i];
sort(a + 1, a + 1 + n, cmp1);
sort(b + 1, b + 1 + n);
int f = 1;
for (int i = 1; i <= x; i++) {
if (a[n - x + i].val_a <= b[i]) {
f = 0;
break;
}
else {
a[n - x + i].val_b = b[i];
}
}
for (int i = 1; i <= n-x; i++) {
if (a[i].val_a > b[x + i]) {
f = 0;
break;
}
else {
a[i].val_b = b[x + i];
}
}
sort(a + 1, a + 1 + n, cmp2);
//cout << "答案:";
if (!f) cout << "NO" << endl;
else {
cout << "YES" << endl;
//cout << "答案:";
for (int i = 1; i <= n; i++) {
if (i != 1) cout << " ";
cout << a[i].val_b;
}
cout << endl;
}
}
signed main() {
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}