比赛链接:Here

AB水题

C - Peaks

题意:

  • 给出 AtCoder Beginner Contest 166 (A~E) - 图1 个观察台的高度,以及 AtCoder Beginner Contest 166 (A~E) - 图2 条边,定义“好观察台”:比所有直接相连的观测台都高

思路:

因为道路是双向的,互相判断一下即可

a &= bool 这个写法学习了

  1. int main() {
  2. cin.tie(nullptr)->sync_with_stdio(false);
  3. int n, m; cin >> n >> m;
  4. vector<int>h(n), st(n, 1);
  5. for (int &i : h) cin >> i;
  6. while (m--) {
  7. int a, b;
  8. cin >> a >> b, a -= 1, b -= 1;
  9. st[a] &= h[a] > h[b];
  10. st[b] &= h[b] > h[a];
  11. }
  12. int cnt = 0;
  13. for (int i = 0; i < n; ++i) cnt += st[i];
  14. cout << cnt;
  15. }

D - I hate Factorization

题意:

  • 给出 AtCoder Beginner Contest 166 (A~E) - 图3#card=math&code=X%28%5Cle1e9%29) 请问存在 AtCoder Beginner Contest 166 (A~E) - 图4#card=math&code=%28A%EF%BC%8CB%29) 使得 AtCoder Beginner Contest 166 (A~E) - 图5

思路:

因为 A,B可取负值,而且数据范围挺大的,说明应该有技巧

实际写了一下数据发现 AtCoder Beginner Contest 166 (A~E) - 图6 取值范围应该在 AtCoder Beginner Contest 166 (A~E) - 图7 之中,而且一定存在(证明不提供)

那么直接枚举就好了

  1. ll fac(ll x) {return x * x * x * x * x;}
  2. int main() {
  3. cin.tie(nullptr)->sync_with_stdio(false);
  4. ll n; cin >> n;
  5. for (ll i = -1000; i <= 1000; ++i) {
  6. ll y = fac(i) + n;
  7. for (ll j = -1000; j <= 1000; ++j)
  8. if (fac(j) == y) {
  9. return printf("%lld %lld", j, i), 0;
  10. }
  11. }
  12. }

E - This Message Will Self-Destruct in 5s

题意:

  • 给出一个长度为 n 的序列 h,
    求问有多少组不同的无序数对 AtCoder Beginner Contest 166 (A~E) - 图8#card=math&code=%28i%2Cj%29) 使得 AtCoder Beginner Contest 166 (A~E) - 图9

思路:

思维题,题意是找数对 AtCoder Beginner Contest 166 (A~E) - 图10#card=math&code=%28i%2Cj%29) 使得 AtCoder Beginner Contest 166 (A~E) - 图11 ,我们不妨设讠<j,移项得:a-j=-0-,很容易想到用map存数,每次更新答案即可

我们可以设 AtCoder Beginner Contest 166 (A~E) - 图12 简单移项后 map 存数即可(在ABC里做过类似的了)

  1. int main() {
  2. cin.tie(nullptr)->sync_with_stdio(false);
  3. int n; cin >> n;
  4. int a[n + 1];
  5. ll cnt = 0;
  6. map<int, int>mp;
  7. for (int i = 1; i <= n; ++i) {
  8. cin >> a[i];
  9. cnt += mp[a[i] - i];
  10. mp[-a[i] - i] += 1;
  11. }
  12. cout << cnt ;
  13. }