QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#586709#6837. AC Automatoncyj888WA 7ms51660kbC++115.5kb2024-09-24 15:09:032024-09-24 15:09:03

Judging History

你现在查看的是最新测评结果

  • [2024-09-24 15:09:03]
  • 评测
  • 测评结果:WA
  • 用时:7ms
  • 内存:51660kb
  • [2024-09-24 15:09:03]
  • 提交

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'