如何加速 vector(刚才比赛 T4)
  • 板块学术版
  • 楼主__HHX__
  • 当前回复19
  • 已保存回复19
  • 发布时间2023/10/5 18:07
  • 上次更新2023/11/2 15:27:13
查看原帖
如何加速 vector(刚才比赛 T4)
717286
__HHX__楼主2023/10/5 18:07
#include <algorithm>
#include <iostream>
#include <set>
#include <vector>

using namespace std;

const int MaxN = 2e6 + 3;

inline int read() {
  int s = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
  return s * w;
}

inline void write(long long x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}

struct Node {
  int v, b, x;
};

Node p[MaxN << 1];

vector<pair<int, int> > h[MaxN][2], s[MaxN][2];

pair<int, int> zh[MaxN], zs[MaxN];

set<pair<int, int> > se;

long long ans[MaxN];

inline bool cmp(const Node &x, const Node &y) {
  return x.v > y.v;
}

signed main() {
  int n, m, q, k, tot = 0, dh = 0, ds = 0;
  n = read();
  m = read();
  k = read();
  q = read();
  for (int i = 1; i <= q; i++) {
    int op, l, r, c, t;
    op = read();
    l = read();
    r = read();
    c = read();
    t = read();
    // cout << op << ' ' << l << ' ' << r << ' ' << c << ' ' << t << '\n';
    if (op == 1) {
      if (t == 1) {
        h[l][1].push_back({q + i, c});
        h[r + 1][0].push_back({q + i, c});
      } else {
        h[l][1].push_back({q - i + 1, c});
        h[r + 1][0].push_back({q - i + 1, c});
      }
    } else {
      if (t == 1) {
        s[l][1].push_back({q + i, c});
        s[r + 1][0].push_back({q + i, c});
      } else {
        s[l][1].push_back({q - i + 1, c});
        s[r + 1][0].push_back({q - i + 1, c});
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    zh[i] = {-1, 0};
  }
  for (int i = 1; i <= m; i++) {
    zs[i] = {-1, 0};
  }
  for (int i = 1; i <= n + 1; i++) {
    for (auto ll : h[i][1]) {
      se.insert(ll);
    }
    for (auto ll : h[i][0]) {
      se.erase(ll);
    }
    if (se.size() >= 1) {
      auto it = se.end();
      it--;
      zh[i] = (*it);
    }
  }
  for (int i = 1; i <= m + 1; i++) {
    for (auto ll : s[i][1]) {
      se.insert(ll);
    }
    for (auto ll : s[i][0]) {
      se.erase(ll);
    }
    if (se.size() >= 1) {
      auto it = se.end();
      it--;
      zs[i] = (*it);
    }
  }
  for (int i = 1; i <= n; i++) {
    p[++tot] = {zh[i].first, 1, zh[i].second};
  }
  for (int i = 1; i <= m; i++) {
    p[++tot] = {zs[i].first, 0, zs[i].second};
  }
  sort(p + 1, p + tot + 1, cmp);
  for (int i = 1; i <= tot; i++) {
    if (p[i].b) {
      ds++;
      ans[p[i].x] += m - dh;
    } else {
      dh++;
      ans[p[i].x] += n - ds;
    }
  }
  for (int i = 1; i <= k; i++) {
    write(ans[i]);
    putchar(' ');
  }
  return 0;
}

实测卡在 vector 了

90 分,能优化或者思路就是错的。

2023/10/5 18:07
加载中...