Atcoder ABC 070

安稳与你 提交于 2020-02-16 04:33:32

Atcoder ABC 070

ABC

抗压能力不太行,打点模拟赛调整下状态

A

判定一个串是否是回文。

#define judge
#include <bits/stdc++.h>
using namespace std;
int main() {
#ifndef judge
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  string s;
  cin >> s;
  int tag = 0;
  for (int i = 0; i < s.size(); i++) {
    if (s[i] != s[s.size() - i - 1]) {
      tag = 1;
      break;
    }
  }
  if (tag) {
    cout << "No" << endl;
  } else {
    cout << "Yes" << endl;
  }

  return 0;
}

B

给定两个区间,求出共同区间的大小,共同区间的左端点等于两个区间的左端点最大值,右端点等于两个区间右端点的最小值。
区间为空时应该是输出 0。

#define judge
#include <bits/stdc++.h>
using namespace std;
int main() {
#ifndef judge
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  int a, b, c, d;
  cin >> a >> b >> c >> d;
  cout << max(0, min(b, d) - max(a, c)) << endl;
  return 0;
}

C

p和q最大公约数* p和q的最小公倍数 = p*q

一些数字的共同最小公倍数等于对每一个数组求最小公倍数:

// #define judge
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e2 + 10;
int n;
ll gcd(ll a, ll b) {
  if (b > a) swap(a, b);
  while (b != 0) {
    ll r = b;
    b = a % b;
    a = r;
  }
  return a;
}
ll low(ll a, ll b) { return a / gcd(a, b) * b; }
int main() {
#ifndef judge
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  cin >> n;
  ll x = 1, y;
  for (int i = 0; i < n; i++) {
    cin >> y;
    x = low(x, y);
  }
  cout << x << endl;
  return 0;
}

D

题意:给定一棵树,和一个指定的节点 k,对于节点 a 和 b ,有 q 个询问,询问从 a 到达 b 的距离的最小值。
解决:权值是非负,最短路问题,做以 k 为起点的 dijsktra。dist[a]+dist[j] 为答案。

注意:数组尽量开大一点,无向图的边数是点数的 2 倍,因此是\(2*maxn\)

#define judge
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
static int faster_iostream = []() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  return 0;
}();
ll q, a, b, c, x, y, k;
const int maxn = 5e5 + 10;
int n, m;
ll h[maxn], w[maxn * 2], e[maxn], ne[maxn * 2], idx;
ll dist[maxn];
bool used[maxn];

void init() {
  memset(h, -1, sizeof h);
  idx = 0;
}
void add(int a, int b, int c) {
  e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

void dij(int k) {
  memset(dist, 0x3f, sizeof dist);
  dist[k] = 0;
  priority_queue<PII, vector<PII>, greater<PII>> heap;
  heap.push(make_pair(0, k));
  while (heap.size()) {
    PII t = heap.top();
    heap.pop();

    ll ver = t.second, distance = t.first;
    if (used[ver]) continue;
    used[ver] = true;
    for (int i = h[ver]; i != -1; i = ne[i]) {
      ll j = e[i];
      if (dist[j] > distance + w[i]) {
        dist[j] = distance + w[i];
        heap.push(make_pair(dist[j], j));
      }
    }
  }
}

int main() {
#ifndef judge
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  cin >> n;
  init();
  for (int i = 0; i < n - 1; i++) {
    cin >> a >> b >> c;
    add(a, b, c);
    add(b, a, c);
  }
  cin >> q >> k;
  dij(k);
  while (q--) {
    cin >> x >> y;
    cout << dist[x] + dist[y] << endl;
  }

  return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!