day-7

第二场牛客多校

k: https://ac.nowcoder.com/acm/contest/11253/K

//栈模拟
const int maxn = 1e5 + 7;
const int mod = 1e9 + 7;

int n, m, k, t, a[maxn], b[maxn];
int main()
{
    cin >> n >> k;
    for (int i = 1; i <= k; i++) {
        cin >> t >> b[t];
    }
    for (int i = 1; i <= n; i++) {
        if (!b[i]) {
            b[i] = b[i - 1] + 1;
        } else if (b[i] > b[i - 1] + 1) {
            cout << -1 << endl;
            return 0;
        }
    }
    stack<int> st;
    int us = 1;
    for (int i = n; i >= 1; i--) {
        while (st.size() < b[i])
            st.push(us++);
        a[i] = st.top();
        st.pop();
    }
    for (int i = 1; i <= n; i++)
        cout << a[i] << endl;
}

I:https://ac.nowcoder.com/acm/contest/11253/I

//bfs + 路径打印 + 模拟
  std::queue<std::tuple<int, int, int, int>> que;
  que.emplace(N - 1, N - 1, N - 1, 0);
  auto [x1, y1, x2, y2] = que.front();
//bfs记录前驱,使用一个int记录四个坐标:
  g[nx1][ny1][nx2][ny2] = (((x1 * N + y1) * N + x2) * N + y2) * 4 + i;
  int x1 = 0, y1 = N - 1, x2 = 0, y2 = 0;
  std::string ans;
  while (true) {
      a[x1][y1] = b[x2][y2] = 'A';
      if (f[x1][y1][x2][y2] == 0) {
          break;
      }
      int G = g[x1][y1][x2][y2];
      int nx1 = G / 4 / N / N / N;
      int ny1 = G / 4 / N / N % N;
      int nx2 = G / 4 / N % N;
      int ny2 = G / 4 % N;
      int d = G % 4;
      ans += "DLRU"[d];
      x1 = nx1;
      y1 = ny1;
      x2 = nx2;
      y2 = ny2;
  }
std::reverse(ans.begin(), ans.end());

F:https://ac.nowcoder.com/acm/contest/11253/F

//化简公式 发现是两球求交 

#include <bits/stdc++.h>

const double pi = std::acos(-1);

double sq(double x)
{
    return x * x;
}
double cb(double x)
{
    return x * x * x;
}
double cos(double a, double b, double c) { return (b * b + c * c - a * a) / (2 * b * c); }

double cap(double r, double h) { return pi * (r * 3 - h) * h * h / 3; }

double dis(double x1, double y1, double z1, double x2, double y2, double z2)
{
    return sq(x1 - x2) + sq(y1 - y2) + sq(z1 - z2);
}

double sphere_intersect(double x1, double y1, double z1, double r1, double x2, double y2, double z2, double r2)
{
    double d = dis(x1, y1, z1, x2, y2, z2);
    //相离
    if (d >= sq(r1 + r2))
        return 0;
    //包含
    if (d <= sq(r1 - r2))
        return cb(std::min(r1, r2)) * 4 * pi / 3;
    //相交
    double h1 = r1 - r1 * cos(r2, r1, std::sqrt(d)), h2 = r2 - r2 * cos(r1, r2, std::sqrt(d));

    return cap(r1, h1) + cap(r2, h2);
}

ends:多校真的太难打了,静不下来写题目 赶紧调整。。。(虽然觉得学不到啥东西)
还是要多训练 相信自己!

posted @ 2021-07-19 20:32  naymi  阅读(49)  评论(0)    收藏  举报