A
算法:
模拟。
code:
void solve()
{
int a, b, c;
cin >> a >> b >> c;
cout << (a ^ b ^ c) << endl;
}
B
算法:
模拟。
code:
void solve()
{
string s[3];
cin >> s[0] >> s[1] >> s[2];
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
if (s[i][j] == '?')
{
bool A = 0, B = 0, C = 0;
for (int k = 0; k < 3; ++k)
{
if (s[i][k] == 'A')
A = 1;
else if (s[i][k] == 'B')
B = 1;
else if (s[i][k] == 'C')
C = 1;
}
if (!A)
cout << 'A' << endl;
else if (!B)
cout << 'B' << endl;
else
cout << 'C' << endl;
return;
}
}
}
}
C
算法:
模拟。
code:
void solve()
{
int n;
cin >> n;
ll sum = 0;
for (int i = 0; i < n; ++i)
{
ll x;
cin >> x;
sum += x;
}
if ((ll)sqrtl(sum) * (ll)sqrtl(sum) == sum)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
D
算法:
模拟,双指针。
code:
void solve()
{
int n;
string s;
cin >> n >> s;
map<char, int> m;
m['a'] = m['e'] = 1;
string ans;
for (int i = 0; i < n; ++i)
{
if (m[s[i]])
ans += 'V';
else
ans += 'C';
}
vi st(n + 10, 0);
for (int i = s.size() - 1; ~i; --i)
{
int j = i - 1;
while (~j && ans[j] != 'C')
--j;
st[j] = 1;
i = j;
}
for (int i = 0; i < n; ++i)
{
cout << s[i];
if (st[i + 1])
cout << '.';
}
cout << endl;
}
E
算法:
思维,前缀和。
思路:
原问题中需要求出一个区间使\(a_l + a_{l + 2} + \text{…} + a_r = a_{l+1} + a_{l + 3} + \text{…} + a_{r- 1 }\),既选择一个区间使得奇数下标元素和与偶数下标元素和相等。
不难发现可以将问题装换为\(a_l – a_{l+1} + a_{l + 2} – a_{l + 3} + \text{…} – a_{r- 1 } + a_r = 0\),此时问题为选择一个区间和为0的区间,不难想到如果两个有交集且不完全相同的区间和相等,那么他们未相交的地方的和必然为0,所以只需判断有有没有两个区间和相等。
时间复杂度为 O(n)。
code:
void solve()
{
int n;
cin >> n;
vi a(n + 10);
for (int i = 1; i <= n; ++i)
cin >> a[i];
for (int i = 1; i <= n; ++i)
if (i % 2 == 0)
a[i] = -a[i];
map<ll, ll> m;
m[0] = 1;
ll sum = 0;
for (int i = 1; i <= n; ++i)
{
sum += a[i];
if (m[sum])
{
cout << "YES" << endl;
return;
}
++m[sum];
}
cout << "NO" << endl;
}
F
算法:
思维,逆序对。
思路:
不难发现只有一个区间完全包含另一个区间时两个人才会相遇,所以只需对左端点进行排序,再对右端点找逆序对即可。
code:
int tmp[N];
ll merge_sort(int q[], int l, int r)
{
if (l >= r)
return 0;
int mid = l + r >> 1;
ll ans = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
{
if (q[i] <= q[j])
tmp[k++] = q[i++];
else
{
ans += mid - i + 1;
tmp[k++] = q[j++];
}
}
while (i <= mid)
tmp[k++] = q[i++];
while (j <= r)
tmp[k++] = q[j++];
for (int i = l, j = 0; i <= r; i++, j++)
q[i] = tmp[j];
return ans;
}
void solve()
{
int n;
cin >> n;
vector<pii> a(n + 10);
for (int i = 0; i < n; ++i)
cin >> a[i].first >> a[i].second;
sort(a.begin(), a.begin() + n);
int v[N];
for (int i = 0; i < n; ++i)
v[i] = a[i].second;
cout << merge_sort(v, 0, n - 1) << endl;
}