QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#455634 | #7626. Quake and Rebuild | Rong7 | WA | 1ms | 6120kb | C++14 | 6.4kb | 2024-06-26 16:58:24 | 2024-06-26 16:58:25 |
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;
#define asrt(x, y) {if (x == false) puts (y), exit (0);}
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){
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]){
if (x < bl[i] || x > br[i]){
printf ("%d %d %d (%d %d)\n", x, block[x], i, bl[i], br[i]);
}
asrt (x >= bl[i] && x <= br[i], "false : x >= bl[i] && x <= br[i]");
ton[x] = true;
}
vector < int > lins;
for (int x : pt[i])
if (ton[x]){
ton[x] = false;
lins.push_back (x);
} else
-- cnt;
asrt (cnt != 0, "false : cnt != 0");
pt[i] = lins, lins.clear ();
if (cnt == 1){
++ ans;
break;
}
bool tag = false;
for (int x : pt[i]){
asrt (nex (x) <= bl[i] && nex (x) >= 0, "nex (x) <= bl[i] && nex (x) >= 0");
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 (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){
asrt (F (j) >= 0, "F(j) >= 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: 3944kb
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: 6120kb
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: -100
Wrong Answer
time: 0ms
memory: 6120kb
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:
2495 45 9 (449 504) false : x >= bl[i] && x <= br[i]
result:
wrong answer 1st lines differ - expected: '78', found: '2495 45 9 (449 504)'