이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "plants.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 1e9;
int n, a[200200], b[200200], idxa[200200], idxb[200200];
struct Seg2{
pair<int, int> tree[800800];
int lazy[800800];
void init(int i, int l, int r){
lazy[i] = 0;
if (l==r) {tree[i] = {INF, l}; return;}
int m = (l+r)>>1;
init(i<<1, l, m); init(i<<1|1, m+1, r);
tree[i] = min(tree[i<<1], tree[i<<1|1]);
}
void propagate(int i, int l, int r){
tree[i].first += lazy[i];
if (l!=r) lazy[i<<1] += lazy[i], lazy[i<<1|1] += lazy[i];
lazy[i] = 0;
}
void update(int i, int l, int r, int s, int e, int x){
propagate(i, l, r);
if (r<s || e<l) return;
if (s<=l && r<=e){
lazy[i] += x;
propagate(i, l, r);
return;
}
int m = (l+r)>>1;
update(i<<1, l, m, s, e, x); update(i<<1|1, m+1, r, s, e, x);
tree[i] = min(tree[i<<1], tree[i<<1|1]);
}
void update2(int i, int l, int r, int s, int x){
propagate(i, l, r);
if (r<s || s<l) return;
if (l==r) {tree[i].second = x; return;}
int m = (l+r)>>1;
update2(i<<1, l, m, s, x); update2(i<<1|1, m+1, r, s, x);
tree[i] = min(tree[i<<1], tree[i<<1|1]);
}
void update(int l, int r, int x){
if (r<=n) update(1, 1, n, l, r, x);
else{
update(1, 1, n, l, n, x);
update(1, 1, n, 1, r-n, x);
}
}
}tree2;
struct Seg1{
int tree[800800], lazy[800800];
void init(int i, int l, int r, vector<int> &vec){
lazy[i] = 0;
if (l==r) {tree[i] = vec[l-1]; return;}
int m = (l+r)>>1;
init(i<<1, l, m, vec); init(i<<1|1, m+1, r, vec);
tree[i] = max(tree[i<<1], tree[i<<1|1]);
}
void propagate(int i, int l, int r){
tree[i] += lazy[i];
if (l!=r) lazy[i<<1] += lazy[i], lazy[i<<1|1] += lazy[i];
lazy[i] = 0;
}
void update(int i, int l, int r, int s, int e, int x){
propagate(i, l, r);
if (r<s || e<l) return;
if (s<=l && r<=e){
lazy[i] += x;
propagate(i, l, r);
return;
}
int m = (l+r)>>1;
update(i<<1, l, m, s, e, x); update(i<<1|1, m+1, r, s, e, x);
tree[i] = max(tree[i<<1], tree[i<<1|1]);
}
void find(int i, int l, int r, int x){
propagate(i, l, r);
if (tree[i]<x) return;
if (l==r){
assert(tree[i]==x);
//printf("YES: %d\n", l);
tree2.update(l, l, -INF);
tree2.update(l+1, l+x, 1);
update(1, 1, n, l, l, -INF);
return;
}
int m = (l+r)>>1;
find(i<<1, l, m, x); find(i<<1|1, m+1, r, x);
tree[i] = max(tree[i<<1], tree[i<<1|1]);
}
void update(int s, int e, int x){
if (s>0) update(1, 1, n, s, e, x);
else{
update(1, 1, n, s+n, n, x);
update(1, 1, n, 1, e, x);
}
}
}tree1;
vector<int> r;
int k, ans[303][303];
void init(int K, vector<int> R) {
k = K, r = R;
n = r.size();
tree1.init(1, 1, n, r);
tree2.init(1, 1, n);
tree2.update2(1, 1, n, 1, INF+1);
for (int i=1;i<=n;i++){
tree1.find(1, 1, n, k-1);
assert(tree2.tree[1].first==0);
a[i] = tree2.tree[1].second;
if (a[i]>=INF) a[i] -= INF;
//printf("a[%d] = %d\n", i, a[i]);
tree2.update(a[i], a[i], INF);
tree2.update(a[i]+1, a[i]+k-1, -1);
tree1.update(a[i]-k+1, a[i]-1, 1);
}
for (auto &x:R) x = (k-1) - x;
tree1.init(1, 1, n, R);
tree2.init(1, 1, n);
tree2.update2(1, 1, n, 1, INF+1);
for (int i=n;i;i--){
tree1.find(1, 1, n, k-1);
assert(tree2.tree[1].first==0);
b[i] = tree2.tree[1].second;
if (b[i]>=INF) b[i] -= INF;
//printf("a[%d] = %d\n", i, a[i]);
tree2.update(b[i], b[i], INF);
tree2.update(b[i]+1, b[i]+k-1, -1);
tree1.update(b[i]-k+1, b[i]-1, 1);
}
if (n<=300){
for (int z=1;z<=n;z++){
tree1.init(1, 1, n, r);
tree2.init(1, 1, n);
tree2.update2(1, 1, n, z, INF+z);
int pos = -1;
for (int i=1;i<=n;i++){
tree1.find(1, 1, n, k-1);
assert(tree2.tree[1].first==0);
b[i] = tree2.tree[1].second;
if (b[i]>=INF) b[i] -= INF, pos = i;
//printf("a[%d] = %d\n", i, a[i]);
tree2.update(b[i], b[i], INF);
tree2.update(b[i]+1, b[i]+k-1, -1);
tree1.update(b[i]-k+1, b[i]-1, 1);
}
for (int i=pos+1;i<=n;i++) ans[b[pos]][b[i]] = 1;
}
}
//printf("A: ");
//for (int i=1;i<=n;i++) printf("%d ", a[i]);
//printf("\n");
for (int i=1;i<=n;i++) idxa[a[i]] = i, idxb[b[i]] = i;
}
int compare_plants(int x, int y) {
++x, ++y;
if (n<=300){
if (ans[x][y]) return -1;
if (ans[y][x]) return 1;
return 0;
}
if (idxb[x]>idxb[y]) return 1;
if (idxa[x]<idxa[y]) return -1;
return 0;
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |