QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#688722#1268. Diamond Rushwzj33300WA 1385ms102280kbC++147.5kb2024-10-30 13:03:212024-10-30 13:03:21

Judging History

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

  • [2024-10-30 13:03:21]
  • 评测
  • 测评结果:WA
  • 用时:1385ms
  • 内存:102280kb
  • [2024-10-30 13:03:21]
  • 提交

answer

/**
  * created     : 30.10.2024 12:36:13
  * author      : wzj33300
  */

#include <bits/stdc++.h>
using namespace std;

#ifdef DEBUG
#include <algo/debug.h>
#else
#define debug(...) 42
#define assert(...) 42
#endif

using ll = long long;
using u32 = unsigned int;
using u64 = unsigned long long;
using db = long double;  // or double, if TL is tight
using str = string;      // yay python!

// pairs
using pi = pair<int, int>;
using pl = pair<ll, ll>;
using pd = pair<db, db>;
#define mp make_pair
#define fi first
#define se second

// ^ lol this makes everything look weird but I'll try it
template <class T>
using vc = vector<T>;
template <class T, size_t SZ>
using AR = array<T, SZ>;
using vi = vc<int>;
using vb = vc<bool>;
using vl = vc<ll>;
using vd = vc<db>;
using vs = vc<str>;
using vpi = vc<pi>;
using vpl = vc<pl>;
using vpd = vc<pd>;

// vectors
// oops size(x), rbegin(x), rend(x) need C++17
#define sz(x) int((x).size())
#define bg(x) begin(x)
#define all(x) bg(x), end(x)
#define rall(x) x.rbegin(), x.rend()
#define sor(x) sort(all(x))
#define rsz resize
#define ins insert
#define pb push_back
#define eb emplace_back
#define ft front()
#define bk back()

#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rep1(i, n) for (int i = 1; i < (n); ++i)
#define rep1n(i, n) for (int i = 1; i <= (n); ++i)
#define repr(i, n) for (int i = (n) - 1; i >= 0; --i)

#define rep_subset(t, s) \
  for (ll t = (s); t >= 0; t = (t == 0 ? -1 : (t - 1) & (s)))

#define lb lower_bound
#define ub upper_bound
template <class T>
int lwb(vc<T> &a, const T &b) {
  return int(lb(all(a), b) - bg(a));
}
template <class T>
int upb(vc<T> &a, const T &b) {
  return int(ub(all(a), b) - bg(a));
}
// const int MOD = 998244353;  // 1e9+7;
const int Big = 1e9;  // not too close to INT_MAX
const ll BIG = 1e18;  // not too close to LLONG_MAX
const db PI = acos((db)-1);
const int dx[4]{1, 0, -1, 0}, dy[4]{0, 1, 0, -1};  // for every grid problem!!
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());
template <class T>
using pqg = priority_queue<T, vector<T>, greater<T>>;

