#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;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
512 KB |
Output is correct |
2 |
Correct |
6 ms |
640 KB |
Output is correct |
3 |
Correct |
6 ms |
512 KB |
Output is correct |
4 |
Correct |
5 ms |
512 KB |
Output is correct |
5 |
Correct |
6 ms |
512 KB |
Output is correct |
6 |
Correct |
5 ms |
512 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
512 KB |
Output is correct |
2 |
Incorrect |
6 ms |
512 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
324 ms |
16760 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
410 ms |
16760 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
312 ms |
16760 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |