QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#110921 | #3066. Intrinsic Interval | LitDarkness | WA | 3ms | 7856kb | C++14 | 2.3kb | 2023-06-04 19:53:58 | 2023-06-04 19:53:59 |
Judging History
answer
#include <bits/stdc++.h>
#define For(i, a, b) for (int i = a; i <= b; ++i)
#define Rep(i, a, b) for (int i = a; i >= b; --i)
using namespace std;
const int maxN = 1e5 + 5;
struct seg_tree {
int tg, val;
}T[maxN << 2];
int n, m;
int st1[maxN], tp1, st2[maxN], tp2, a[maxN];
int al[maxN], ar[maxN];
struct Query {
int l, r, id;
bool operator< (const Query &a) const { return l < a.l; }
bool operator== (const Query &a) const { return id == a.id; }
}qu[maxN];
inline void addt(int x, int v) { T[x].tg += v; T[x].val += v; }
inline void pd(int k) {
if (T[k].tg) {
addt(k << 1, T[k].tg); addt(k << 1|1, T[k].tg);
T[k].tg = 0;
}
}
void update(int x, int y, int v, int k = 1, int l = 1, int r = n) {
if (x <= l && r <= y) return addt(k, v);
pd(k);
int mid = l + r >> 1;
if (x <= mid) update(x, y, v, k << 1, l, mid);
if (y > mid) update(x, y, v, k << 1|1, mid + 1, r);
T[k].val = min(T[k << 1].val, T[k << 1|1].val);
}
int query(int x, int y, int k = 1, int l = 1, int r = n) {
if (x <= l && r <= y) return T[k].val;
pd(k);
int mid = l + r >> 1, s = n + 1;
if (x <= mid) s = min(s, query(x, y, k << 1, l, mid));
if (y > mid) s = min(s, query(x, y, k << 1|1, mid + 1, r));
return s;
}
inline int findp(int r) {
int l = 1, ans = -1, mid;
if (query(1, r)) return -1;
while (l <= r) {
mid = l + r >> 1;
if (query(mid, r) == 0) ans = mid, l = mid + 1;
else r = mid - 1;
}
return ans;
}
set<Query> S;
int main() {
scanf("%d", &n);
For (i, 1, n) scanf("%d", a + i);
scanf("%d", &m);
For (i, 1, m) {
scanf("%d%d", &qu[i].l, &qu[i].r); qu[i].id = i;
}
sort(qu + 1, qu + m + 1, [](Query a, Query b) { return a.r < b.r; });
int tp = 1;
For (i, 1, n) {
while (tp1 && a[st1[tp1]] > a[i]) {
update(st1[tp1 - 1] + 1, st1[tp1], -a[i] + a[st1[tp1]]);
--tp1;
}
st1[++tp1] = i;
while (tp2 && a[st2[tp2]] < a[i]) {
update(st2[tp2 - 1] + 1, st2[tp2], a[i] - a[st2[tp2]]);
--tp2;
}
st2[++tp2] = i;
if (i > 1) update(1, i - 1, -1);
while (tp <= m && qu[tp].r == i) S.emplace(qu[tp++]);
while (!S.empty()) {
auto v = *S.rbegin();
int u = findp(v.l);
if (u == -1) break;
if (v.id == 12) {
puts("NO");
}
al[v.id] = u; ar[v.id] = i;
S.erase(*S.rbegin());
}
}
if (tp <= m) puts("A");
For (i, 1, m) printf("%d %d\n", al[i], ar[i]);
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 7680kb
input:
7 3 1 7 5 6 4 2 3 3 6 7 7 1 3
output:
3 6 7 7 1 7
result:
ok 3 lines
Test #2:
score: 0
Accepted
time: 3ms
memory: 7856kb
input:
10 2 1 4 3 5 6 7 10 8 9 5 2 3 3 7 4 7 4 8 7 8
output:
1 4 3 7 3 7 3 10 7 10
result:
ok 5 lines
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 5728kb
input:
1000 998 996 997 1000 999 991 992 994 995 993 986 987 988 989 990 984 983 981 985 982 979 977 976 978 980 975 973 974 972 971 964 962 963 965 961 970 966 967 969 968 848 849 850 846 847 842 841 843 845 844 853 851 855 854 852 858 860 857 856 859 869 867 866 868 870 865 864 862 861 863 874 871 875 87...
output:
NO 1 3 2 3 1 5 4 5 1 10 6 7 7 10 8 9 8 10 6 15 11 12 12 13 13 14 14 15 11 20 16 17 16 20 16 20 16 20 16 25 21 24 22 23 22 24 21 25 21 26 26 28 27 28 27 29 29 30 30 40 31 33 32 33 31 34 31 35 31 40 36 40 37 38 38 40 39 40 31 200 41 42 42 43 41 45 44 45 44 50 46 47 46 48 48 50 49 50 41 55 51 55 51 55 ...
result:
wrong answer 1st lines differ - expected: '1 3', found: 'NO'