太水了

P5018 [NOIP2018 普及组] 对称二叉树

@[老K](/space/show?uid=8943) QAQ(所以这题从看上去很神的题目变成了一个相对简单的dfs题目?)
by chen_zhe @ 2018-11-15 22:09:18


@[chen_zhe](/space/show?uid=8457) 这题数据是真的水,我把左子树或右子树不是对称二叉树(其实不然)的节点剪掉了都能拿76分,[记录](https://www.luogu.org/record/show?rid=13793249),别的民间数据只有40
by 7KByte @ 2018-11-15 22:14:40


表示递归一次满。。。 #include <iostream> #include <fstream> using namespace std; int _n; int _tree[1000010]; int _left[1000010]; int _right[1000010]; int _res = 0; bool ReverseEqual(int left, int right){ if (left==-1 && right==-1) { return true; } if (left==-1 || right==-1) { return false; } if (_tree[left]!=_tree[right]) { return false; } return ReverseEqual(_left[left],_right[right])&&ReverseEqual(_left[right],_right[left]); } bool Check(int root) { return ReverseEqual(_left[root],_right[root]); } int Count(int root) { if (root==-1) { return 0; } return 1+Count(_left[root])+Count(_right[root]); } int main(){ cin >> _n; for (int i = 1; i<_n+1; i++) { cin >> _tree[i]; } for (int i = 1; i<_n+1; i++) { cin >> _left[i] >> _right[i]; } for (int i = 1; i<_n+1; i++) { if (Check(i)){ _res = max(_res,Count(i)); } } cout << _res << endl; return 0; }
by lcyxds @ 2018-11-15 22:59:43


#include <iostream> #include <fstream> using namespace std; int _n; int _tree[1000010]; int _left[1000010]; int _right[1000010]; int _res = 0; bool ReverseEqual(int left, int right){ if (left==-1 && right==-1) { return true; } if (left==-1 || right==-1) { return false; } if (_tree[left]!=_tree[right]) { return false; } return ReverseEqual(_left[left],_right[right])&&ReverseEqual(_left[right],_right[left]); } bool Check(int root) { return ReverseEqual(_left[root],_right[root]); } int Count(int root) { if (root==-1) { return 0; } return 1+Count(_left[root])+Count(_right[root]); } int main(){ cin >> _n; for (int i = 1; i<_n+1; i++) { cin >> _tree[i]; } for (int i = 1; i<_n+1; i++) { cin >> _left[i] >> _right[i]; } for (int i = 1; i<_n+1; i++) { if (Check(i)){ _res = max(_res,Count(i)); } } cout << _res << endl; return 0; }
by lcyxds @ 2018-11-15 23:00:01


比赛的时候我看了看第三个数据,不到0.5秒,轻信不会爆T,果然就没爆
by lcyxds @ 2018-11-15 23:01:32


@[chen_zhe](/space/show?uid=8457) 这题实际上是信仰题????
by 老K @ 2018-11-15 23:09:02


加上快读快写优化的dfs+剪枝的59行程序成功考场AC
by zxy2004 @ 2018-11-20 19:58:49


考古+upd: 当时考场上我连算法复杂度是什么都不知道( 现在看来这个应该是 $O(nlogn)$ 的,单次询问最坏 $O(n)$ ,但是 Check 函数复杂度依赖于左右子树中较小的那一个,而 Count 函数复杂度是子树大小,且只统计对称二叉树,总复杂度应该都是 $O(nlogn)$,(类似于启发式合并的想法? 不知道这个代码是否会被 Hack,$n$ 有 $1e6$ 而且常数并不小
by lcyxds @ 2021-03-26 22:11:41


上一页 |