int pct(int x) { return __builtin_popcount(x); }
int pct(u32 x) { return __builtin_popcount(x); }
int pct(ll x) { return __builtin_popcountll(x); }
int pct(u64 x) { return __builtin_popcountll(x); }
int popcnt_mod_2(int x) { return __builtin_parity(x); }
int popcnt_mod_2(u32 x) { return __builtin_parity(x); }
int popcnt_mod_2(ll x) { return __builtin_parityll(x); }
int popcnt_mod_2(u64 x) { return __builtin_parityll(x); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 1, 2)
int topbit(int x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(u32 x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(ll x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
int topbit(u64 x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 0, 2)
int lowbit(int x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(u32 x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(ll x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }
int lowbit(u64 x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }

template <typename T>
T floor(T a, T b) {
  return a / b - (a % b && (a ^ b) < 0);
}
template <typename T>
T ceil(T x, T y) {
  return floor(x + y - 1, y);
}
template <typename T>
T bmod(T x, T y) {
  return x - y * floor(x, y);
}
template <typename T>
pair<T, T> divmod(T x, T y) {
  T q = floor(x, y);
  return {q, x - q * y};
}

template <class T>
bool ckmin(T &a, const T &b) {
  return b < a ? a = b, 1 : 0;
}  // set a = min(a,b)
template <class T>
bool ckmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}  // set a = max(a,b)

template <class T, class U>
T fstTrue(T lo, T hi, U f) {
  ++hi;
  assert(lo <= hi);  // assuming f is increasing
  while (lo < hi) {  // find first index such that f is true
    T mid = lo + (hi - lo) / 2;
    f(mid) ? hi = mid : lo = mid + 1;
  }
  return lo;
}
template <class T, class U>
T lstTrue(T lo, T hi, U f) {
  --lo;
  assert(lo <= hi);  // assuming f is decreasing
  while (lo < hi) {  // find first index such that f is true
    T mid = lo + (hi - lo + 1) / 2;
    f(mid) ? lo = mid : hi = mid - 1;
  }
  return lo;
}

const int N = 400 * 400 * 25 * 2, mod = 1e9 + 7;

int sum[N], ls[N], rs[N], cnt, val[N], pw[400 * 400 + 1];

void update(int &rt, int l, int r, int x) {
  ++cnt;
  ls[cnt] = ls[rt], rs[cnt] = rs[rt], sum[cnt] = sum[rt], val[cnt] = val[rt];
  rt = cnt;
  sum[rt]++;
  val[rt] += pw[x];
  val[rt] %= mod;
  if (l == r) return;
  int mid = l + r >> 1;
  if (x <= mid)
    update(ls[rt], l, mid, x);
  else
    update(rs[rt], mid + 1, r, x);
}

bool cmp(int x, int y, int l, int r) {
  if (l == r) return sum[x] > sum[y];
  int mid = l + r >> 1;
  if (sum[rs[x]] != sum[rs[y]])
    return cmp(rs[x], rs[y], mid + 1, r);
  else
    return cmp(ls[x], ls[y], l, mid);
}

using P = pair<int, int>;

P LS(P x) {
  return P{ls[x.fi], ls[x.se]};
}
P RS(P x) {
  return P{rs[x.fi], rs[x.se]};
}
int SUM(P x) {
  return sum[x.fi] + sum[x.se];
}
int VAL(P x) {
  return (val[x.fi] + val[x.se]) % mod;
}

bool cmp(P x, P y, int l, int r) {
  if (l == r) return SUM(x) > SUM(y);
  int mid = l + r >> 1;
  if (SUM(RS(x)) != SUM(RS(y)))
    return cmp(RS(x), RS(y), mid + 1, r);
  else
    return cmp(LS(x), LS(y), l, mid);
}

void _sol() {
  int n, m;
  cin >> n >> m;
  pw[0] = 1;
  for (int i = 1; i <= n * n; i++) {
    pw[i] = pw[i - 1] * n * n % mod;
  }
  vc<vi> a(n, vi(n));
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      cin >> a[i][j];
  vc<vc<int>> f(n, vc<int>(n));
  cnt = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      if (i == 0 && j == 0) {
      } else if (i == 0)
        f[i][j] = f[i][j - 1];
      else if (j == 0)
        f[i][j] = f[i - 1][j];
      else
        f[i][j] = cmp(f[i - 1][j], f[i][j - 1], 1, n * n) ? f[i - 1][j] : f[i][j - 1];
      update(f[i][j], 1, n * n, a[i][j]);
      debug(val[f[i][j]]);
    }
  vc<vc<int>> g(n, vc<int>(n));
  vc<vc<P>> pre(n, vc<P>(n)), suf(pre);
  repr(i, n) repr(j, n) {
    if (i == n - 1 && j == n - 1) {
    } else if (i == n - 1)
      g[i][j] = g[i][j + 1];
    else if (j == n - 1)
      g[i][j] = g[i + 1][j];
    else
      g[i][j] = cmp(g[i + 1][j], g[i][j + 1], 1, n * n) ? g[i + 1][j] : g[i][j + 1];
    pre[i][j] = suf[i][j] = P{f[i][j], g[i][j]};
    update(g[i][j], 1, n * n, a[i][j]);
  }
  debug(f, g);
  for (int i = 0; i < n; i++) {
    for (int j = 1; j < n; j++) {
      pre[i][j] = cmp(pre[i][j], pre[i][j - 1], 1, n * n) ? pre[i][j] : pre[i][j - 1];
    }
    for (int j = n - 2; j >= 0; j--) {
      suf[i][j] = cmp(suf[i][j], suf[i][j + 1], 1, n * n) ? suf[i][j] : suf[i][j + 1];
    }
  }
  while (m--) {
    int x1, x2, y1, y2;
    cin >> x1 >> x2 >> y1 >> y2;
    --x1, --x2, --y1, --y2;
    P ans{0, 0};
    // (x2, y1)
    if (x2 < n - 1 && y1 > 0) {
      ans = cmp(ans, pre[x2 + 1][y1 - 1], 1, n * n) ? ans : pre[x2 + 1][y1 - 1];
    }
    // (x1, y2)
    if (x1 > 0 && y2 < n - 1) {
      ans = cmp(ans, suf[x1 - 1][y2 + 1], 1, n * n) ? ans : suf[x1 - 1][y2 + 1];
    }
    cout << VAL(ans) << '\n';
  }
}

// signed main() {
int main() {
  // freopen(".in", "r",stdin);
  // freopen(".out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t;
  cin >> t;
  while (t--) {
    _sol();
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 5688kb

input:

1
2 2
2 3
1 4
1 1 2 2
2 2 1 1

output:

276
336

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 1385ms
memory: 102280kb

input:

5
399 200000
1 5 3 2 3 5 5 4 3 5 2 5 1 2 4 1 3 1 1 5 5 5 5 2 2 2 3 3 5 3 5 3 1 2 3 2 3 3 4 3 5 3 1 3 4 5 2 1 4 4 5 4 5 3 3 2 4 2 3 5 1 2 4 4 3 2 3 5 4 4 1 2 3 5 5 2 1 5 5 1 4 1 2 5 3 4 5 3 5 5 5 3 2 3 1 2 1 1 2 5 1 4 1 3 4 1 1 3 5 3 2 2 3 1 3 1 3 1 5 1 4 1 1 2 5 1 4 3 1 3 2 5 4 2 3 5 5 2 5 3 1 5 3 1...

output:

775392150
348537483
582219329
-127577546
425585760
728467574
165104304
518408232
502539721
778760422
992388425
418421399
386894042
817408872
792539958
-81781790
122234025
847594649
401157048
969738106
389344160
141215134
518408232
64579623
325974591
749520617
667891416
994593884
713071209
173627300
...

result:

wrong answer 1st lines differ - expected: '941207053', found: '775392150'