QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#429752#4887. Fast BridgesSampsonYWWA 8ms31816kbC++144.8kb2024-06-02 20:24:392024-06-02 20:24:40

Judging History

你现在查看的是最新测评结果

  • [2024-06-02 20:24:40]
  • 评测
  • 测评结果:WA
  • 用时:8ms
  • 内存:31816kb
  • [2024-06-02 20:24:39]
  • 提交

answer

#include <bits/stdc++.h>
#define db double
#define il inline
#define re register
#define ll long long
#define ui unsigned
#define ull ui ll
#define i128 __int128
#define pii pair<int, int>
#define fi first
#define se second
#define eb emplace_back
#define SZ(v) (int)v.size()
#define ALL(v) v.begin(), v.end()
#define mems(v, x) memset(v, x, sizeof(v))
#define memc(a, b) memcpy(a, b, sizeof(a))
#define FOR(i, L, R) for(re int i = (L); i <= (R); ++i)
#define ROF(i, R, L) for(re int i = (R); i >= (L); --i)
#define LS i << 1, l, mid
#define RS i << 1 | 1, mid + 1, r
#define popc(x) __builtin_popcount(x)
#define popcll(x) __builtin_popcountll(x)
using namespace std;
#define N 505
#define M 1000000000
#define P 1000000007
il int add(int x, int y) {return x + y < P ? x + y : x + y - P;}
il void addr(int &x, int y) {(x += y) >= P && (x -= P);}
il int qpow(int p, int n = P - 2) {
  int s = 1;
  while(n) {
    if(n & 1) s = 1ll * s * p % P;
    p = 1ll * p * p % P, n >>= 1;
  }
  return s;
}
il void chkmin(int &x, int y) {(x > y) && (x = y);}
il void chkmax(int &x, int y) {(x < y) && (x = y);}
int n, m;
struct edge {
  int a, b, c, d;
} e[N];
int X[N * 2], LX;
int Y[N * 2], LY;
int dp[N][N];
vector<int> pos[N * 2][N * 2];
int f[2][N * 2][N];
int val[N];
il int solve(vector<edge> e) {
  // if(e.empty()) return 0;
  sort(ALL(e), [](edge A, edge B) {return A.c < B.c;});
  LX = LY = 0; int K = SZ(e), ans = 0;
  for(auto [a, b, c, d] : e) X[++LX] = a, X[++LX] = c, Y[++LY] = b, Y[++LY] = d;
  X[++LX] = Y[++LY] = m + 1;
  sort(X + 1, X + 1 + LX), LX = unique(X + 1, X + 1 + LX) - X - 1;
  sort(Y + 1, Y + 1 + LY), LY = unique(Y + 1, Y + 1 + LY) - Y - 1;
  auto idX = [](int v) {return lower_bound(X + 1, X + 1 + LX, v) - X;} ;
  auto idY = [](int v) {return lower_bound(Y + 1, Y + 1 + LY, v) - Y;} ;
  for(auto &[a, b, c, d] : e) a = idX(a), c = idX(c), b = idY(b), d = idY(d);
  // for(auto [a, b, c, d] : e) cout << "(" << a << ", " << b << ") -> (" << c << ", " << d << ")\n";
  // FOR(i, 1, LX) cout << X[i] << " \n"[i == LX];
  // FOR(i, 1, LY) cout << Y[i] << " \n"[i == LY];
  auto chk = [&](int i, int j) {--i, --j; if(e[i].c > e[j].a || e[i].d > e[j].b) return 0; return 1;} ;
  FOR(i, 1, K) FOR(j, 1, K) if(i != j && chk(i, j)) dp[i][j] = 2; else dp[i][j] = (i == j);
  FOR(k, 1, K) FOR(i, 1, K) FOR(j, 1, K) if(chk(i, k) && chk(k, j)) chkmax(dp[i][j], dp[i][k] + dp[k][j] - 1);
  // mems(dp, 0);
  // FOR(i, 1, n) dp[i][i] = 1;
  // FOR(L, 2, n) FOR(i, 1, n - L + 1) {
  //   int j = i + L - 1; if(!chk(i, j)) continue; dp[i][j] = 2;
  //   FOR(k, i + 1, j - 1) if(chk(i, k) && chk(k, j)) chkmax(dp[i][j], dp[i][k] + dp[k][j] - 1);
  // }
  // FOR(i, 1, K) FOR(j, 1, K) cout << dp[i][j] << " \n"[j == K];
  FOR(i, 1, LX) FOR(j, 1, LY) vector<int>().swap(pos[i][j]);
  FOR(i, 0, K - 1) pos[e[i].a][e[i].b].eb(i + 1);
  int now = 0, cur = 1; mems(f, 0);
  ROF(x, LX - 1, 1) {
    swap(now, cur), mems(f[now], 0);
    ROF(y, LY - 1, 1) {
      FOR(i, 1, K) {
        f[now][y][i] = max(f[now][y + 1][i], f[cur][y][i]);
        for(auto id : pos[x][y]) chkmax(f[now][y][i], dp[id][i]);//, cerr << x << " " << y << " " << i << " " << id << " val = " << dp[id][i] << "\n";
      }
      ll s = 0;
      FOR(i, 1, K) val[i] = m + 1;
      FOR(i, 1, K) {
        int v = f[now][y][i];
        // cerr << x << " " << y << " " << i << " " << v << "\n";
        if(!v || Y[e[i - 1].d] >= val[v]) continue;
        // cerr << "OK\n";
        // cerr << "goto = " << e[i - 1].c << " " << e[i - 1].d << " " << val[v] << " and s = " << s << "\n";
        // addr(s, 1ll * (m - X[e[i - 1].c] + 1) * (val[v] - Y[e[i - 1].d]) % P);
        s += 1ll * (m - X[e[i - 1].c] + 1) * (val[v] - Y[e[i - 1].d]);
        if(i % 8 == 0) s %= P;
        val[v] = Y[e[i - 1].d];
      }
      s %= P;
      // cerr << "A plane = " << s << "\n";
      // cout << x << " " << y << " " << s << "\n";
      addr(ans, 1ll * (X[x] - X[x - 1]) * (Y[y] - Y[y - 1]) % P * s % P);
    }
  }
  // cout << "-----------------------------------------------\n";
  return ans;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> m >> n;
  FOR(i, 1, n) {
    auto &[a, b, c, d] = e[i];
    cin >> a >> b >> c >> d;
  }
  vector<edge> A, B;
  FOR(i, 1, n) if(e[i].b < e[i].d) A.eb(e[i]); else B.eb(e[i]);
  for(auto &[a, b, c, d] : B) {
    a = m - a + 1, c = m - c + 1, swap(a, c), swap(b, d);
    // b = m - b + 1, d = m - d + 1;
  }
  int ans = add(1ll * m * (m + 1) % P * (m * 2 + 1) % P * qpow(3) % P, P - 1ll * m * (m + 1) / 2 % P * (m + 1) % P);
  ans = 2ll * m * m % P * ans % P;
  // cerr << ans << " " << solve(A) << " " << solve(B) << "\n";
  cout << 2ll * add(ans, P - add(solve(A), solve(B))) % P;
  cerr << 1.0 * clock() / CLOCKS_PER_SEC << "\n";
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 8ms
memory: 31816kb

input:

2 2
1 1 2 2
1 2 2 1

output:

12

result:

wrong answer expected '6', found '12'