이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("fast-math")
//#pragma GCC optimize("no-stack-protector")
#define F first
#define S second
#define sz(x) ll(x.size())
#define pb push_back
#define N 100005
#define MOD ll(998244353)
using namespace std;
using namespace __gnu_pbds;
typedef long double ld;
typedef long long ll;
typedef short int si;
typedef tree <int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
ordered_set se;
set <pair <int, int> > ser, dob;
int mx[N], mn[N];
void upd(int x)
{
    while (sz(ser) > 0 && (*ser.begin()).F <= x)
    {
        se.erase((*ser.begin()).S);
        ser.erase(ser.begin());
    }
    while (sz(dob) > 0 && (*dob.begin()).F <= x)
    {
        se.insert((*dob.begin()).S);
        dob.erase(dob.begin());
    }
}
int main()
{
    //freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
    ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    ll n;
    cin >> n;
    int a[n][4];
    for (int i = 0; i < n; i++) {cin >> a[i][0]; if (a[i][0] == -1) a[i][0] = n; mx[i] = 1e9; mn[i] = 1e9;}
    for (int i = 0; i < n; i++) {cin >> a[i][1]; if (a[i][1] == -1) a[i][1] = n;}
    for (int i = 0; i < n; i++) {cin >> a[i][2]; if (a[i][2] == -1) a[i][2] = n;}
    for (int i = 0; i < n; i++) {cin >> a[i][3]; if (a[i][3] == -1) a[i][3] = n;}
    ll ans = 0;
    for (int i = 0; i < n; i++)
    {
        se.insert(i);
        ser.insert({a[i][2] + 1, i});
        dob.insert({max(a[i][2] + 1, int(n) - a[i][3] + 1), i});
        ans += a[i][2];
        ans += min(int(n) - a[i][2], a[i][3]);
    }
    for (int i = 0; i < n; i++)
    {
        upd(i + 1);
        int l = a[i][0], r = a[i][1];
        r = min(r, int(n) - l);
        ans += l - se.order_of_key(l);
        ans += r - (sz(se) - se.order_of_key(int(n) - r));
    }
    for (int i = 0; i < n; i++)
    {
        if (a[i][2] == n) continue;
        int x = a[i][2];
        ans++;
        mn[x] = min(mn[x], i);
        mx[x] = min(mx[x], int(n) - i - 1);
        if (a[i][2] + a[i][3] + 1 != n)
        {
            int x = n - a[i][3] - 1;
            ans++;
            mn[x] = min(mn[x], i);
            mx[x] = min(mx[x], int(n) - i - 1);
        }
    }
    for (int i = 0; i < n; i++)
    {
        if (a[i][0] == n) continue;
        if (mn[i] > a[i][0]) ans++;
        if (a[i][0] + a[i][1] + 1 != n)
        {
            if (mx[i] > a[i][1]) ans++;
        }
    }
    if (ans == n * n) cout << "DA" << endl;
      else cout << "NE" << endl;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |