题解 [ZJOI2019]语言】的更多相关文章

题目传送门 题目大意 给出一个 \(n\) 个点的树,现在有 \(m\) 次操作,每次可以选择一个链 \(s,t\),,然后这条链上每个点都会增加一个相同属性,问对于每一个点有与它相同属性的有多少个点的答案之和. \(n,m\le10^5\) 思路 你发现对于每一个点计算的时候答案其实就是所有包含它的链的两端虚树大小. 于是问题就是如何求虚树大小,你发现如果按 \(\text{dfs}\) 序进行排序那么答案就是: \[\sum_{i=1}^{n} \text{dep}(a_i)-\sum_{i…
P5327 [ZJOI2019]语言 解题思路 暴力 首先讲一下我垃圾的 40pts 的暴力(其他 dalao 都是 60pts 起步): 当然评测机快的话(比如 LOJ 的),可以卡过 3,4 个点(逃. 对于 1,2 测试点的话,我们直接记录两个节点之间路径上的所有点,然后用一个二维数组存一下两个点是否能互相贸易. 最后暴力求 ans 就好了.. 然后我们看到了链的部分分,然后就是在序列上的处理了: 对于每一个操作,我们记录下左右端点,然后按照左端点为第一关键字,右端点为第二关键字进行排序.…
原题传送门 看到这种树上统计点对个数的题一般是线段树合并,这题也不出意外 先对这棵树进行树剖,对于每次普及语言,在\(x,y\)两点的线段树上的\(x,y\)两位置打\(+1\)标记,在点\(fa[lca(x,y)]\)的线段树上\(x,y\)两位置打\(-2\)标记 线段树中该维护三个东西: 1.dfs序最小的\(lp\) 2.dfs序最大的\(rp\) 3.线段树中所有被打标机的点到根节点路径的并的节点个数\(sum\) 我们进行搜索并从下向上的进行线段树合并,对于每个节点,对答案的贡献就是…
一边写草稿一边做题吧.要看题解的往下翻,或者是旁边的导航跳一下. 草稿 因为可以开展贸易活动的条件是存在一种通用语 \(L\) 满足 \(u_i\) 到 \(v_i\) 的最短路径上都会 \(L\) .所以我们考虑能够带来贡献的,只有同一次传教. 但是很有可能在进行当前这一次传教过程中,中间的两座城市已经可以进行贸易往来了,所以我们需要将这些部分的贡献给减去.因为是要其中都有同一种语言,所以我们只需要找连续的有相同语言的就可以了. 相当于对于一次传教,我们需要找出传教路径上的相同颜色的链的长度的…
, '\n'); #include<cstdio> #include<iostream> #include<string> #include<algorithm> #include<iterator> #include<cstring> //uva 10033 Problem G: Interpreter #define ONLINE_JUDGE using namespace std; ]; ]; int steps; ; int…
树链剖分入门题吧 一个非常直观的想法是使用树剖将一条链拆成\(log^2n\)个矩形,套用矩形面积并算法即可得到一个垃圾的3个log过不去算法 为了得到一个两个log的做法,我们观察一下拆出来的矩形的性质 首先是一堆跨越对角线的矩形,这一部分可以维护每个对角线处延伸出来的最大值线性得出 接下来如果我们令dfs序小的去数dfs序大的点,那么我们会发现矩形的第二维全部是重链的前缀 因此线段树可以被替换成每个重链上的multiset 此时的复杂度依然是3个log,仍然需要优化 接下来发现第一维是一段区…
题意 题目链接 分析 考虑枚举每个点的答案,最后除以 2 即可. 可以与 \(u\) 构成合法点对 的集合 为所有经过了 \(u\) 的链的并.因为这些链两两有交,根据结论 "树上两条相交的链一定有一条的 \(lca\) 在另一条链上" 可以得知所有的链构成了一棵树. 考虑维护经过每个点的所有链构成的 树链的并 的大小.一条链是否出现可以树上差分,树链的并的具体大小就以 \(dfs\) 序 为下标建线段树,然后线段树合并即可. 复杂度 \(O(nlogn)\) . 代码 #includ…
ZJOI2019Day2的温暖题,然后考场上只会大常数的\(O(n\log^3 n)\),就懒得写拿了60pts走人 首先我们简化题意,容易发现每个点能到达的点形成了一个联通块,我们只需要统计出这个联通块的大小即可 再进一步,我们发现如果把每条经过\(x\)的路径\((u,v)\)上的两个端点取出,并且维护它们之间的最小生成树,这棵生成树的大小就是最后的答案(可以画图或是感性理解) 接下来就考虑怎么维护每个点出去的生成树大小,首先我们强制选择\(1\)号点,然后用类似于建虚树的方法,每次加入一个…
首先可以想到对每个点统计出所有经过它的链的并所包含的点数,然后可以直接得到答案.根据实现不同有下面几种方法.三个log:假如对每个点都存下经过它的链并S[x],那么每新加一条路径进来的时候,相当于在路径上所有点的S中都加入这条路径.树剖之后,相当于对log个区间中的点都加入log个区间.具体实现有树剖后线段树维护虚树.矩形扫描线.线段树+set存区间等多种方法,这里不再多说.两个log:先树剖,然后对每个点开一棵线段树存储它的S,由于题中没有修改,所以可以树上差分+线段树合并,这样可以将方法一中…
暴力树剖做法显然,即使做到两个log也不那么优美. 考虑避免树剖做到一个log.那么容易想到树上差分,也即要对每个点统计所有经过他的路径产生的总贡献(显然就是所有这些路径端点所构成的斯坦纳树大小),并支持在一个log内插入删除合并. 考虑怎么求树上一些点所构成的斯坦纳树大小.由虚树的构造过程容易联想到,这就是按dfs序排序后这些点的深度之和-相邻点的lca的深度之和(首尾视作相邻),也就相当于按dfs序遍历所有要经过的点并回到原点的路径长度/2. 这个东西显然(应该)可以set启发式合并维护,但…
原题链接戳这儿 SOLUTION 考虑一种非常\(naive\)的统计方法,就是对于每一个点\(u\),我们维护它能到达的点集\(S_u\),最后答案就是\(\frac{\sum\limits_{i=1}^{n}|S_i|}{2}\) 也就是说我们可以先树剖一下,对于每一个点都开一棵线段树,每次修改\(O(nlogn)\)地更新一下路径上的线段树,最后查询一下就行了 但是这样的复杂度是\(O(n^2log^2n)\)的,显然会炸.注意到每次是对一条链上的所有点操作,所以我们可以查分.又因为差分之…
分析 问题显然可以转化为对于每个节点询问所有这个节点的所有链的链并的大小. 考场上我直接通过树剖打标记+树剖线段树维护以\(O(n \log^3 n)\)的时间复杂度暴力实现了这个过程.(使用LCT或者全局平衡二叉树可以实现\(O(n \log^2 n)\)的时间复杂度) 考虑如何快速求出链并的大小,有这样一个结论:把所有的链的端点按dfs序排序后,链并的大小等于所有链的两端点的深度之和减去相邻端点的LCA的深度之和再减去所有端点的LCA的深度,这个结论(貌似)在链并是一个连通块的时候均成立.…
首先,对于从每个点出发的路径,答案一定是过这个点的路径所覆盖的点数.然后可以做树上差分,对每个点记录路径产生总贡献,然后做一个树剖维护,对每个点维护一个动态开点线段树.最后再从根节点开始做一遍dfs,把每个节点对应的线段树启发式合并即可.时空复杂度均为O(nlog2n).听说还有一个log的做法,但感觉太神仙不会,不过2个log能过就不管了. #include<bits/stdc++.h> #define lson l,mid,tr[rt].lc #define rson mid+1,r,tr…
老年人题解,语言python3 A - Bank Robbery 题意:给你ABC,以及n个数,问你在(B,C)之间的数有多少个. 题解:对于每个数判断一下就好了嘛 x,y,z = map(int,input().split()) n = int(input()) print(len(list(filter(lambda x:y<int(x) and z>int(x),input().split())))) B. Cutting Carrot 题意:给你一个高为h,底为1的等腰三角形,你需要平…
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 2019」异或粽子 「十二省联考 2019」字符串问题 「十二省联考 2019」春节十二响…
原文链接www.cnblogs.com/zhouzhendong/p/UOJ470.html 前言 做完情报中心来看这个题突然发现两题有相似之处然后就会做了. 题解 首先,我们考虑将所有答案点对分为两类. 一个节点对其祖先的贡献. 来自一个节点的不同子树之间节点的贡献. 第一种情况非常简单,这里不加赘述. 对于第二种情况,我们首先考虑简单做法: 考虑对于每一个节点分开处理. 按照某一种顺序枚举它的子树,对于所有"一端在当前子树内,另一端在当前子树之前的子树"的路径,我们求它们的贡献.…
LOJ#3046. 「ZJOI2019」语言 先orz zsy吧 有一个\(n\log^3n\)的做法是把树链剖分后,形成logn个区间,这些区间两两搭配可以获得一个矩形,求矩形面积并 然后就是对于一个点把树链的log个区间加进去然后线段树合并,这是\(n \log^2 n\)的 链并会形成一棵树,如果我们把经过某个点的链的端点按dfn序排序的话,相邻两项算一下距离,首尾两项再算一下,我们就可以获得链并的这棵树的边权和×2,由此可以求树上的点的个数 我们要求的就是经过每个点的链并-1的和,然后再…
「ZJOI2019」语言 3个\(\log\)做法比较简单,但是写起来还是有点麻烦的. 大概就是树剖把链划分为\(\log\)段,然后任意两段可以组成一个矩形,就是个矩形面积并,听说卡卡就过去了. 好像这个可以被优化到两个\(\log\),算了,估计挺麻烦的. 一个\(\log\)的做法看起来还挺厉害的. 考虑钦定某个点算它的贡献,于是我们要算的是所有经过它的链的并的大小. 但是染色这个东西看起来就很不可搞,我们可以挖掘一下这个并的简单性质. 注意到,这个并是联通的,可以看做是一个生成子树,然后…
注意:本题解仅供参考学习,请勿直接抄袭代码,否则造成的后果和笔者无关. 第一题: 题意: 对n个数升序排序. 题解: 快排,不解释. 代码(省略了输入输出函数,下同): val n = getInt (); val l = getIntTable (n); fun qsort [] = [] | qsort l' = let val p = hd l'; val l1 = List.filter (fn x => x < p) l'; val l2 = List.filter (fn x =&…
想要继续向前,就从克服内心的恐惧开始. 麻将 题意 在麻将中,我们称点数连续的三张牌或三张点数一样的成为面子,称两张点数一样的牌为对子.一副十四张麻将牌的胡牌条件是可以分成四个面子和一个对子或者分成七个互不相同的对子.现在规定麻将牌的点数为\(1\sim n\),每种点数都有四张牌.现在给出你初始的十三张手牌,假设剩余的牌以随机的顺序发到你的手上,求期望发多少张牌以后你的手牌中存在一组牌可以胡牌.注意点数相同的牌两两之间也视为不同的.\(5\leq n\leq 100\).答案对\(998244…
1001 Beautiful Palindrome Number 枚举回文数字前半部分,然后判断该数字是否满足,复杂度为O(sqrt(n))! 1002 Recovery Sequence  本题的核心在于求出约瑟夫环出队序列,如果直接暴力的话复杂度约为O(N*N)将会超时.这里可以使用 树状数组或者线段树或者SBt等数据结构 来优化根据本次出队位置和剩余人数的数量,可以算出下次出队的位置,从而使用数据结构来查询其真实标号.对于每组样例的复杂度根据不同的数据结构为 O(nlgn)或O(nlgnl…
题目大意 给定一棵$n$个节点的树,维护$n$个集合,一开始第$i$个集合只有节点$i$.有$m$个操作,每次操作输入一个$(u,v)$,表示将$(u,v)$这条链上所有点所属的集合合并.求有多少个无序数对$(u,v)$使得$u,v$同在一个集合之中. $$n,m\leq 10^5$$ 思路 其实这道题要维护的就是极大联通子集使得这个集合的节点都讲同一种语言(以下简称联通块)的合并和维护大小. 设$s_x$表示$x$所在的联通块的大小,$ans=\frac{1}{2}\sum_{x}s_x$.…
#include <stdio.h> #include <stdlib.h> #include <string.h> //#define NONBLANK 1 main() { /* 位运算 */ int n; printf("开始启动程序:\n"); printf("开始调用函数:\n"); int setbits(int, int, int, int); , , , ); printf("结果等于%d",…
题目传送门 https://loj.ac/problem/3046 题解 首先问题就是问有多少条路径是给定的几条路径中的一条的一个子段. 先考虑链的做法. 枚举右端点 \(i\),那么求出 \(j\) 表示经过 \(i\) 的路径,左端点最小是 \(j\),那么右端点 \(i\) 的贡献就是 \(i-j+1\). 至于求出 \(j\) 可以用直接线性地从右向左扫一遍,在右端点处枚举路径就可以了. 那么问题回到树上. 我们考虑也枚举最终的路径的一个端点. 那么,这个端点的贡献,应该就是经过这个端点…
输入一个字符串,判断其是否是C的合法标识符.  Input输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串. Output对于每组输入数据,输出一行.如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”. Sample Input 3 12ajf fi8x_a ff ai_2 Sample Output no yes no 在这里需要注意:清空缓冲区: getchar()以及它应该放在哪个位置:…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢规律的女孩子.按照规律,第二题应该是一道和数据结构有关的题. 在一个遥远的国度,有 n 个城市.城市之间有 n - 1 条双向道路,这些道路保证了任何两个城市之间都能直接或者间接地到达. 在上古时代,这 n 个城市之间处于战争状态.在高度闭塞的环境中,每个城市都发展出了自己的语言.而在王国统一之后,语言不通给王国的发展带来了极大的阻碍.为了改善…
这题非常的神啊...蒟蒻来写一篇题解. Solution 首先考虑如何判定一副牌是否是 "胡" 的. 不要想着统计个几个值 \(O(1)\) 算,可以考虑复杂度大一点的. 首先先把 \(7\) 个对子的状态判掉.然后考虑 \(4\) 个面子和 \(1\) 个对子的情况. 记录一个 \(dp_{i, j,k}\) : \(i\) 表示现在有没有留出对子,\(j\) 表示现在形如 \(i, i - 1\) 的牌的多余的个数, \(k\) 表示现在形如 \(i\) 的牌对的个数,整个状态表示…
还是来致敬一下那过往吧 题目分析 先丢代码 #include<bits/stdc++.h> ; ; ; struct node { int top,son,fa,tot; }a[maxn]; struct point { int u,v; point(, ):u(a),v(b) {} }; struct tree { int ls,rs,cov,val; }f[maxNode]; int n,m,tot; long long ans,det; int chain[maxn],chTot,rt[…
B Interesting paths 考察范围:组合数学 此题是机器人走方格的变种,n*m的网格,从(1,1)走到(n,m),首先可以明确,水平要走m-1格,竖直要走n-1格,则走到目的地的任意一条路径必须走n+m-2格,呢么只要确定竖直要走的,剩下的就是水平要走的,则答案为 . 在Interseting paths要求左下角和右上角两个小矩阵不能走,则需要把整个网格依据两个小矩阵的水平和竖直边界分为两部分,依次运用组合数.例如 灰色区域之外为可走区域,分为两部分棕色,和黄色,则结果为 若是这…
原题传送门 希望这题不会让你对麻将的热爱消失殆尽 我们珂以统计每种牌出现的次数,不需要统计是第几张牌 判一副牌能不能和,类似这道题 对于这题: 设\(f[i][j][k][0/1]\)表示前\(i\)种牌,顺子\((i-1,i,i+1)\)出现了\(j\)次,顺子\((i,i+1,i+2)\)出现了\(k\)次,有/没有雀头的最多面子数.转移比较简单 我们珂以发现\(j\)这维不太重要,强制dp值不超过\(4\)(超过\(4\)也没有用),雀头数不超过\(7\)(类似),爆搜珂以搜出本质不同的状…