QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#457224#8836. Highway Hoaxucup-team3510#RE 14ms39196kbC++144.2kb2024-06-29 09:22:072024-06-29 09:22:08

Judging History

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

  • [2024-06-29 09:22:08]
  • 评测
  • 测评结果:RE
  • 用时:14ms
  • 内存:39196kb
  • [2024-06-29 09:22:07]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int N = 2e5 + 5, mod = 998244353;
int dp[N][3], g[N << 1], h[N << 1], n; // S count
char s[N];
vector< pair<int, int> > e[N]; // S -> F 0
int rev[1 << 20], omg[1 << 20];
int qpow(int x, int y)
{
	int ans = 1;
	while(y)
	{
		if(y & 1)
			ans = (ll)ans * x % mod;
		x = (ll)x * x % mod;
		y >>= 1;
	}
	return ans;
}
void prep(int n)
{
	int i, j, w;
	for(i = 0; i <= n; i++)
	{
		for(j = 1; j < (1 << i); j++)
			rev[(1 << i) + j] = rev[(1 << (i - 1)) + (j >> 1)] | ((j & 1) << (i - 1));
		omg[1 << i] = 1;
		w = qpow(3, (mod - 1) >> i);
		for(j = 1; j < (1 << i); j++)
			omg[(1 << i) + j] = (ll)omg[(1 << i) + j - 1] * w % mod;
	}
}
void ntt(int *A, int n, bool t)
{
	int i, j, k, w;
	for(i = 0; i < (1 << n); i++)
		if(i < rev[(1 << n) + i])
			swap(A[i], A[rev[(1 << n) + i]]);
	for(i = 0; i < n; i++)
		for(j = 0; j < (1 << n); j += (2 << i))
			for(k = 0; k < (1 << i); k++)
			{
				w = (ll)omg[(2 << i) + k] * A[(1 << i) + j + k] % mod;
				A[(1 << i) + j + k] = (A[j + k] + mod - w) % mod;
				A[j + k] = (A[j + k] + w) % mod;
			}
	if(t)
	{
		for(i = 1; i < (1 << n); i++)
			if(i < (1 << n) - i)
				swap(A[i], A[(1 << n) - i]);
		w = qpow(1 << n, mod - 2);
		for(i = 0; i < (1 << n); i++)
			A[i] = (ll)A[i] * w % mod;
	}
}
int X[1 << 20], Y[1 << 20];
struct poly
{
	vector<int> f;
	poly operator * (poly g)
	{
		int i, l = 0;
		while((f.size() + g.f.size()) >> l)
			l++;
		memset(X, 0, 4 << l);
		memset(Y, 0, 4 << l);
		for(i = 0; i < f.size(); i++)
			X[i] = f[i];
		for(i = 0; i < g.f.size(); i++)
			Y[i] = g.f[i];
		ntt(X, l, 0);
		ntt(Y, l, 0);
		for(i = 0; i < (1 << l); i++)
			X[i] = (ll)X[i] * Y[i] % mod;
		ntt(X, l, 1);
		poly h;
		h.f.resize(f.size() + g.f.size() - 1);
		for(i = 0; i < h.f.size(); i++)
			h.f[i] = X[i];
		// printf("F");
		// for(i = 0; i < f.size(); i++)
		// 	printf("%d ", f[i]);
		// printf("\n");
		// printf("G");
		// for(i = 0; i < g.f.size(); i++)
		// 	printf("%d ", g.f[i]);
		// printf("\n");
		// printf("H");
		// for(i = 0; i < h.f.size(); i++)
		// 	printf("%d ", h.f[i]);
		// printf("\n");
		return h;
	}
	int pos(int x)
	{
		return (x < 0 || x >= f.size()) ? 0 : f[x];
	}
};
poly pl[N << 1], ql[N];
void work(int p, int l, int r)
{
	int mid = (l + r) >> 1;
	if(l == r)
	{
		pl[p] = ql[l];
		return ;
	}
	work(p << 1, l, mid);
	work(p << 1 | 1, mid + 1, r);
	pl[p] = pl[p << 1] * pl[p << 1 | 1];
}
void dfs(int x, int f, int d)
{
	int y, c = 0, dt, i;
	for(auto p: e[x])
	{
		y = p.first;
		if(y != f)
			dfs(y, x, p.second);
	}
	// g[n - 1] = g[n] = g[n + 1] = 0;
	// if(s[x] == 'S')
	// 	g[n] = g[n - 1] = 1;
	// else
	// 	g[n] = g[n + 1] = 1;
	// for(auto p: e[x])
	// {
	// 	y = p.first;
	// 	if(y != f)
	// 	{
	// 		++c;
	// 		for(i = n - c; i <= n + c; i++)
	// 			h[i] = 0;
	// 		for(i = n - c + 1; i <= n + c - 1; i++)
	// 		{
	// 			h[i + 1] = (h[i + 1] + (ll)g[i] * dp[y][2]) % mod;
	// 			h[i] = (h[i] + (ll)g[i] * dp[y][1]) % mod;
	// 			h[i - 1] = (h[i - 1] + (ll)g[i] * dp[y][0]) % mod;
	// 		}
	// 		for(i = n - c; i <= n + c; i++)
	// 			g[i] = h[i];
	// 	}
	// }
	// dp[x][0] = g[n - 1];
	// dp[x][1] = g[n];
	// dp[x][2] = g[n + 1];
	// if(d)
	// 	dp[x][2] = 0;
	// else
	// 	dp[x][0] = 0;
	++c;
	dt = (s[x] == 'S');
	ql[c].f.clear();
	ql[c].f.emplace_back(1);
	ql[c].f.emplace_back(1);
	for(auto p: e[x])
	{
		y = p.first;
		if(y != f)
		{
			if(!dp[y][0])
			{
				++c;
				ql[c].f.clear();
				ql[c].f.emplace_back(dp[y][1]);
				ql[c].f.emplace_back(dp[y][2]);
			}
			else
			{
				++dt;
				++c;
				ql[c].f.clear();
				ql[c].f.emplace_back(dp[y][0]);
				ql[c].f.emplace_back(dp[y][1]);
			}
		}
	}
	work(1, 1, c);
	dp[x][0] = pl[1].pos(dt - 1);
	dp[x][1] = pl[1].pos(dt);
	dp[x][2] = pl[1].pos(dt + 1);
	if(d)
		dp[x][2] = 0;
	else
		dp[x][0] = 0;
}

