QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#554180 | #9242. An Easy Geometry Problem | ucup-team4757 | WA | 92ms | 9980kb | C++14 | 4.1kb | 2024-09-09 08:14:37 | 2024-09-09 08:14:37 |
Judging History
answer
#include <bits/stdc++.h>
const int MAXN = 100005;
const int32_t base = 31;
int32_t n, q, k, b;
int32_t a[MAXN], c[MAXN], d[MAXN];
uint64_t p[MAXN], w[MAXN];
namespace Segtree1 {
struct node {
int32_t len;
uint64_t hsh;
inline node operator + (const node & a) const {
return {len + a.len, hsh * w[a.len] + a.hsh};
}
} T[MAXN << 2];
#define LC (x << 1)
#define RC (x << 1 | 1)
#define m ((l + r) >> 1)
inline void Build (const int32_t l = 1, const int32_t r = n, const int32_t x = 1) {
T[x].len = r - l + 1;
if (l == r) return T[x].hsh = c[l], void ();
Build (l, m, LC), Build (m + 1, r, RC), T[x] = T[LC] + T[RC];
}
inline void Modify (const int32_t p, const int32_t val, const int32_t l = 1, const int32_t r = n, const int32_t x = 1) {
if (l == r) return T[x].hsh += val, void ();
p <= m ? Modify (p, val, l, m, LC) : Modify (p, val, m + 1, r, RC); T[x] = T[LC] + T[RC];
}
inline node Sum (const int32_t L, const int32_t R, const int32_t l = 1, const int32_t r = n, const int32_t x = 1) {
// std::cerr << L << ' ' << R << ' ' << l << ' ' << r << ' ' << T[x].hsh << '\n';
if (L <= l && r <= R) return T[x];
if (L <= m && R > m) return Sum (L, R, l, m, LC) + Sum (L, R, m + 1, r, RC);
if (L <= m) return Sum (L, R, l, m, LC);
if (R > m) return Sum (L, R, m + 1, r, RC);
return (node) {0, 0};
}
}
namespace Segtree2 {
struct node {
int32_t len;
uint64_t hsh;
inline node operator + (const node & a) const {
return {len + a.len, a.hsh * w[len] + hsh};
}
} T[MAXN << 2];
#define LC (x << 1)
#define RC (x << 1 | 1)
#define m ((l + r) >> 1)
inline void Build (const int32_t l = 1, const int32_t r = n, const int32_t x = 1) {
T[x].len = r - l + 1;
if (l == r) return T[x].hsh = d[l], void ();
Build (l, m, LC), Build (m + 1, r, RC), T[x] = T[LC] + T[RC];
}
inline void Modify (const int32_t p, const int32_t val, const int32_t l = 1, const int32_t r = n, const int32_t x = 1) {
if (l == r) return T[x].hsh += val, void ();
p <= m ? Modify (p, val, l, m, LC) : Modify (p, val, m + 1, r, RC); T[x] = T[LC] + T[RC];
}
inline node Sum (const int32_t L, const int32_t R, const int32_t l = 1, const int32_t r = n, const int32_t x = 1) {
if (L <= l && r <= R) return T[x];
if (L <= m && R > m) return Sum (L, R, l, m, LC) + Sum (L, R, m + 1, r, RC);
if (L <= m) return Sum (L, R, l, m, LC);
if (R > m) return Sum (L, R, m + 1, r, RC);
return {0, 0};
}
}
int32_t opt, l, r, x, val, ans;
int main () {
std::ios::sync_with_stdio (0);
std::cin.tie (0), std::cout.tie (0);
std::cin >> n >> q >> k >> b, w[0] = 1;
for (int i = 1; i <= n; ++ i)
std::cin >> a[i];
for (int i = 1; i <= n; ++ i)
c[i] = a[i] - a[i - 1], d[i] = a[i] - a[i + 1];
for (int i = 1; i <= n; ++ i)
w[i] = w[i - 1] * base;
p[1] = k + b;
for (int i = 2; i <= n; ++ i)
p[i] = p[i - 1] * base + k;
Segtree1::Build (1, n), Segtree2::Build (1, n);
for (int i = 1; i <= q; ++ i) {
std::cin >> opt;
if (opt == 1) std::cin >> l >> r >> val;
if (opt == 2) std::cin >> x;
if (opt == 1) {
c[l] += val, c[r + 1] -= val;
d[l - 1] -= val, d[r] += val;
Segtree1::Modify (l, + val), Segtree1::Modify (r + 1, - val);
Segtree2::Modify (l - 1, - val), Segtree2::Modify (r, + val);
} else {
l = 1, r = std::min (x, n - x), ans = 0;
// std::cerr << p[3] << ' ' << Segtree1::Sum (x + 1, x + 3).hsh << '\n';
if (c[x] - d[x] != k + b) {
std::cout << ans << '\n';
continue ;
}
if (l == r)
ans = (Segtree1::Sum (x + 1, x + l).hsh - Segtree2::Sum (x - l, x - 1).hsh == p[m]) * l;
// r = 0;
while (l <= r) {
std::cerr << i << ' ' << l << ' ' << r << ' ' << m << ' ' << Segtree1::Sum (x + 1, x + m).hsh - Segtree2::Sum (x - m, x - 1).hsh << ' ' << p[m] << '\n';
if (Segtree1::Sum (x + 1, x + m).hsh - Segtree2::Sum (x - m, x - 1).hsh == p[m]) ans = m, l = m + 1;
else r = m - 1;
}
std::cout << ans << '\n';
// std::cerr << now << ' ' << p[1] << '\n';
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 9712kb
input:
6 6 6 2 1 5 9 10 15 18 2 2 1 3 3 -3 2 2 1 3 4 3 2 3 2 4
output:
1 0 2 0
result:
ok 4 number(s): "1 0 2 0"
Test #2:
score: 0
Accepted
time: 71ms
memory: 8104kb
input:
5000 5000 2 0 -329 -328 -327 -326 -325 -324 -323 -322 -321 -320 -319 -318 -317 -316 -315 -314 -313 -312 -311 -310 -309 -308 -307 -306 -305 -304 -303 -302 -301 -300 -299 -298 -297 -296 -295 -294 -293 -292 -291 -290 -289 -288 -287 -286 -285 -284 -283 -282 -281 -280 -279 -278 -277 -276 -275 -274 -273 -...
output:
2 304 73 29 61 292 139 48 17 99 6 5 53 93 3 91 65 29 33 306 21 24 17 21 281 12 16 1 33 7 18 96 7 40 39 13 7 46 43 16 1 72 33 16 22 5 6 189 27 1 35 107 43 34 3 27 20 21 44 56 96 36 2 27 22 30 32 6 5 105 27 37 12 58 2 21 154 17 110 57 3 7 33 15 24 94 68 25 1 14 10 4 10 2 25 39 36 33 164 11 19 181 11 3...
result:
ok 3337 numbers
Test #3:
score: 0
Accepted
time: 92ms
memory: 9980kb
input:
5000 5000 2 0 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 86...
output:
362 82 14 234 140 5 44 136 22 43 29 96 59 23 25 61 193 22 39 39 23 53 48 76 100 58 120 24 12 106 32 48 73 63 116 16 136 10 28 15 84 30 65 1 54 15 16 70 1 95 74 14 17 20 36 254 22 29 70 172 106 2 25 8 98 35 169 16 2 2 99 10 36 40 3 69 272 170 219 12 79 26 78 100 10 167 140 70 34 17 23 21 55 10 6 17 6...
result:
ok 3313 numbers
Test #4:
score: -100
Wrong Answer
time: 91ms
memory: 7992kb
input:
5000 5000 2 0 -456 -455 -454 -453 -452 -451 -450 -449 -448 -447 -446 -445 -444 -443 -442 -441 -440 -439 -438 -437 -436 -435 -434 -433 -432 -431 -430 -429 -428 -427 -426 -425 -424 -423 -422 -421 -420 -419 -418 -417 -416 -415 -414 -413 -412 -411 -410 -409 -408 -407 -406 -405 -404 -403 -402 -401 -400 -...
output:
8 75 80 408 385 73 37 402 338 43 11 163 3 7 80 0 339 47 384 8 10 47 162 307 30 28 36 14 27 126 271 151 4 11 11 9 92 154 2 15 28 160 205 12 59 79 114 23 22 141 7 12 31 42 120 0 34 2 167 157 76 32 20 298 47 104 76 33 49 34 1 40 16 1 28 7 4 55 14 8 68 17 7 117 1 14 14 80 44 8 45 49 65 15 49 56 50 40 14...
result:
wrong answer 2452nd numbers differ - expected: '6', found: '7'