QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#463206#5017. 相等树链ningago0 459ms66292kbC++147.6kb2024-07-04 15:32:142024-07-04 15:32:14

Judging History

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

  • [2024-07-04 15:32:14]
  • 评测
  • 测评结果:0
  • 用时:459ms
  • 内存:66292kb
  • [2024-07-04 15:32:14]
  • 提交

answer

#include <cstdio>
#include <cstring>
#include <numeric>
#include <algorithm>
#include <cctype>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <cmath>

namespace uvu
{
// #define LOCAL ________________DONT_DEFINE_ME_______________
#define ll long long
#define inf 0x3f3f3f3f
// #define int long long
// #define inf 0x3f3f3f3f3f3f3f3fll
#define infll 0x3f3f3f3f3f3f3f3fll
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define gline debug("now is #%d\n", __LINE__)
#define pii std::pair <int, int>
#define mkp std::make_pair
#define fi first
#define se second
char _ST_;
const int BUFSIZE = (1 << 20);
char ibuf[BUFSIZE], *iS = ibuf, *iT = ibuf;
char obuf[BUFSIZE], *oS = obuf, *oT = obuf + BUFSIZE;
char getc()
{
#ifdef LOCAL
	return getchar();
#else
	if(iS == iT) iT = (iS = ibuf) + fread(ibuf, 1, BUFSIZE, stdin);
	return (iS == iT) ? EOF : *iS++;
#endif
#define getchar ERR
}
void Flush() { fwrite(obuf, 1, oS - obuf, stdout); oS = obuf; }
struct Flusher { ~Flusher() { Flush(); } }iamflusher;
void putc(char c)
{
#ifdef LOCAL
	putchar(c);
#else
	*oS++ = c;
	if(oS == oT) Flush();
#endif
}
template <typename T = int> T read()
{
	T x = 0, f = 1; char c = getc();
	for(; !isdigit(c); c = getc()) if(c == '-') f = -1;
	for(;  isdigit(c); c = getc()) x = (x << 3) + (x << 1) + (c ^ 48);
	return x * f;
}
template <typename T> void print(T x, char c)
{
static int sta[BUFSIZE], top;
	top = 0;
	if(x < 0) putc('-'), x *= -1;
	if(!x) sta[++top] = 0;
	for(; x; x /= 10) sta[++top] = x % 10;
	for(; top; putc(sta[top--] ^ 48));
	if(c) putc(c);
}
int readstr(char *s, int base)
{
	int idx = base - 1; char c = getc();
	for(; !(isdigit(c) || isalpha(c) || c == '#' || c == '.'); c = getc());
	for(;   isdigit(c) || isalpha(c) || c == '#' || c == '.' ; c = getc()) s[++idx] = c;
	return idx - base + 1;
}
void printf(const char *s) { for(; *s; s++) putc(*s); }
template <typename T, typename ... Args >
void printf(const char *s, T x, Args ... rest)
{
	for(; *s; s++)
	{
		if(*s != '%') { putc(*s); continue; }
		s++; if(*s == 'd') print(x, 0);
		else if(*s == 'c') putc(x);
		printf(s + 1, rest ...);
		return;
	}
}
template <typename T> void ckmin(T &x, T y) { x = x < y ? x : y; }
template <typename T> void ckmax(T &x, T y) { x = x > y ? x : y; }
#define mod 998244353
// #define mod 1000000007
int sm(int x) { return x >= mod ? x - mod : x; }
void plus_(int &x, int y) { x = sm(x + y); }
void mul_(int &x, int y) { x = 1ll * x * y % mod; }
int ksm(int a, int b) { int res = 1; for(; b; b >>= 1, mul_(a, a)) if(b & 1) mul_(res, a); return res; }
#define N 200010
int n;
#define ull unsigned long long
ull val[N];
ull sd = ('x' + 'i' + 'n' + 'y' + 'u' + 'e');
ull rnd()
{
	sd ^= sd << 13;
	sd ^= sd >> 7;
	sd ^= sd << 11;
	return sd;
}
bool vis[N];
struct tree
{
	std::vector <int> vec[N];
	void add(int x, int y) { vec[x].push_back(y), vec[y].push_back(x); }
	int top[N], dfn[N], fdfn[N], dep[N], fa[N], sz[N], hson[N];
	ull dis[N];
	void dfs0(int k, int f) 
	{
		sz[k] = 1; fa[k] = f; dep[k] = dep[f] + 1; dis[k] = dis[f] ^ val[k];
		for(int nx : vec[k]) if(nx != f) { dfs0(nx, k); sz[k] += sz[nx]; if(sz[nx] >= sz[hson[k]]) hson[k] = nx; }
	}
	void dfs1(int k, int tp)
	{
		top[k] = tp; fdfn[dfn[k] = ++dfn[0]] = k;
		if(hson[k]) dfs1(hson[k], tp);
		for(int nx : vec[k]) if(nx != fa[k] && nx != hson[k]) dfs1(nx, nx);
	}
	int LCA(int x, int y) 
	{ 
		for(; top[x] != top[y]; x = fa[top[x]]) if(dep[top[x]] < dep[top[y]]) x ^= y ^= x ^= y;
		return dep[x] < dep[y] ? x : y; 
	}
	void init() { for(int i = 2; i <= n; i++) add(read(), i); dfs0(1, 0); dfs1(1, 1); }
	int full, minnum, root;
	void getroot(int k, int fa)
	{
		int maxnum = 0; sz[k] = 1;
		for(int nx : vec[k]) if(nx != fa && !vis[nx]) { getroot(nx, k); sz[k] += sz[nx]; ckmax(maxnum, sz[nx]); }
		ckmax(maxnum, full - sz[k]); if(maxnum <= minnum) minnum = maxnum, root = k;
	}
	void Getroot(int k, int Full) { full = Full, minnum = inf, root = 0; getroot(k, 0); }
}T1, T2;
ll ans;
bool insta[N];
int sta[N << 1], top, from[N];
ull disA[N], disB[N]; int dep[N];
void dfs2(int k, int fa, int tp)
{
	disA[k] = disA[fa] ^ val[k];  dep[k] = dep[fa] + 1;
	from[k] = tp; sta[++top] = k; T1.sz[k] = 1;
	for(int nx : T1.vec[k]) if(!vis[nx] && nx != fa) dfs2(nx, k, tp), T1.sz[k] += T1.sz[nx];
}
std::map <ull, int> mpA, mpB, mpC;
std::map <std::pair <ull, int>, int> mpf;
void dfs3(int k, int fa, int f1, int p, int f2, int q)
{
	disB[k] = disB[fa] ^ val[k];
	if(f2 && from[k] != f1 && from[k] != f2) return;
	if(from[k] == f1 && dep[k] == dep[p]) return; 
	if(from[k] == f1 && dep[k] > dep[p]) p = k;
	if(from[k] == f2 && dep[k] == dep[q]) return;
	if(from[k] == f2 && dep[k] > dep[q]) q = k;
	if(!f1) f1 = from[k], p = k;
	if(!f2 && from[k] != f1) f2 = from[k], q = k;
	// printf("k = %d (%d %d %d %d)\n", k, f1, p, f2, q);

	// if(!f2 && disB[k] == disA[p]) ans++;//, printf("ans++ (A)\n");
	// if(f2 && disB[k] == (disA[p] ^ disA[q])) ans++;//, printf("ans++ (B)\n");
	// if(!f2) ans += mpA[disB[k] ^ disA[p]], ans += mpB[disB[k]];//, printf("ans += %d (C)\n", mpB[disB[k]]);
	// if(f2)  ans += mpA[disB[k] ^ disA[p] ^ disA[q]];//, printf("ans += %d (D)\n", mpA[disB[k] ^ disA[p] ^ disA[q]]);
	// ans += mpB[disB[k] ^ disA[p]] - mpf[mkp(disB[k] ^ disA[p], f1)];//, printf("ans += %d - %d (E)\n", mpB[disB[k] ^ disA[p]], mpf[mkp(disB[k] ^ disA[p], f1)]);
	// if(f2)  ans += mpB[disB[k] ^ disA[q]] - mpf[mkp(disB[k] ^ disA[q], f2)];//, printf("ans += %d - %d (F)\n", mpB[disB[k] ^ disA[q]], mpf[mkp(disB[k] ^ disA[q], f2)]);
	// ans += mpC[disB[k]];//, printf("ans += %d (G)\n", mpC[disB[k]]);

	for(int nx : T2.vec[k]) if(insta[nx] && !vis[nx] && nx != fa) dfs3(nx, k, f1, p, f2, q); 
}
void dfs4(int k, int fa, int f1, int p, int f2, int q)
{
	disB[k] = disB[fa] ^ val[k];
	if(f2 && from[k] != f1 && from[k] != f2) return;
	if(from[k] == f1 && dep[k] == dep[p]) return; 
	if(from[k] == f1 && dep[k] > dep[p]) p = k;
	if(from[k] == f2 && dep[k] == dep[q]) return;
	if(from[k] == f2 && dep[k] > dep[q]) q = k;
	if(!f1) f1 = from[k], p = k;
	if(!f2 && from[k] != f1) f2 = from[k], q = k;

	// mpA[disB[k]]++;
	//        mpB[disB[k] ^ disA[p]]++, mpf[mkp(disB[k] ^ disA[p], f1)]++;
	// if(f2) mpB[disB[k] ^ disA[q]]++, mpf[mkp(disB[k] ^ disA[q], f2)]++;
	// if(f2) mpC[disB[k] ^ disA[p] ^ disA[q]]++;

	for(int nx : T2.vec[k]) if(insta[nx] && !vis[nx] && nx != fa) dfs4(nx, k, f1, p, f2, q); 
}
int cnt;
void calc(int k)
{
	ans++; mpA.clear(), mpB.clear(), mpC.clear(), mpf.clear();
	top = 0; disA[k] = 0; dep[k] = 0; for(int nx : T1.vec[k]) if(!vis[nx]) dfs2(nx, k, nx);
	// debug("top = %d\n", top);
	if(!top) return;
	cnt += top;
	// printf("k = %d, sta : ", k); for(int i = 1; i <= top; i++) printf("%d(%d) ", sta[i], from[sta[i]]); putc('\n');
	for(int i = 1; i <= top; i++) insta[sta[i]] = 1;
	disB[k] = 0; 
	for(int nx : T2.vec[k]) if(insta[nx] && !vis[nx]) dfs3(nx, k, 0, 0, 0, 0), dfs4(nx, k, 0, 0, 0, 0);
	for(int i = 1; i <= top; i++) insta[sta[i]] = 0;
}
void sv(int k, int dep)
{
	// debug("k = %d, dep = %d ", k, dep);
	vis[k] = 1; calc(k);
	for(int nx : T1.vec[k]) if(!vis[nx]) T1.Getroot(nx, T1.sz[nx]), sv(T1.root, dep + 1);
}
void solve()
{
	n = read(); for(int i = 1; i <= n; i++) val[i] = rnd();
	T1.init(), T2.init();
	T1.Getroot(1, n); sv(T1.root, 1);
	debug("cnt = %d\n", cnt);
	print(ans, '\n');
}
void init()
{

}
char _ED_;
void mian()
{
	debug("%.3f MB\n", abs(&_ST_ - &_ED_) / 1024.0 / 1024);
	init();
	int T = 1;
	for(; T; solve(), T--);
}
#ifdef int
	#undef int
#endif
}

int main()
{
	uvu::mian(); return 0;
}

详细

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 4ms
memory: 31136kb

input:

5000
1296 1400 867 4533 1296 2007 2059 115 821 2960 3187 1597 2409 2708 4743 4778 1345 3967 911 3400 4249 3793 339 3145 3490 607 4148 3513 3264 3852 568 775 828 1348 423 3678 305 1938 1096 1373 2662 1048 4328 4208 203 779 3103 3372 4523 192 264 792 4943 2211 2494 3513 3555 4935 3277 3390 4624 128 18...

output:

5000

result:

wrong answer 1st numbers differ - expected: '76002', found: '5000'

Subtask #2:

score: 0
Wrong Answer

Test #6:

score: 0
Wrong Answer
time: 459ms
memory: 66292kb

input:

200000
13177 40498 104798 83659 186055 32788 86489 72123 13521 134868 158968 60124 166316 163390 120935 103000 83938 57807 97940 40447 137723 154683 191864 59080 102808 3969 21451 165592 128776 49468 4101 26441 139317 59503 18053 118809 187783 149816 21609 98521 165692 52964 60425 23437 29614 106886...

output:

200000

result:

wrong answer 1st numbers differ - expected: '5859368', found: '200000'

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Skipped

Dependency #1:

0%