int main()
{
	prep(19);
	int i, u, v;
	scanf("%d", &n);
	scanf("%s", s + 1);
	for(i = 1; i < n; i++)
	{
		scanf("%d%d", &u, &v);
		e[u].emplace_back(make_pair(v, 0));
		e[v].emplace_back(make_pair(u, 1));
	}
	dfs(1, 0, 0);
	printf("%d\n", dp[1][1]);
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 14ms
memory: 38688kb

input:

5
SFSFS
2 1
2 3
4 3
4 5

output:

1

result:

ok 1 number(s): "1"

Test #2:

score: 0
Accepted
time: 10ms
memory: 39196kb

input:

4
SFFF
1 2
1 3
1 4

output:

4

result:

ok 1 number(s): "4"

Test #3:

score: 0
Accepted
time: 3ms
memory: 38208kb

input:

7
SSSSFFF
1 2
3 2
4 3
4 5
4 6
2 7

output:

13

result:

ok 1 number(s): "13"

Test #4:

score: 0
Accepted
time: 7ms
memory: 38168kb

input:

2
FS
1 2

output:

1

result:

ok 1 number(s): "1"

Test #5:

score: 0
Accepted
time: 11ms
memory: 38396kb

input:

3
FFF
3 1
3 2

output:

1

result:

ok 1 number(s): "1"

Test #6:

score: 0
Accepted
time: 5ms
memory: 37252kb

input:

4
FFFF
1 2
4 2
2 3

output:

1

result:

ok 1 number(s): "1"

Test #7:

score: 0
Accepted
time: 7ms
memory: 37956kb

input:

5
FFFFF
4 2
2 1
3 1
3 5

output:

1

result:

ok 1 number(s): "1"

Test #8:

score: 0
Accepted
time: 7ms
memory: 38960kb

input:

6
FSSSSF
5 3
2 5
1 2
2 6
4 2

output:

3

result:

ok 1 number(s): "3"

Test #9:

score: -100
Runtime Error

input:

199995
FSSFFFSSSFSFFSSSFSSSSSFSFSSSFSFFSSFSFSFFFSSSFSSFSFFSFFFFSSFFSSSFFSFSFFFFFFFFFFFFFSSSFSSFFFSSSFSFSSSFFFSFFSFSSSSFSFSFSFSSFFSFSFFSFFSSFSSSFSFFSSSFFSFFFSFFSFSFSFSFSSSFSSSSFFSSFFFFFSFSSSFFSSSSSSSSFFFSFSFFSSSFSFFFFFSFFFFSSSSSSSFFFSFFSFSSSFSFSFFFFSFSSFSSFFFSSFFFSSFSFFFSSSFSFSSFFSFSFFSFFSSFSFSSSSFFF...

output:


result: