QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#775090 | #9788. Shreckless | ucup-team133# | WA | 39ms | 3760kb | C++23 | 6.0kb | 2024-11-23 14:41:40 | 2024-11-23 14:41:41 |
Judging History
answer
#include <bits/stdc++.h>
#ifdef LOCAL
#include <debug.hpp>
#else
#define debug(...) void(0)
#endif
template <class T> std::istream& operator>>(std::istream& is, std::vector<T>& v) {
for (auto& e : v) {
is >> e;
}
return is;
}
template <class T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
for (std::string_view sep = ""; const auto& e : v) {
os << std::exchange(sep, " ") << e;
}
return os;
}
template <class T, class U = T> bool chmin(T& x, U&& y) {
return y < x and (x = std::forward<U>(y), true);
}
template <class T, class U = T> bool chmax(T& x, U&& y) {
return x < y and (x = std::forward<U>(y), true);
}
template <class T> void mkuni(std::vector<T>& v) {
std::ranges::sort(v);
auto result = std::ranges::unique(v);
v.erase(result.begin(), result.end());
}
template <class T> int lwb(const std::vector<T>& v, const T& x) {
return std::distance(v.begin(), std::ranges::lower_bound(v, x));
}
#ifdef _MSC_VER
#include <intrin.h>
#endif
namespace atcoder {
namespace internal {
// @param n `0 <= n`
// @return minimum non-negative `x` s.t. `n <= 2**x`
int ceil_pow2(int n) {
int x = 0;
while ((1U << x) < (unsigned int)(n)) x++;
return x;
}
// @param n `1 <= n`
// @return minimum non-negative `x` s.t. `(n & (1 << x)) != 0`
constexpr int bsf_constexpr(unsigned int n) {
int x = 0;
while (!(n & (1 << x))) x++;
return x;
}
// @param n `1 <= n`
// @return minimum non-negative `x` s.t. `(n & (1 << x)) != 0`
int bsf(unsigned int n) {
#ifdef _MSC_VER
unsigned long index;
_BitScanForward(&index, n);
return index;
#else
return __builtin_ctz(n);
#endif
}
} // namespace internal
} // namespace atcoder
namespace atcoder {
template <class S, S (*op)(S, S), S (*e)()> struct segtree {
public:
segtree() : segtree(0) {}
explicit segtree(int n) : segtree(std::vector<S>(n, e())) {}
explicit segtree(const std::vector<S>& v) : _n(int(v.size())) {
log = internal::ceil_pow2(_n);
size = 1 << log;
d = std::vector<S>(2 * size, e());
for (int i = 0; i < _n; i++) d[size + i] = v[i];
for (int i = size - 1; i >= 1; i--) {
update(i);
}
}
void set(int p, S x) {
assert(0 <= p && p < _n);
p += size;
d[p] = x;
for (int i = 1; i <= log; i++) update(p >> i);
}
S get(int p) const {
assert(0 <= p && p < _n);
return d[p + size];
}
S prod(int l, int r) const {
assert(0 <= l && l <= r && r <= _n);
S sml = e(), smr = e();
l += size;
r += size;
while (l < r) {
if (l & 1) sml = op(sml, d[l++]);
if (r & 1) smr = op(d[--r], smr);
l >>= 1;
r >>= 1;
}
return op(sml, smr);
}
S all_prod() const { return d[1]; }
template <bool (*f)(S)> int max_right(int l) const {
return max_right(l, [](S x) { return f(x); });
}
template <class F> int max_right(int l, F f) const {
assert(0 <= l && l <= _n);
assert(f(e()));
if (l == _n) return _n;
l += size;
S sm = e();
do {
while (l % 2 == 0) l >>= 1;
if (!f(op(sm, d[l]))) {
while (l < size) {
l = (2 * l);
if (f(op(sm, d[l]))) {
sm = op(sm, d[l]);
l++;
}
}
return l - size;
}
sm = op(sm, d[l]);
l++;
} while ((l & -l) != l);
return _n;
}
template <bool (*f)(S)> int min_left(int r) const {
return min_left(r, [](S x) { return f(x); });
}
template <class F> int min_left(int r, F f) const {
assert(0 <= r && r <= _n);
assert(f(e()));
if (r == 0) return 0;
r += size;
S sm = e();
do {
r--;
while (r > 1 && (r % 2)) r >>= 1;
if (!f(op(d[r], sm))) {
while (r < size) {
r = (2 * r + 1);
if (f(op(d[r], sm))) {
sm = op(d[r], sm);
r--;
}
}
return r + 1 - size;
}
sm = op(d[r], sm);
} while ((r & -r) != r);
return 0;
}
private:
int _n, size, log;
std::vector<S> d;
void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
};
} // namespace atcoder
using namespace std;
using ll = long long;
struct S {
int val, idx;
S(int val, int idx) : val(val), idx(idx) {}
};
S op(S l, S r) { return l.val >= r.val ? l : r; }
S e() { return S(-1, -1); }
void solve() {
int n, m;
cin >> n >> m;
vector a(n, vector<int>(m));
cin >> a;
map<int, vector<pair<int, int>>> mp;
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
mp[a[i][j]].emplace_back(j, i);
}
}
int cur = 0;
for (auto [key, v] : mp) {
ranges::sort(v);
for (auto [y, x] : v) a[x][y] = cur++;
}
atcoder::segtree<S, op, e> seg(n * m);
set<int> rest;
int match = 0;
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
int x = a[i][j];
if (rest.upper_bound(x) != rest.end()) {
match++;
int y = *rest.upper_bound(x);
rest.erase(y);
seg.set(x, S(y, x));
} else {
auto prod = seg.prod(x + 1, n * m);
if (prod.val <= x) {
rest.emplace(x);
continue;
}
seg.set(x, S(prod.idx, x));
seg.set(prod.idx, e());
rest.emplace(prod.val);
}
}
}
cout << (match >= n ? "YES" : "NO") << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(15);
int t;
cin >> t;
for (; t--;) solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3624kb
input:
3 2 2 69 69 2024 42 3 3 1 1 1 1 1 1 2 2 2 3 4 1 1 1 1 1 1 1 1 2 2 2 2
output:
YES NO YES
result:
ok 3 token(s): yes count is 2, no count is 1
Test #2:
score: 0
Accepted
time: 1ms
memory: 3760kb
input:
3 2 2 69 69 2024 42 3 3 1 1 1 1 1 1 2 2 2 3 4 1 1 1 1 1 1 1 1 2 2 2 2
output:
YES NO YES
result:
ok 3 token(s): yes count is 2, no count is 1
Test #3:
score: -100
Wrong Answer
time: 39ms
memory: 3616kb
input:
20000 6 2 12 4 8 24 2 10 1 22 3 15 18 20 3 3 3 8 18 2 17 15 13 4 6 3 3 7 17 15 8 6 3 18 13 9 3 3 2 3 14 1 7 17 4 6 13 3 3 6 10 14 3 9 13 1 7 15 2 4 1 3 16 14 6 10 4 2 3 3 3 2 17 7 11 13 16 5 18 2 3 2 3 6 4 1 5 2 4 4 6 13 14 2 11 12 16 3 3 2 8 12 4 9 17 5 7 18 3 2 5 10 8 9 1 6 2 2 2 4 1 3 2 3 12 6 1 ...
output:
NO YES YES YES YES YES YES YES YES NO YES YES YES YES YES YES NO YES YES NO YES YES YES YES YES YES YES YES YES YES YES YES YES YES NO YES YES YES YES YES YES YES YES YES YES YES YES YES YES YES NO YES YES YES YES YES YES NO YES YES NO NO YES YES YES YES YES YES YES YES NO YES YES NO YES YES NO YES ...
result:
wrong answer expected NO, found YES [4th token]