首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
Luogu P5327 [ZJOI2019]语言
】的更多相关文章
【题解】Luogu P5327 [ZJOI2019]语言
原题传送门 看到这种树上统计点对个数的题一般是线段树合并,这题也不出意外 先对这棵树进行树剖,对于每次普及语言,在\(x,y\)两点的线段树上的\(x,y\)两位置打\(+1\)标记,在点\(fa[lca(x,y)]\)的线段树上\(x,y\)两位置打\(-2\)标记 线段树中该维护三个东西: 1.dfs序最小的\(lp\) 2.dfs序最大的\(rp\) 3.线段树中所有被打标机的点到根节点路径的并的节点个数\(sum\) 我们进行搜索并从下向上的进行线段树合并,对于每个节点,对答案的贡献就是…
Luogu P5327 [ZJOI2019]语言
ZJOI2019Day2的温暖题,然后考场上只会大常数的\(O(n\log^3 n)\),就懒得写拿了60pts走人 首先我们简化题意,容易发现每个点能到达的点形成了一个联通块,我们只需要统计出这个联通块的大小即可 再进一步,我们发现如果把每条经过\(x\)的路径\((u,v)\)上的两个端点取出,并且维护它们之间的最小生成树,这棵生成树的大小就是最后的答案(可以画图或是感性理解) 接下来就考虑怎么维护每个点出去的生成树大小,首先我们强制选择\(1\)号点,然后用类似于建虚树的方法,每次加入一个…
题解 P5327 [ZJOI2019]语言
P5327 [ZJOI2019]语言 解题思路 暴力 首先讲一下我垃圾的 40pts 的暴力(其他 dalao 都是 60pts 起步): 当然评测机快的话(比如 LOJ 的),可以卡过 3,4 个点(逃. 对于 1,2 测试点的话,我们直接记录两个节点之间路径上的所有点,然后用一个二维数组存一下两个点是否能互相贸易. 最后暴力求 ans 就好了.. 然后我们看到了链的部分分,然后就是在序列上的处理了: 对于每一个操作,我们记录下左右端点,然后按照左端点为第一关键字,右端点为第二关键字进行排序.…
P5327 [ZJOI2019]语言
一边写草稿一边做题吧.要看题解的往下翻,或者是旁边的导航跳一下. 草稿 因为可以开展贸易活动的条件是存在一种通用语 \(L\) 满足 \(u_i\) 到 \(v_i\) 的最短路径上都会 \(L\) .所以我们考虑能够带来贡献的,只有同一次传教. 但是很有可能在进行当前这一次传教过程中,中间的两座城市已经可以进行贸易往来了,所以我们需要将这些部分的贡献给减去.因为是要其中都有同一种语言,所以我们只需要找连续的有相同语言的就可以了. 相当于对于一次传教,我们需要找出传教路径上的相同颜色的链的长度的…
Luogu P5279 [ZJOI2019]麻将
ZJOI2019神题,间接送我退役的神题233 考场上由于T2写挂去写爆搜的时候已经没多少时间了,所以就写挂了233 这里不多废话直接开始讲正解吧,我们把算法分成两部分 1.建一个"胡牌自动机" 首先我们发现这题不能转化为一般DP问题求解的最大瓶颈就是因为它的状态很诡异 但是我们细细一想,形如\(\{1,1,1,2,3,4,5,6,7,8,9,10,12,12\}\)和\(\{3,3,3,5,6,7,9,10,11,14,15,16,20,20\}\)的本质其实是一样的(都是三个顺子+…
(大模拟紫题) Luogu P1953 易语言
原题链接:P1953 易语言 (我最近怎么总在做大模拟大搜索题) 分别处理两种情况. 如果只有一个1或0 直接设一个cnt为这个值,每次输入一个新名字之后把数字替换成cnt,最后cnt++即可. 注意数字可能不止一位,输出一次cnt之后可以整一个bool变量阻止以后的输出. 如果是要改名 把名称和后缀分别存起来,扫一遍名称找出初始数字,赋给cnt. 同样,初始数字可能不止一位,要每次乘10加n. 然后不用管输入的是啥,每有一个输入输出一遍初始名称,数字部分替换成cnt即可.然后输出第二个名称时检…
[Luogu5327][ZJOI2019]语言(树上差分+线段树合并)
首先可以想到对每个点统计出所有经过它的链的并所包含的点数,然后可以直接得到答案.根据实现不同有下面几种方法.三个log:假如对每个点都存下经过它的链并S[x],那么每新加一条路径进来的时候,相当于在路径上所有点的S中都加入这条路径.树剖之后,相当于对log个区间中的点都加入log个区间.具体实现有树剖后线段树维护虚树.矩形扫描线.线段树+set存区间等多种方法,这里不再多说.两个log:先树剖,然后对每个点开一棵线段树存储它的S,由于题中没有修改,所以可以树上差分+线段树合并,这样可以将方法一中…
Luogu P5280 [ZJOI2019]线段树
送我退役的神题,但不得不说是ZJOIDay1最可做的一题了 先说一下考场的ZZ想法以及出来后YY的优化版吧 首先发现每次操作其实就是统计出增加的节点个数(原来的不会消失) 所以我们只要统计出线段树上每个节点在进行了\(t\)次操作(有\(2^t\)棵树)是某个点为\(1\)的总个数,令这个值为\(f_x\) 然后考场上用了一种记录该节点+左儿子+右儿子状态的方法,这样可以把答案的贡献全部算到这个点上 但是这样细节巨多且容易算重(漏),所以考场上码了\(200+\)行最后没调出大样例 后来想了一种…
[ZJOI2019]语言
树链剖分入门题吧 一个非常直观的想法是使用树剖将一条链拆成\(log^2n\)个矩形,套用矩形面积并算法即可得到一个垃圾的3个log过不去算法 为了得到一个两个log的做法,我们观察一下拆出来的矩形的性质 首先是一堆跨越对角线的矩形,这一部分可以维护每个对角线处延伸出来的最大值线性得出 接下来如果我们令dfs序小的去数dfs序大的点,那么我们会发现矩形的第二维全部是重链的前缀 因此线段树可以被替换成每个重链上的multiset 此时的复杂度依然是3个log,仍然需要优化 接下来发现第一维是一段区…
[ZJOI2019]语言[树链的并、线段树合并]
题意 题目链接 分析 考虑枚举每个点的答案,最后除以 2 即可. 可以与 \(u\) 构成合法点对 的集合 为所有经过了 \(u\) 的链的并.因为这些链两两有交,根据结论 "树上两条相交的链一定有一条的 \(lca\) 在另一条链上" 可以得知所有的链构成了一棵树. 考虑维护经过每个点的所有链构成的 树链的并 的大小.一条链是否出现可以树上差分,树链的并的具体大小就以 \(dfs\) 序 为下标建线段树,然后线段树合并即可. 复杂度 \(O(nlogn)\) . 代码 #includ…