正题 题目链接:https://www.luogu.com.cn/problem/P7046 题目大意 给出一个长度为 \(n\) 的字符串,然后 \(m\) 次把它的一个子串加入集合.如果一个字符串在这个集合中作为字符串的后缀出现次数大于 \(k\) 那么这个字符串就会被计入贡献. 每次求计入贡献的字符串数和最长长度. \(1\leq n,m\leq 5\times 10^5,0\leq k<n\). 解题思路 考虑在parents树上如果能定位到一个节点的字符串那么它的后缀就是它到根的路径.…
题目描述 一棵n个点的树,给定m条路径,q次询问包含一条路径的给定路径的个数+1 输入 The first line of input contains a single integer N(1<=N<=100000) - the number of cities in Byteland. Cities are numbered from 1 to n . Each of the next N -1 lines contains two integers Ai, Bi(1<=Ai,Bi&…
题意:给你一个子串,m次询问,每次给你abcd,问你子串sa-b的所有子串和子串sc-d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在parent树上的lca就是最长公共后缀.找到某个子串就是在parent树上倍增 我们先二分答案,问题就变成了子串sx-y的所有子串中是否包含子串p,我们先倍增找到子串p,然后查询p在parent树上的子树是否包含子串sx-y的子串(parent树上的子树就是所有以p作为后缀的子串,如果sx-y的子串包含p,…
题意 给你一个长为 \(n\) 的排列 \(p\) ,问你有多少个等长的排列满足 字典序比 \(p\) 大 : 它进行冒泡排序所需要交换的次数可以取到下界,也就是令第 \(i\) 个数为 \(a_i\) ,下界为 \(\displaystyle \sum_{i=1}^{n} |i - a_i|\) . 题解 一道特别好的题,理解后做完是真的舒畅- 参考了 liuzhangfeiabc 大佬的博客 . 首先我们观察一下最后的序列有什么性质: 考试 打表 观察的:对于每个数来说,它后面所有小于它的数…
题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\(T\). 每组数据两个整数,\(n\)和\(k\). 输出 \(T\)行,每行一个整数,表示满足条件的三元组的个数. 样例 样例输入 1 10 7 样例输出 27 //为什么老被和谐啊 数据范围 \(1≤n,k≤10^5\) \(T≤400\) 时间限制\(4s\) 题解 与其他学校互测,然后做题…
\(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序列,于是倒序枚举,先把最后有序的插入. 剩下来前面无序的就是要操作的,于是直接输出操作次数. 接下来方案很容易构造. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; void read(int &x){ x=0;…
首先对于原串建$SAM$,我们可以发先在一个点$i$的$right$集合里的点的相似度就是$len[i]$,于是可以将$SAM$的$right$集合通过$set$来启发式合并,每次加入新的点对$(i,j,len[i])$,最后离线询问二维数点就可以解决了 但是这样每次维护$set$加入的点对是平方级别的的 我们可以发现对于一个要加入的点$i$只需要找$set$里和他相邻的两个点 将他们的点对加入就好 其余点对不会影响答案 复杂度$O(nlog^2n)$ 具体的看代码吧 #include<bits…
「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以我们直接判断 \(a_{l-1}\) 和 \(a_r\) 是否相等就行了. 我们用二维线段树,一维存左端点 \(l\),一维存右端点 \(r\),里面存 \(a_l=a_r\) 的概率. 若 \(a\in [1,l-1],b\in [l,r]\),操作不在 \(b\),概率为 \(1-p\) 若 \…
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinobu 早有准备,Alice.Ayaya.Karen.Shinobu.Yoko 五人又能继续愉快地玩耍啦! 「噢--!不是有放上天的烟花嘛!」Karen 兴奋地喊道. 「啊等等--」Yoko 惊呼.Karen 手持点燃引信的烟花,「嗯??」 Yoko 最希望见到的是排列优美的烟火,当然不会放过这个机会-…
「UNR#1」奇怪的线段树 一道好题,感觉解法非常自然. 首先我们只需要考虑一次染色最下面被包含的那些区间,因为把无解判掉以后只要染了一个节点,它的祖先也一定被染了.然后发现一次染色最下面的那些区间一定是一段连续的左儿子+一段连续的右儿子. 证明的话可以看官方题解,感性理解的话不难,同时,任意一段连续的左儿子+右儿子也对应一个区间.定义一个左儿子区间 \([l_i,r_i]\) 的后继是所有 \(r_i=l_i+1\) 的左儿子和右儿子,一个右儿子区间 \([l_i,r_i]\) 的后继是所有…
「ZJOI2017」树状数组 以下均基于模2意义下,默认\(n,m\)同阶. 熟悉树状数组的应该可以发现,这题其实是求\(l-1\)和\(r\)位置值相同的概率. 显然\(l=1\)的情况需要特盘. 大暴力 对于\(l=1\)的情况,可以发现一个操作不会产生影响当且仅当增加\(r\)的值,而其他情况会改变\(l-1\)或\(r\). 对于\(l!=1\)的情况: ​ 针对一次修改区间\([ql,qr]\). \([ql,qr]\)包含\(l-1,r\),那么有\(\displaystyle 2…
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析:NIM游戏这有介绍. 题目简单描述:修改节点权值,询问路径异或和. 这个不就是dfs序维护树状数组吗? 以下借用niuox学长的一幅dfs序的图 所以答案就是ask(st[x]) ^ ask(st[y]) ^ a[lca(x,y)] (lca(x,y)节点到根节点路径上所有的点值异或两次后值为0,所…
首先可以求出从某点做$2^k$次车能到的最浅的点,这个只要dfs一下,把它的孩子能到的最浅的点更新过来就可以 然后倍增地往上跳,不能跳到lca的上面,记录坐车的次数ans 此时有三种情况(设最远能跳到x,y): 1.再跳也跳不到lca的上面,就是-1 2.路径(x,y)被某趟车覆盖,答案是ans+1 3.并没有被覆盖,答案是ans+2 那么怎么看有没有覆盖呢 首先,如果这两个点是直上直下的(有一个是lca),只要看下面那个点能不能跳到上面去就行 对于剩下的(x,y),只要有车的两端点分别在x和y…
题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n-1 行,每行两个数 a.b,表示树上的a和b 之间有一条边.树中顶点 按1到 n标号. 接下来 P 行,每行三个数 a.b.c,表示路径为 a 到 b.权值为 c 的盘子,其 中0≤c≤10^9,a不等于b.  接下来Q行,每行三个数 u.v.k,表示路径为 u到 v的水果,其中 u不等于v,你需…
[题目链接] http://codeforces.com/contest/786/problem/C [题目大意] 给出一个数列,问对于不同的k,将区间划分为几个, 每个区间出现不同元素个数不超过k时最少的区间划分数量. [题解] 我们可以用树状数组+扫描线求出一个区间不同元素的数量, 我们记录每一个位置上下一个相同相同元素的位置,当扫描线扫过当前点时 我们消除这个点的影响,并在其下个出现的位置进行更新, 这样就能求出固定左端点不同右端点情况下不同区间内不同元素的数量, 这个题我们可以用倍增找出…
题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作,每次为一下三种之一: RELEASE x:对x执行一次感染: RECENTER x:把根节点改为x,并对原来的根节点执行一次感染: REQUEST x:询问x子树中所有节点感染代价的平均值. 输入 输入的第一行包含两个整数n和m,分别代表局域网中计算机的数量,以及操作和询问的总数.接下来n-1行,…
这题让我升华..还好只重构了一遍 首先我们发现:$n$较小时,整个队伍的形态 跟 $n$ 比较大时的局部是一样的 所以我们预处理出这个队伍的形态,和每一行每个位置的质因子个数的前缀和,$O(nlogn)$,然后每次回答$log(n)$ 方法: 1.线性筛,筛出每个数值因子的个数: 2.然后用一个树状数组,维护整个队列中的还存在的数的数量:相当于统计一个数组(设其为$a$)的前缀和,这个数组以自己为下标,存储这个数还存不存在,即$a[x]=1表示x存在,a[x]=0表示x不存在$:刚开始$a$中都…
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高速光缆组成.每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络.该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信. 高速光缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略.但是由于路由器老化,在这些…
题目描述 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的.于是vfleaking决定写一个玩Nim游戏的平台来坑玩家.为了设计漂亮一点的初始局面,vfleaking用以下方式来找灵感:拿出很多石子,把它们聚成一堆一堆的,对每一堆编号1,2,3,4,...n,在堆与堆间连边,没有自环与重边,从任意堆到任意堆都只有唯一一条路径可到达.然后他不停地进行如下操…
目录 题目大意 题目分析 题目大意 要求维护一个栈,提供压栈.弹栈以及求栈内中位数的操作(当栈内元素\(n\)为偶数时,只是求第\(n/2\)个元素而非中间两数的平均值).最多操作100000次,压栈的数字\(key\)范围是[1,100000]. 题目分析 前两个操作用\(stack\)就好. 求中位数.暴力做法即使用上优先队列也是稳稳的超时.考虑树状数组. 压栈时,将\(key\)值对应的位置加1.弹栈减1. 求中位数,可以二分求出\(sum[1:p]==(n+1)/2\)最小的\(p\),…
正题 题目链接:https://www.luogu.com.cn/problem/CF786C 题目大意 给出一个长度为\(n\)的序列. 对于每个\(k\in[1,n]\)求将\(n\)分成最少的段使得每段的长度不同. \(1\leq a_i\leq n\leq 10^5\) 解题思路 考虑对于一个\(k\)我们的做法显然就是直接暴力往后匹配能多晚分段就多晚分段. 然后考虑这题因为对于一个\(k\)答案的上界是\(\frac{n}{k}\)所以其实所有\(k\)的段数和是\(n\log n\)…
SAM 两个前缀的最长后缀等价于两个点的 \(len_{lca}\) , 题目转化为求 \(l \leq x , y \leq r\) , \(max\{len_{lca(x,y)}\}\) // powered by c++11 // by Isaunoya #include <bits/stdc++.h> #define rep(i, x, y) for (register int i = (x); i <= (y); ++i) #define Rep(i, x, y) for (r…
题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作: K=1,读入l,r 表示在l  到 r 之间种上一种树,每次操作种的树的种类都不同: K=2,读入 l,r 表示询问 l 到 r 之间有多少种树. 注意:每个位置都可以重复种树. 输入格式 第一行  表示道路总长为 n,共有  m个操作:接下来 m 行为 m 个操作. 输出格式…
题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y\)到根节点的路径和就是了 那么\(k\neq 1\)的情况该怎么办呢?我们来考虑一下令\(1\)到\(i\)的路径上每个节点权值加\(1\)的本质,相当于是令每个节点\(u\)增加\({dep_u}^k-{dep_{fa_u}}^k\),那么用树剖+线段树维护就行了 //minamoto #inc…
学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2*s_l-l$的区间$[l+1,r]$其众数为$x$,这个显然可以用一个数据结构来维护. 直接扫一遍效率是$O($数字种类数$*nlogn)$的,无法承受,但是我们发现,对于每一段非$x$的数,$2*s_i-i$是公差为$-1$的等差数列,所以它们对答案的贡献实际上可以一次性计算.设$L$为一段非$x$数…
1A,拿来练手的好题 用一个优先队列按煮熟时间从小到大排序,被煮熟了就弹出来. 用n个vector维护每种食物的煮熟时间,显然是有序的. 用树状数组维护每种煮熟食物的数量. 每次操作前把优先队列里煮熟时间<=当前时间的弹出,BIT上+1. 每次0操作把食物塞进优先队列和vector 每次1操作先看看树状数组里有没有数,没有输出angry,有的话在树状数组上二分找到最小的数. 每次2操作先看看树状数组里有没有这一种数,有的话输出并-1,没有的话看看vector有没有,有的话输出时间差,没有的话输出…
题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组 两个前缀的最长公共后缀,在正串后缀自动机上体现为pre树上两点LCA的深度. 考虑统计pre树上一个点的贡献:对于两个前缀 $x$ .$y$ ,它能够影响的询问左端点小于等于 $x$ ,右端点大于等于 $y$ .因此影响最大化的前缀对就…
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能等于 \(v\))和一个非空字符串 \(s\) ,问从 \(u\) 到 \(v\) 的简单路径上的所有边按照到 \(u\) 的距离从小到大的顺序排列后,询问边上的字符依次拼接形成的字符串中给定的串 \(s\) 出现了多少次. 输入 第一行 \(2\) 个整数,依次为树中点的个数 \(n\) 和回忆的…
太神仙了这题... 原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度. 下面的1,2操作均定义为向下沉降(与原题意的变换相反): 首先这个题目只会操作前缀和后缀,并且只会把前缀中的数(纵坐标)变小(2操作),后缀中的数(横坐标)变大(1操作),所以具有单调性,可以进行二分.(括号中含义的解释见下) 先把整个坐标系旋转$45$度(逆时针为例),操作1即纵坐标$y>=xi$的点都会往右走$2*l$,横坐标$+2*l$,纵坐标不变,由于有单调性,只会操作后缀:操作2…
网格图给予我的第一反应就是一个状态 f[i][j] 表示走到第 (i,j) 这个位置的最大价值. 由于只能往下或往右走转移就变得显然了: f[i][j]=max{f[i-1][j], f[i][j-1]}+a[i][j] 但是面对庞大的数据范围,再优秀的电脑也无法驾驭 百亿亿 的时间复杂度,与 百亿亿 的空间复杂度. 其实只要稍加思考我们就可以发现,枚举那些没有价值的 (x,y) 的坐标是多余的,所以我们只需要枚举有价值的点,在进行Dp转移就会起到加速. 因此新的状态即为:f[i] 表示到达第…