QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#586709 | #6837. AC Automaton | cyj888 | WA | 7ms | 51660kb | C++11 | 5.5kb | 2024-09-24 15:09:03 | 2024-09-24 15:09:03 |
Judging History
answer
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ott(i,l,r) for (int i = l; i <= r; i ++)
#define tto(i,l,r) for (int i = r; i >= l; i --)
using namespace std;
using ll = long long;
inline int read () {
int x = 0; bool f = 0; char c = getchar ();
while (!isdigit (c)) f |= (c == '-'), c = getchar ();
while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
if (f) x = -x; return x;
}
const int N = 3e5 + 110, inf = 0x3f3f3f3f;
int n, m, q, idx, B;
ll res;
vector <int> e[N], E[N];
int up[N], dn[N];
int dfn[N], dep[N], fa[N];
int lg[N << 1], f[N << 1][20];
char ch[N];
void dfs0 (int u) {
f[dfn[u] = ++ idx][0] = u, dep[u] = dep[fa[u]] + 1;
for (int v : e[u]) {
dfs0 (v);
f[++ idx][0] = u;
}
return ;
}
int lca (int x, int y) {
x = dfn[x], y = dfn[y];
if (x > y) swap (x, y);
int z = lg[y - x + 1], f1 = f[x][z], f2 = f[y - (1 << z) + 1][z];
return dep[f1] < dep[f2] ? f1 : f2;
}
struct OPT {
int x; char c;
} a[N];
struct BLOCK {
int ac, now, val, sum;//ac = 'A'count
vector <int> s; vector <pair <int, int> > t;
void ins (int v) {
if (v >= 0) ++ sum;
if (-m <= v && v <= m) s.pb (v);
return ;
}
void init () {
sort (s.begin (), s.end ());
t.pb ({-inf, 0});
if (s.size ())
ott (i, 0, s.size () - 1) {
int cnt = 1; while (s[i] == s[i + 1]) ++ i, ++ cnt;
t.pb ({s[i], cnt});
}
t.pb ({inf, 0}), now = t.size () - 1;
if (t.size ()) tto (i, 0, t.size () - 1) if (t[i].fi >= 0) now = i;
return ;
}
void upd (int i) {
if (ch[i] == 'A') ++ ac;
if (ch[i] == '?') ins (dn[i] - up[i]);
return ;
}
void add (int v) {
if (v == 1) {
if (now < t.size () && t[now].fi == val ++) sum -= t[now ++].se;
res -= 1ll * sum;
}
if (v == -1) {
res += 1ll * sum;
if (now && t[now - 1].fi == -- val) sum += t[-- now].se;
}
return ;
}
void clear () {
ac = now = val = sum = 0;
vector <int> ().swap (s), vector <pair <int, int> > ().swap (t);
return ;
}
} b[N];
int id[N], val[N], FA[N];
inline bool cmp (int x, int y) {
return dfn[x] < dfn[y];
}
void push (int u, int z) {
b[z].upd (u);
for (int v : e[u]) push (v, z);
return ;
}
int Z, OTH;
void find (int x) {
if (id[fa[x]]) {
val[Z = id[x] = ++ idx] = x;
return ;
}
find (fa[x]);
b[Z].upd (fa[x]);
for (int v : e[fa[x]]) {
if (v == x) continue;
if (!OTH) val[OTH = id[v] = ++ idx] = v;
push (v, OTH);
}
return ;
}
void red (int u) {
dn[u] = 0;
for (int v : e[u]) {
up[v] = up[u] + (ch[u] != 'C');
red (v);
dn[u] += dn[v] + (ch[v] != 'A');
}
if (ch[u] == 'A') res += 1ll * dn[u];
if (ch[u] == '?') res += 1ll * max (0, dn[u] - up[u]);
return ;
}
void cup (int u, int V) {
for (int v : E[u]) {
if (val[v] < 0) {
int tv = -val[v];
if (ch[tv] == '?') res -= 1ll * max (0, dn[tv] - up[tv]);
up[tv] += V;
if (ch[tv] == '?') res += 1ll * max (0, dn[tv] - up[tv]);
}
else {
b[v].add (V);
}
cup (v, V);
}
return ;
}
void cdn (int u, int V) {
if (!u) return ;
if (val[u] < 0) {
int tu = -val[u];
if (ch[tu] == '?') res -= 1ll * max (0, dn[tu] - up[tu]);
dn[tu] += V; if (ch[tu] == 'A') res += 1ll * V;
if (ch[tu] == '?') res += 1ll * max (0, dn[tu] - up[tu]);
}
else {
b[u].add (-V), res += 1ll * b[u].ac * V;
}
cdn (FA[u], V);
return ;
}
void sol () {
ott (i, 1, m) val[++ idx] = a[i].x;
sort (val + 1, val + 1 + idx), idx = unique (val + 1, val + 1 + idx) - val - 1;
sort (val + 1, val + 1 + idx, cmp);
ott (i, 2, idx) val[idx + i - 1] = lca (val[i - 1], val[i]); val[idx += idx] = 1;
sort (val + 1, val + 1 + idx), idx = unique (val + 1, val + 1 + idx) - val - 1;
ott (i, 1, idx) {
id[val[i]] = i;
val[i] = -val[i];//区分会修改的点
}
ott (i, 2, idx) {
if (val[i] > 0) break;
if (!id[fa[-val[i]]]) {
OTH = Z = 0, find (-val[i]);
if (OTH) E[FA[OTH] = i].pb (OTH);
E[FA[Z] = id[fa[val[Z]]]].pb (Z), E[FA[i] = Z].pb (i);
}
else E[FA[i] = id[fa[-val[i]]]].pb (i);
}
ott (i, 1, idx) {
if (val[i] > 0) break;
OTH = 0; for (int v : e[-val[i]]) {
if (id[v]) continue;
if (!OTH) {
val[OTH = id[v] = ++ idx] = v;
E[FA[OTH] = i].pb (OTH);
}
push (v, OTH);
}
}
ott (i, 1, idx) if (val[i] > 0) b[i].init ();
ott (i, 1, m) {
int x = a[i].x; char c = a[i].c;
if (ch[x] != 'C') cup (id[x], -1); if (ch[x] != 'A') cdn (FA[id[x]], -1);
if (ch[x] == 'A') res -= 1ll * dn[x];
if (ch[x] == '?') res -= 1ll * max (0, dn[x] - up[x]);
ch[x] = c;
if (ch[x] == 'A') res += 1ll * dn[x];
if (ch[x] == '?') res += 1ll * max (0, dn[x] - up[x]);
if (ch[x] != 'C') cup (id[x], 1); if (ch[x] != 'A') cdn (FA[id[x]], 1);
printf ("%lld\n", res);
}
ott (i, 1, idx) {
E[i].clear (), FA[i] = 0;
if (val[i] < 0) val[i] = -val[i];
else b[i].clear ();
id[val[i]] = 0, val[i] = 0;
}
m = idx = 0, res = 0; red (1);
return ;
}
int main () {
//freopen ("data.in", "r", stdin); freopen ("res.out", "w", stdout);
n = read (), q = read (), scanf ("%s", ch + 1); ott (i, 2, n) e[fa[i] = read ()].pb (i);
B = 1000; dfs0 (1);
ott (j, 1, 19) {
ott (i, 1, idx - (1 << j) + 1) {
int f1 = f[i][j - 1], f2 = f[i + (1 << j - 1)][j - 1];
f[i][j] = dep[f1] < dep[f2] ? f1 : f2;
}
}
lg[0] = -1; ott (i, 1, idx) lg[i] = lg[i >> 1] + 1;
idx = 0, red (1); ott (i, 1, q) {
int x = read (); char c = getchar ();
a[++ m] = {x, c};
if (i % B == 0 || i == q) sol ();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 7ms
memory: 49036kb
input:
5 3 AC??C 1 2 2 1 1 ? 4 A 2 ?
output:
4 3 3
result:
ok 3 lines
Test #2:
score: -100
Wrong Answer
time: 3ms
memory: 51660kb
input:
1000 1000 AC?ACCCCC?CCA??CCCCC?A?AC?C??C?ACCCACC?C?CCC?CACACA???????C?????CC?C?AAAAACCA??AAAACACACA???AACAC?CCC?CAC?AAAACCAC???ACAA??A??A?CA?A?ACACACCAA?ACACA?AC??AC??ACAAACCC??CAA?A???CC?AA??AC???A?CCCC??CACCAACC?AA?C?AAACCCA?AAA??C?CC??CACCACAACCA?AACCC?A?CCC?CC???AA?CACCCAAC??CAA??C?AA??CA???CAAA...
output:
2344 2345 2342 2342 2788 2788 2792 2792 2792 2792 2792 2792 2792 2787 2787 2787 2787 2784 2786 2786 2789 2785 2781 2784 2787 2792 2792 2792 2792 2792 2792 2797 2797 2797 2797 2799 2796 2799 2807 2803 2803 2797 2793 2797 2797 2797 2797 2797 2799 2799 2803 2806 2806 2804 2807 2809 2812 2807 2811 2813 ...
result:
wrong answer 5th lines differ - expected: '2768', found: '2788'