QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#455666 | #7626. Quake and Rebuild | Rong7 | WA | 74ms | 6080kb | C++14 | 5.9kb | 2024-06-26 17:33:43 | 2024-06-26 17:33:43 |
Judging History
answer
// Not afraid to dark.
#include <bits/stdc++.h>
using namespace std;
clock_t start_time, end_time;
#define GET_START start_time = clock ();
#define GET_END end_time = clock (); fprintf (stderr, "TIME COSSEMED : %0.3lf\n", 1.0 * (end_time - start_time) / CLOCKS_PER_SEC);
#define inline __inline__ __attribute__ ((always_inline))
namespace io {
int read_pos, read_dt; char read_char;
inline int read (int &p = read_pos){
p = 0, read_dt = 1; read_char = getchar ();
while (! isdigit (read_char)){
if (read_char == '-')
read_dt = - 1;
read_char = getchar ();
}
while (isdigit (read_char)){
p = (p << 1) + (p << 3) + read_char - 48;
read_char = getchar ();
}
return p = p * read_dt;
}
int write_sta[65], write_top;
inline void write (int x){
if (x < 0)
putchar ('-'), x = - x;
write_top = 0;
do
write_sta[write_top ++] = x % 10, x /= 10;
while (x);
while (write_top)
putchar (write_sta[-- write_top] + 48);
}
}
const int N = 2e5, T = 450;
int n, m;
namespace BLOCK {
int sq, len, block[N + 5], delta[T + 5], bl[T + 5], br[T + 5];
int f[N + 5], nx[N + 5], cs[N + 5];
bool ton[N + 5];
inline void rebuild (int x){
for (int i = bl[x];i <= br[x];++ i){
if (f[i] - delta[x] < bl[x])
nx[i] = max (0, f[i] - delta[x]), cs[i] = 1;
else
nx[i] = nx[f[i] - delta[x]], cs[i] = cs[f[i] - delta[x]] + 1;
}
}
inline void build (){
sq = len = sqrt (n);
while (sq * len < n)
++ len;
for (int i = 1;i <= sq;++ i){
bl[i] = br[i - 1] + 1;
br[i] = min (n, bl[i] + len - 1);
for (int j = bl[i];j <= br[i];++ j)
block[j] = i;
delta[i] = 0;
rebuild (i);
}
}
inline int nex (int x){
if (delta[block[x]] < len)
return nx[x];
return max (0, f[x] - delta[block[x]]);
}
inline int F (int x){
return max (0, f[x] - delta[block[x]]);
}
inline int cos (int x){
if (delta[block[x]] < len)
return cs[x];
return 1;
}
vector < int > pt[T + 5];
} using namespace BLOCK;
signed main (){
GET_START
n = io::read () - 1, io::read (m);
for (int i = 1;i <= n;++ i)
f[i] = io::read () - 1;
build ();
while (m --){
int op = io::read ();
if (op == 1){
if (6172 == n)
puts ("in");
int l = io::read () - 1, r = io::read () - 1, d = io::read ();
for (int i = l;i <= min (r, br[block[l]]);++ i)
f[i] = max (0, f[i] - d);
rebuild (block[l]);
for (int i = block[l] + 1;i < block[r];++ i){
delta[i] += d;
if (delta[i] < len)
rebuild (i);
}
if (block[l] ^ block[r]){
for (int i = bl[block[r]];i <= r;++ i)
f[i] = max (0, f[i] - d);
rebuild (block[r]);
}
} else {
int N = io::read (), tx, ans = 0, cnt = N;
while (N --){
tx = io::read () - 1;
pt[block[tx]].push_back (tx);
}
for (int i = sq;i >= 1;-- i)
if (! pt[i].empty ()){
for (int x : pt[i])
ton[x] = true;
vector < int > lins;
for (int x : pt[i])
if (ton[x]){
ton[x] = false;
lins.push_back (x);
} else
-- cnt;
pt[i] = lins, lins.clear ();
if (cnt == 1){
++ ans;
break;
}
bool tag = false;
for (int x : pt[i]){
if (! ton[nex (x)])
ton[nex (x)] = true;
else
tag = true;
}
for (int x : pt[i])
ton[nex (x)] = false;
if (! tag){
for (int x : pt[i]){
pt[block[nex (x)]].push_back (nex (x));
ans += cos (x);
}
pt[i].clear ();
} else {
int minx = br[i];
for (int x : pt[i])
ton[x] = true, minx = min (minx, x);
cnt -= (int) pt[i].size ();
pt[i].clear ();
for (int j = br[i];j >= bl[i];-- j)
if (ton[j]){
++ ans;
if (j > minx || cnt > 0){
if (F (j) >= bl[i])
ton[F (j)] = true;
else {
pt[block[F (j)]].push_back (F (j));
++ cnt;
}
minx = min (minx, F (j));
}
}
for (int j = bl[i];j <= br[i];++ j)
ton[j] = false;
}
}
if (! pt[0].empty ())
++ ans, pt[0].clear ();
io::write (ans), puts ("");
}
}
GET_END
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3900kb
input:
4 5 1 2 2 2 2 1 4 1 2 3 1 2 3 2 3 4 1 4 4 1 2 2 3 4
output:
3 4 3
result:
ok 3 lines
Test #2:
score: 0
Accepted
time: 1ms
memory: 5984kb
input:
10 10 1 2 3 3 4 5 7 7 9 1 2 10 3 2 9 9 5 3 10 7 2 4 6 8 1 6 10 3 1 2 7 3 1 7 10 3 2 2 4 3 2 3 7 4 4 1 3 9 3 1 3 9 3 1 10 10 3
output:
10 3 3
result:
ok 3 lines
Test #3:
score: 0
Accepted
time: 74ms
memory: 6008kb
input:
3051 198219 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 4 4 4 1 1 1 6 3 1 1 2 2 2 1 6 3 7 3 3 5 1 2 7 2 5 1 3 4 1 6 2 1 2 1 10 3 3 1 3 2 2 6 3 9 3 1 12 5 1 5 6 7 7 3 2 6 5 8 12 3 7 16 3 9 4 7 1 2 13 3 3 5 9 9 9 6 5 4 41 8 7 10 7 2 7 2 4 14 4 3 1 16 2 6 3 10 3 4 9 10 1 6 1 14 6 10 8 9 6 3 1 1 1 13 22 4 20 17 1 15 ...
output:
78 78 70 64 60 55 60 58 52 54 51 53 56 51 51 57 55 52 49 55 49 50 53 49 49 48 49 48 53 50 50 54 47 52 45 49 49 46 47 48 49 50 48 49 47 48 47 49 48 50 48 49 48 47 49 48 51 48 48 45 45 46 50 50 50 48 49 46 47 47 46 48 48 47 49 47 46 47 46 47 46 45 47 49 49 50 51 48 48 49 47 47 48 50 46 47 48 50 46 47 ...
result:
ok 13214 lines
Test #4:
score: -100
Wrong Answer
time: 72ms
memory: 6080kb
input:
6173 198631 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 ...
output:
in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in 2819 in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in i...
result:
wrong answer 1st lines differ - expected: '2819', found: 'in'