ABC190 速通
ABC190
A, Very Very Primitive Game
显然,若两人的初始值不同,大的胜,否则后手胜。
时间复杂度 \(O(n)\)。
B, Magic 3
循环一遍看看有没有 \(x_i \lt S\) 且 \(y_i \gt D\) 的即可。
时间复杂度 \(O(n)\)。
C, Bowls and Dished
暴力枚举每一种选的情况即可。
时间复杂度 \(O(2^k(n + m))\)。
D, Staircase Sequence
假设 \(i + (i + 1) + \dots + j = n\),则 \((-i + 1) + (-i + 2) + \dots + j = n\)。
所以我们枚举项数,如果首相 \(\gt 0\),则 \(res \overset{+}{\gets} 2\)。否则退出循环。
时间复杂度 \(O(\sqrt{n})\)。
E, Magical Ornament
链接。
F, Shift and Inversions
链接。
代码
// A
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
if (c == 0)
{
if (a <= b)
{
cout << "Aoki" << endl;
}
else
{
cout << "Takahashi" << endl;
}
}
else
{
if (a >= b)
{
cout << "Takahashi" << endl;
}
else
{
cout << "Aoki" << endl;
}
}
return 0;
}
// B
#include <iostream>
using namespace std;
int main()
{
long long n, s, d;
cin >> n >> s >> d;
bool e = 0;
for (int i = 1; i <= n; i++)
{
long long x, y;
cin >> x >> y;
if (x >= s || y <= d)
{
continue;
}
e = true;
break;
}
if (e)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
return 0;
}
// C
#include <iostream>
using namespace std;
#define MAXN 105
int n, m, k;
int a[MAXN];
int b[MAXN];
int c[MAXN];
int d[MAXN];
int v[MAXN];
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
cin >> a[i] >> b[i];
}
cin >> k;
for (int i = 1; i <= k; i++)
{
cin >> c[i] >> d[i];
}
int res = 0;
for (int s = 0; s < (1 << k); s++)
{
for (int i = 1; i <= n; i++)
{
v[i] = 0;
}
for (int i = 1; i <= k; i++)
{
if (s & (1 << (i - 1)))
{
v[c[i]] = 1;
}
else
{
v[d[i]] = 1;
}
}
int r = 0;
for (int i = 1; i <= m; i++)
{
if (v[a[i]] && v[b[i]])
{
r++;
}
}
res = max(res, r);
}
cout << res << endl;
return 0;
}
// D
#include <iostream>
using namespace std;
using ll = long long;
ll n;
int main()
{
ll n;
cin >> n;
n *= 2;
// 2 * S = (a1 + ai) * i = i * (2 * a1 + (i - 1)) = n
// 2 * a1 + i - 1 = n / i
ll res = 0;
for (ll i = 1; i <= 10000006; i++)
{
if (!(n % i) && !((n / i - i + 1) % 2) && ((n / i - i + 1) / 2 > 0))
{
res += 2;
}
}
cout << res << endl;
}
// E
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
#define MAXN 100005
#define MAXK 18
#define MAXS 132020
// using ll = long long;
#define int long long
using pii = pair<int, int>;
vector<int> e[MAXN];
int dis[MAXN];
int n;
void bfs(int p)
{
queue<int> q;
for (int i = 1; i <= n; i++)
{
dis[i] = 0x3ffff3fff3ff;
}
dis[p] = 0;
q.push(p);
while (!q.empty())
{
int c = q.front();
q.pop();
for (int u : e[c])
{
if (dis[u] > n)
{
dis[u] = dis[c] + 1;
q.push(u);
}
}
}
}
int d[MAXK][MAXK];
int c[MAXK];
int dp[MAXS][MAXK];
signed main()
{
cin >> n;
int m;
cin >> m;
for (int i = 1; i <= m; i++)
{
int a, b;
cin >> a >> b;
e[a].push_back(b);
e[b].push_back(a);
}
int k;
cin >> k;
if (k == 1)
{
cout << 1 << endl;
return 0;
}
for (int i = 1; i <= k; i++)
{
cin >> c[i];
}
for (int i = 1; i <= k; i++)
{
bfs(c[i]);
for (int j = 1; j <= k; j++)
{
d[i][j] = dis[c[j]];
}
}
memset(dp, 0x1f, sizeof(dp));
for (int i = 1; i <= k; i++)
{
dp[1 << (i - 1)][i] = 1;
}
for (int s = 1; s < (1 << k); s++)
{
if (__builtin_popcount(s) == 1)
{
continue;
}
for (int i = 1; i <= k; i++)
{
if (!(s & (1 << (i - 1))))
{
continue;
}
for (int j = 1; j <= k; j++)
{
if (i == j)
{
continue;
}
if (!(s & (1 << (j - 1))))
{
continue;
}
dp[s][j] = min(dp[s][j], dp[s ^ (1 << (j - 1))][i] + d[i][j]);
}
}
}
int res = 0x3ffff3fff3ff;
for (int i = 1; i <= k; i++)
{
res = min(res, dp[(1 << k) - 1][i]);
}
if (res >= 0x3ffff3fff3ff)
{
cout << -1 << endl;
}
else
{
cout << res << endl;
}
return 0;
}
// F
#include <iostream>
using namespace std;
#define MAXN 300005
#define lowbit(x) ((x) & -(x))
#define int long long
int n;
int t1[MAXN];
void a1(int p, int v)
{
while (p <= n)
{
t1[p] += v;
p += lowbit(p);
}
}
int q1(int p)
{
int res = 0;
while (p)
{
res += t1[p];
p -= lowbit(p);
}
return res;
}
int t2[MAXN];
void a2(int p, int v)
{
while (p <= n)
{
t2[p] += v;
p += lowbit(p);
}
}
int q2(int p)
{
int res = 0;
while (p)
{
res += t2[p];
p -= lowbit(p);
}
return res;
}
int a[MAXN];
int r[MAXN];
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int res = 0;
for (int i = 1; i <= n; i++)
{
res += q1(n - a[i]);
a1(n - a[i], 1);
a2(a[i] + 1, 1);
}
r[0] = res;
for (int i = 1; i < n; i++)
{
a2(a[i] + 1, -1);
a1(n - a[i], -1);
res -= q2(a[i] + 1);
res += q1(n - a[i]);
a1(n - a[i], 1);
a2(a[i] + 1, 1);
r[i] = res;
}
for (int i = 0; i < n; i++)
{
cout << r[i] << endl;
}
return 0;
}


浙公网安备 33010602011771号