「JSOI2015」字符串树】的更多相关文章

「JSOI2015」字符串树 传送门 显然可以树上差分. 我们对于树上每一条从根出发的路径都开一 棵 \(\text{Trie}\) 树,那么我们就只需要在 \(\text{Trie}\) 树中插入一个字符串时把经过的节点都加 \(1\) 就好了,但是直接开空间会炸掉所以加一个可持久化. 还有一个小问题:我们读入的时候,如果用 char* 来存一条边上的字符串,那么每次都要用不同的 char[] 来传值,不然你就会发现每次的边的值都没变,可能是指针的一些原因吧. #include <cstrin…
「JSOI2015」isomorphism 传送门 我们还是考虑树哈希来判同构. 但是我们需要使用一些特殊的手段来特殊对待假节点. 由于是无向树,我们首先求出重心,然后以重心为根跑树哈希. 此处我们不计算假节点的个数对子树大小的贡献.需要注意的是无向树可能有两个重心. 树哈希的时候,假节点儿子的哈希值也直接向上贡献(因为假节点有且只有一个儿子). 这样我们就可以求出一颗无向树的简化树的哈希值,之后的问题就轻松解决了. 参考代码: #include <algorithm> #include &l…
「JSOI2015」非诚勿扰 传送门 我们首先考虑一名女性选中她列表里第 \(x\) 名男性的概率(假设她列表里共有 \(s\) 名男性): \[ P = p \times (1 - p) ^ {x - 1} + p \times (1 - p) ^ {s + x - 1} + p \times (1 - p) ^ {2s + x - 1} + \cdots + p \times (1 - p) ^ {ns + x - 1} \] 根据等比数列求和公式以及极限的相关计算,不难求出: \[ P =…
「SHOI2014」三叉神经树 膜拜神仙思路 我们想做一个类似于动态dp的东西,首先得确保我们的运算有一个交换律,这样我们可以把一长串的运算转换成一块一块的放到矩阵上之类的东西,然后拿数据结构维护. 但是考虑这个题,它最下面的那个运算的输入端只有两种可能,于是我们只需要讨论一下初始输入就完事了. 具体的,\(LCT\)每条实链维护一个\(yuu[i][0/1]\)表示实链底端的点输入为\(0/1\)后链头输出什么. 注意,这个链头指的是\(splay\)中那个点\(i\)的子树代表的那条链,也就…
「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long long p; class SegmentTree { private: struct Node { int l,r; long long v,mul,add; Node *c[2]; Node(int l,int r):l(l),r(r),mul(1LL),add(0LL) { c[0]=c[1]=nullp…
Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜又开始研究起线段树来了,有所不同的是,她把目光放在了更广义的线段树上:在正常的线段树中,对于区间 \([l, r]\),我们会取 \(m = \lfloor \frac{l+r}{2} \rfloor\),然后将这个区间分成 \([l, m]\) 和 \([m + 1, r]\) 两个子区间.在广义…
LOJ#3095. 「SNOI2019」字符串 如果两个串\(i,j\)比较\(i < j\),如果离\(a_{i}\)最近的不同的数是\(a_{k}\),如果\(j < k\)那么\(i\)排在\(j\)前面 否则的话如果\(a_{k} < a_{i}\),那么\(i\)排在\(j\)前 于是写个比较函数扔到sort里就可以了 #include <bits/stdc++.h> #define fi first #define se second #define pii pa…
LOJ#3043. 「ZJOI2019」线段树 计数转期望的一道好题-- 每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记 被覆盖的点$0.5p + 0.5 \rightarrow p ,0.5q + 0.5\rightarrow q $ 被覆盖的点子树中的点\(p\rightarrow p,0.5q + 0.5 \rightarrow q\) 经过的点\(0.5p \rightarrow p,0.5q \rightarrow q\) 未…
LOJ2983. 「WC2019」数树 task0 有\(i\)条边一样答案就是\(y^{n - i}\) task1 这里有个避免容斥的方法,如果有\(i\)条边重复我们要算的是\(y^{n - i}\),设\(a = y^{-1}\)那么我们可以对于选了i条边的方案算\(a^{i}\) 可是这样需要容斥,所以有个神奇的技巧 \((a - 1 + 1)^{i} = \sum_{j = 0}^{i}(a - 1)^{j}\binom{i}{j}\) 这样,对于至少选了\(j\)条边的方案,每选一…
「ZJOI2019」线段树 听说有人喷这个题简单,然后我就跑去做,然后自闭感++,rp++(雾) 理性分析一波,可以发现最后形成的\(2^k\)个线段树,对应的操作的一个子集,按时间顺序作用到这颗线段树上. 首先考虑研究一下tag的性质,比如两个操作时间先后是否没有影响,操作是否可以以某种形式进行合并,然后啥也没发现. 然后考虑一下一颗树是否可以被压成某个状态,比如实际上只有\(\log\)个状态然后去dp,发现也不行 再次冷静分析一波,发现好像每个节点可以独立考虑,结合上面\(2^n\),不妨…
「JSOI2015」串分割 传送门 首先我们会有一个贪心的想法:分得越均匀越好,因为长的绝对比短的大. 那么对于最均匀的情况,也就是 \(k | n\) 的情况,我们肯定是通过枚举第一次分割的位置,然后每一段长度 \(\frac{n}{k}\) 最后取最小的. 把这个思想运用到一般情况:如果分出来两段长短不一,那么长的只会比短的那个长度多 \(1\) ,再仔细想想,所有段只会有两种不同的长度 \(\lfloor \frac{n}{k} \rfloor, \lceil \frac{n}{k} \r…
「JSOI2015」symmetry 传送门 我们先考虑构造出原正方形经过 \(4\) 种轴对称变换以及 \(2\) 种旋转变换之后的正方形都构造出来,然后对所得的 \(7\) 个正方形都跑一遍二维哈希,这样我们就可以通过哈希,在 \(O(n ^ 2)\) 时间内判断原正方形中是否存在某一类型的某一大小的子正方形. 但是如果我们枚举边长,复杂度就会达到 \(O(n ^ 3)\) 级别,显然过不了. 考虑优化:我们发现对于任意一种类型的正方形,它把最外面一圈去掉之后还是满足原来的性质,所以我们可以…
「JSOI2015」地铁线路 传送门 第一问很简单:对于每条线路建一个点,然后所有该条线路覆盖的点向它连边,权值为 \(1\) ,然后它向所有线路上的点连边,权值为 \(0\) . 然后,跑一边最短路就可以求出第一问了. 接下来考虑第二问. 我们在最短路图上面跑 \(\text{DP}\) 我们把所有线路按照 \(dis\) 排序,然后用距离为 \(dis - 1\) 的线路来更新. 我们发现如果一条最短路为 \(d\) 的线路上出现了一个最短路为 \(d\) 的点,那么显然我们不会在这里上车,…
「JSOI2015」染色问题 传送门 虽然不是第一反应,不过还是想到了要容斥. 题意转化:需要求满足 \(N + M + C\) 个条件的方案数. 然后我们就枚举三个数 \(i, j, k\) ,表示当前方案中,至少不用 \(k\) 种颜色,至少不涂 \(i\) 行.至少不涂 \(j\) 列. 然后直接组合数算(式子不难看懂),最后容斥即可. 那么写出来就是: \[ ans = \sum_{i = 0}^n \sum_{j = 0}^m \sum_{k = 0}^c (-1)^{i + j +…
「JSOI2015」圈地 传送门 显然是最小割. 首先对于所有房子,权值 \(> 0\) 的连边 \(s \to i\) ,权值 \(< 0\) 的连边 \(i \to t\) ,然后对于所有的墙,连两条边,连接起墙两边的房子,容量就是修墙的费用,然后直接用权值和 - 最小割就是最大收益. 参考代码: #include <cstring> #include <cstdio> #define rg register #define file(x) freopen(x&qu…
「JSOI2015」最小表示 传送门 很显然的一个结论:一条边 \(u \to v\) 能够被删去,当且仅当至少存在一条其它的路径从 \(u\) 通向 \(v\) . 所以我们就建出正反两张图,对每个点开两个 bitset 维护它与其他点的连通性,这个可以通过拓扑排序预处理. 然后就枚举每一条边,拿两个端点的两个 bitset 与一下即可判断出这条边是否可以删去. 参考代码: #include <cstdio> #include <bitset> #define rg regist…
「JSOI2015」套娃 传送门 考虑贪心. 首先我们假设所有的套娃都互相不套. 然后我们考虑合并两个套娃 \(i\),\(j\) 假设我们把 \(i\) 套到 \(j\) 里面去,那么就可以减少 \(b_j \times out_i\) 的花费. 我们有一种 贪心策略就是说把所有套娃按 \(b\) 从大到小排序,然后每次找一个 \(out\) 最大的让它套. 我们可以这么证明正确性: 对于四个套娃 \(i, j, k, l\) ,假设 \(b_i > b_j, out_k > out_l\)…
「JSOI2015」salesman 传送门 显然我们为了使收益最大化就直接从子树中选大的就好了. 到达次数的限制就是限制了可以选的子树的数量,因为每次回溯上来都会减一次到达次数. 多种方案的判断就是看自己选中的子树中和没选的子树中是否存在两个值相等的,这样它们就可以通过互换来达到另一种方案,值得注意的是如果选了一个值为 \(0\) 的子树就肯定可以多一种方案出来,因为这颗子树选或不选都是满足最优的. 这里有个小问题:交到BZOJ上面去它会提示你 sort 没有声明,此时需要 #include…
「JSOI2015」送礼物 传送门 看到这题首先想到分数规划. 我们发现对于当前区间,如果它的最大值和最小值不是分居区间的两个端点的话,那么我们显然可以把两端多出去的部分舍掉,因为,在区间最大值最小值都不变的情况下,区间肯定是越短越优的. 但是要注意一点就是区间长度也是有下界的. 所以说我们就先处理所有区间长度为下界 \(L\) 的情况,然后再对区间长度位于 \([L + 1, R]\) 的区间做处理. 二分答案 \(mid\) ,假设当前区间是 \([l, r]\) 那么就有: \[ \fra…
「JSOI2015」子集选取 传送门 看到这个数据范围,就知道肯定是要找规律. 如果把集合看成一个长度为 \(n\) 的 \(01\) 串, \(0\) 表示没有这个元素, \(1\) 表示有这个元素, 那么我们可以发现对于题中的约束关系,不同位上的 \(01\) 之间不会互相影响. 那么我们只需要对于只有一位也就是 \(n = 1\) 的情况计算出方案(记为 \(x\))那么最后的答案就是 \(x ^ n\) . 现在考虑如何计算 \(x\) . 根据题目的限制,不难发现每一行都是一个全是 \…
「JSOI2015」最大公约数 传送门 考虑先枚举区间左端点, 然后我们会发现所有可能的区间虽然有 \(O(n)\) 个,但是本质不同的区间 \(\gcd\) 只有 \(\log n\) 级别,而且是从左端点往右呈阶梯状递减的. 所以说我们可以对于这 \(\log n\) 种不同的 \(\gcd\) 都算一遍答案. 具体来说就是二分出最远的那个可行右端点. 然后区间 \(\gcd\) 用 \(\text{ST}\) 表维护一下即可. 参考代码: #include <algorithm> #in…
「SHOI2014」三叉神经树 给你一颗由\(n\)个非叶子结点和\(2n+1\)个叶子结点构成的完全三叉树,每个叶子结点有一个输出:\(0\)或\(1\),每个非叶子结点的输出为自己的叶子结点中较多的那一种状态. 有\(q\)次修改操作,每次修改一个叶子结点的输出,求每次修改后根结点的输出. \(n\leq 5\times 10^5,q\leq 5\times 10^5\). 不难发现每个节点有两种可能的情况: ​ 1.三个儿子输出均为\(0/1\). ​ 2.两个儿子输出为\(0/1\),剩…
\(\mathcal{Description}\)   OurTeam & OurOJ.   给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) 的简单有向路径上的字符串成括号序列,记其正则匹配的子串个数为 \(\operatorname{ans}(u,v)\).求: \[\sum_{u=1}^n\sum_{v=1}^n\operatorname{ans}(u,v)\bmod998244353 \]   \(n\le2\times10^5\). \(…
一.Foundation框架中一些常用的类 字符串型: NSString:不可变字符串 NSMutableString:可变字符串 集合型: 1)NSArray:OC不可变数组  NSMutableArray:可变数组 2)NSSet:  NSMutableSet: 3)NSDictiorary  NSMutableDictiorary 其它: NSDate NSObject 二.NSString和NSMutableString的使用与注意 (一)6种创建字符串的方式 (二)使用注意 (1)字符…
题目传送门:LOJ #3043. 题意简述: 你需要模拟线段树的懒标记过程. 初始时有一棵什么标记都没有的 \(n\) 阶线段树. 每次修改会把当前所有的线段树复制一份,然后对于这些线段树实行一次区间修改操作. 即每次修改后线段树棵数翻倍,第 \(i\) 次修改后,线段树共有 \(2^i\) 棵. 区间修改操作的伪代码如下: 和我日常写的递归式线段树完全一致. 每次询问你这些线段树中有懒标记的节点总数. 修改和询问的总个数为 \(q\),\(1\le n,q\le 10^5\). 题解: 灵感来…
题解 可以发现每次修改的是这个点往上一条连续的链,如果我要把1改成0,需要满足这一段往上的一部分都有两个1 如果我要把0改成1,需要满足这一段往上的部分有两个0 对于每个点记录1的个数,发现我们只会把一棵树的2全部改成1或者把1全部改成2,这样加标记的时候可以同时维护是否全1或者是否全2,用lct维护,修改的时候access一遍,直接在平衡树上二分即可 代码 #include <bits/stdc++.h> #define fi first #define se second #define…
传送门 抄题解 \(Task0\),随便做一下,设 \(cnt\) 为相同的边的个数,输出 \(y^{n-cnt}\) \(Task1\),给定其中一棵树 设初始答案为 \(y^n\),首先可以发现,每有一条边和给定的树相同就会使得答案除去 \(y\) 那么可以利用矩阵树定理,已经有的边权值为 \(y^{-1}\),其它的连成完全图,权值为 \(1\) 求解行列式之后乘上 \(y^n\) 即可,\(O(n^3)\) 第一种正解 \(orz~laofu\) 即可 不会 第二种正解 一个小trick…
题解 好神仙的题啊 感觉转二维平面能想到,算重复情况的方法真想不到啊 通过扒stdcall代码获得的题解QAQQQQ 我们先把\(p_i\)正串反串建出一个AC自动机来 然后我们把s串放在上面跑匹配,正着跑一遍,反着跑一遍,我们就得到了\(s\)中每个位置正着和反着能匹配到的节点编号 然后对于AC自动机,我们建出fail树来,并处理出每个点在fail树上dfs序 对于AC自动机上的一个点,我们把\(p_i\)正串的询问挂在上面,假如这个点的匹配深度为x,那么我们就需要对于这个点fail树里所有匹…
题解 把所有的数组一开始就FWT好然后再IFWT回去可以减小常数 从13s跑到0.7s-- 可以参照immortalCO的论文,感受一下毒瘤的动态动态DP 就是用数据结构维护线性递推的矩阵的乘积 由于所有轻儿子\(F(z) + z^{0}\)的乘积做除法太麻烦,我们用一个线段树维护每个点所有的轻儿子即可 代码 #include <bits/stdc++.h> #define enter putchar('\n') #define space putchar(' ') #define fi fi…
目录: capitalize casefold center count encode decode endswith expandtabs find format format_map index isalnum isalpha isdecimal isdigit isidentifier islower isnumeric isprintable isspace istitle isupper join ljust lower lstrip maketrans partition repla…