A. Make it White
题意:找到最左最右边的黑块,计算距离
#include<bits/stdc++.h>
#define Max 0x7fffffff
#define LL long long
#define ULL unsigned long long
#define N 1000005
//#define int long long
#define mod 1000000007
using namespace std;
string s; map<string, int>mp;
signed main() {
int t; scanf("%d", &t);
while (t--) {
int n; scanf("%d", &n);
cin >> s;
int p=0, e=0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'B') {
p = i; break;
}
}
for (int i = s.size();i>=0 ; i--) {
if (s[i] == 'B') {
e = i;
break;
}
}
printf("%d\n", e - p + 1);
}
}
B. Following the String
题意:给你一串数字,表示a-z字母出现的次数,例:[0,0,1,2]对应的字符串为"abaa"
思路:统计每个数字出现的个数,用‘a’加上,相当于用字符表示数字出现的次数,第一次出现就是'a',第二次就是'b';
#include<bits/stdc++.h>
#define Max 0x7fffffff
#define LL long long
#define ULL unsigned long long
#define N 1000005
//#define int long long
#define mod 1000000007
using namespace std;
signed main() {
int T; scanf("%d", &T);
while (T--) {
int n; scanf("%d", &n);
vector<int> a(n + 1);
for (int i = 0; i < n; i++) {
int t; scanf("%d", &t);
printf("%c", 'a' + a[t]);
a[t]++;
}
printf("\n");
}
}
C. Choose the Different Ones!
题意:判断是否能从两个数组中取出k/2个数组成1-k;
思路:只要判断两个数组中1-k的独立出现的数字个数不大于k/2个就行了,前提是1-k中的数都存在
#include<bits/stdc++.h>
#define Max 0x7fffffff
#define LL long long
#define ULL unsigned long long
#define N 1000005
//#define int long long
#define mod 1000000007
using namespace std;
signed main() {
int T; scanf("%d", &T);
while (T--) {
int n, m, k; scanf("%d%d%d", &n, &m, &k);
vector<int>p(k + 1, 0), p1(k+ 1, 0); unordered_map<int, int>mp;
for (int i = 0; i < n; i++) {
int t; scanf("%d", &t);
if (t <= k) {
if (p1[t] == 0)
p[t]++, mp[t]++, p1[t]++;
}
}
vector<int>p2(k+ 1, 0);
for (int i = 0; i < m; i++) {
int t; scanf("%d", &t);
if (t <= k) {
if (p2[t] == 0)
p[t]++, p2[t]++;
}
}
int cnt = 0, d1 = 0, d2 = 0, fl = 0;
for (int i = 1; i <= k; i++) {
if (p[i] == 0) {
fl = 1;
break;
}
else if (p[i] >= 2)continue;
if (mp[i])d1++;
else d2++;
}
if (fl)printf("NO\n");
else if (d1 <= k / 2 && d2 <= k / 2)printf("yes\n");
else printf("no\n");
}
}
D. Find the Different Ones!
题意:n个数,q次询问,l,r,之间有没有不同的,有的话输出下标,没有输出-1,-1.
思路:预处理,找到每个数下一个不同的位置d[i],判断d[i]<=r是的话输出l,d[l],否则输出-1 -1.
#include<bits/stdc++.h>
#define Max 0x7fffffff
#define LL long long
#define ULL unsigned long long
#define N 1000005
//#define int long long
#define mod 1000000007
using namespace std;
int a[N];
signed main() {
int T; scanf("%d", &T);
while (T--) {
int n; scanf("%d", &n);
vector<int>b(n+1,0);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
int i = 1;
while (i <= n) {
int j = i;
while (j + 1 <= n && a[i] == a[j + 1]) {
j++;
}
for (int k = i; k <= j; k++) { b[k] = j + 1; }
i = j + 1;
}
int q; scanf("%d", &q);
while (q--) {
int l, r,fl=0; scanf("%d%d", &l, &r);
if (b[l] <= r&&b[l]>0)
printf("%d %d\n", l,b[l]);
else
printf("-1 -1\n");
}
printf("\n");
}
}