342
A - Yay!
字符串中有一个字符和别人,找出他
void solve() {
string s;cin >> s;char ch = s[0], chh = s[1];
if (count(s.begin(), s.end(), s[0]) == 1) {
cout << "1\n";return;
}
for (int i = 1;i < s.size();i++) {
if (s[i] != s[0]) {
cout << i + 1 << '\n';return;
}
}
}
B - Which is ahead?
有
处理
- 给你整数
和 。在人 和人 之间,打印站在最前面的人的编号。
void solve() {
int n;cin >> n;vector<int> a(n + 1);
unordered_map<int, int> m;
for (int i = 1;i <= n;i++) {
cin >> a[i];
m[a[i]] = i;
}
int q;cin >> q;
while (q--) {
int l, r;cin >> l >> r;
if (m[l] < m[r]) {
cout << l << '\n';
} else {
cout << r << '\n';
}
}
}
C - Many Replacement
给出字符串和
Solution
树状数组/思维
只要知道每个字母最终会变成什么字符就可以。
void solve() {
int n;cin >> n;string s;cin >> s;
int q;cin >> q;
string a = "abcdefghijklmnopqrstuvwxyz";
while (q--) {
char c, d;cin >> c >> d;
for (int i = 0;i < a.size();i++) {
if (a[i] == c)a[i] = d;
}
}
for (int i = 0;i < n;i++) {
s[i] = a[s[i] - 'a'];
}
cout << s << '\n';
}
D - Square Pair
给定数组
Solution
如果
对于整数
#define int long long
void solve() {
int n;cin >> n;vector<int> a(n);for (auto& i : a)cin >> i;
sort(a.begin(), a.end());
int ans = 0, p = 0;
for (int i = 0;i < n;i++) {
if (!a[i])ans += n - i - 1, p = i + 1;
}
vector<int> l(n, 1), num(2e5 + 1);
for (int i = p;i < n;i++) {
int k = 1;
while (k * k <= a[i]) {
k++;
if (a[i] % (k * k) == 0)l[i] = (k * k);
}
a[i] /= l[i];
num[a[i]]++;
}
for (int i = 1;i <= 2e5;i++) {
ans += (num[i] - 1) * num[i] / 2;
}
cout << ans << '\n';
}
E - Last Train
(待更
反向建图
概率DP
线段树/multiset