【CSP2019】树上的数】的更多相关文章

题面 这是一道典型的部分分启发正解的题. 所以我们先来看两个部分分. Part 1 菊花图 这应该是除了暴力以外最好想的一档部分分了. 如上图(节点上的数字已省略),如果我们依次删去边(2)(1)(3)(4),那么操作完后2号点上的数字就会跑到1号点上,1号点数字会跑到3号点上,3号点数字跑到4号点上--依此累推.那么我们相当于把五个节点连成了一个环( 5 -> 2 -> 1 -> 3 -> 4 -> 5 ),每一个结点上的数字都会跑到环上的下一个结点上去,我们就是要求能使最…
[CSP2019]树上的数 题面 洛谷 题解 我们设每个点上的编号分别为\(a_1,a_2...a_n\). 10pts ... 菊花 假设现在菊花中心编号是\(rt\),设你依次拆边\((p_1,rt),(p_2,rt)...(p_{n-1},rt)\),那么最后你会发现\(a_{rt}\)到了点\(p_1\),\(a_{p_1}\)到了点\(p_2...a_{p_{n-1}}\)到了\(rt\). 我们把点按照\((rt,p_1,p_2...p_{n-1})\)排出来,那么操作就相当于每个点…
题解 因为博主退役了,所以题解咕掉了.先放个代码 CODE #include<bits/stdc++.h> using namespace std; const int MAXN = 2005; int n, ps[MAXN], ans[MAXN], fir[MAXN], to[MAXN<<1], nxt[MAXN<<1], cntE, Mn; int f[MAXN][MAXN<<1], cnt[MAXN]; bool bf[MAXN<<1],…
CSP-S2 2019 D1T3 考场上写了2h还是爆零……思维题还是写不来啊 思路分析 最开始可以想到最简单的贪心,从小到大枚举每个数字将其移动到最小的节点.但是通过分析样例后可以发现,一个数字在移动的过程中也可能有无关的边的删除,很难处理.显然直接贪心是不可能的. 分析删边对图的影响.可以发现,一条边删去之后,边两端的部分将不会产生任何影响.也就是说,两边的关系只有这一条边.于是还是之前那个贪心的想法,将边的问题转化为点的问题.现在来分析怎么求解. 具体实现 分析样例后可以发现以下性质: 若…
考虑处理字典序的一类经典操作: 按位枚举. 我们思考一些性质: 一个点的权值出去则不会再回来. 一条边不会使用两次. 那么我们从小到大来操作. 那么存在矛盾当且仅当: 起点在之前非开始边被操作过 中间经过之前走过的边,且作用与本次不等效. 终点被占据. \(O(n^2)\)…
题面 题解 这道题由于是求字典序最小的,所以要贪心地枚举数字,然后找可以走到的编号最小的点,处理这条路径. 这条路径有一些特性. 以下是特别精炼的结论: 所以一旦选好了路径,这些边的先后顺序就被定死了,后面的路径肯定不能与他冲突 于是我们只要记录边的先后关系,然后进行非常严密的逻辑判断选择一条不冲突的路径. 复杂度O(n^2) Code 你们看不懂的 #include<cstdio> #include<iostream> #include<cstring> #inclu…
CSP2019题解 格雷码 按照生成的规则模拟一下即可. 代码 括号树 看到括号匹配首先想到用栈,然后又在树上就可以想到可追溯化栈. 令\(a_i=1\)表示\(i\)号节点上的括号为(,否则为), 记栈为\(stk\),其中元素个数为\(top\). 设\(f_i\)表示加上节点\(i\)所对应的括号所增加的贡献,\(g_i\)表示这个点的答案,转移很显然: \[ \begin{aligned} \begin{cases} f_i=0&(a_{fa_i}=1)\\ f_i=f_{fa_i}&am…
CSP2019 题解 D1T1 格雷码(code) 题目传送门 https://loj.ac/problem/3208 题解 按照题意模拟就可以了. 对于第 \(i\) 位,如果 \(k \geq 2^i\) 那么这一位就是 \(1\),然后把 \(k\) 变成 \(2^{i + 1} - k - 1\).否则这一位为 \(0\),\(k\) 不变. 代码 https://loj.ac/submission/687508 D1T2 括号树(brackets) 题目传送门 https://loj.…
诈个尸 先挖坑 虽然连去都没去但还是想做做 今年貌似比去年还毒瘤啊... yrx.hjw都进了省队线tql orz (myh:没AK真丢脸 Day1T1 格雷码 Day1T2 括号树 Day1T3 树上的数 Day2T1 Emiya家今天的饭 Day2T2 划分 Day2T3 树的重心…
求环套外向树上节点数不小于K的路径数. 首先树的话直接点分治+树状数组$O(n\log^2n)$搞定 环套树的话,先删掉多余的边(a,b) 然后变成了一棵树,直接点分治 然后在树上找到a到b的路径,将每一棵子树中的点的“所有权”(要么从a出发到达,要么从b出发到达)改变一下,然后计算贡献即可. 总时间复杂度$O(n\log^2n+n\log n)$ 把BZOJ第700题献给了这道题… #include<cstdio> #define N 100010 typedef long long ll;…