QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#688724 | #1268. Diamond Rush | wzj33300 | WA | 1386ms | 100528kb | C++14 | 7.5kb | 2024-10-30 13:04:29 | 2024-10-30 13:04:31 |
Judging History
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] = 1ll * 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;
}
详细
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: 1386ms
memory: 100528kb
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:
239637470 11653654 54202328 107138109 226789287 211745820 238088608 360544356 712558040 794834856 630227255 368804213 513218697 802408423 761110221 219929174 364779290 376033530 254082052 387771217 836973328 57827172 360544356 476053343 288201576 216871467 78828114 999721775 742082223 130801667 7585...
result:
wrong answer 1st lines differ - expected: '941207053', found: '239637470'