03 2019 档案
摘要:"传送门" 主席树裸题,考虑出现一半次数以上的数一定是这个区间的中位数,查询中位数再判断一下中位数出现的次数就好了 注意要离散化 代码: c++ include include include include using namespace std; void read(int &x) { char
阅读全文
摘要:"传送门" 二元组建图 一共有四种二元关系,对于同选文和同选理的情况需要新开两个点来计算 代码: c++ include include include include include using namespace std; void read(int &x) { char ch; bool ok
阅读全文
摘要:"传送门" 感觉这题好难呢,全程抄代码 题解就懒得写了,推出式子后暴力+剪枝。反正不是自己想的 就安利大佬的博客吧: "大佬的题解" 代码:
阅读全文
摘要:FFT 给定一个$n$次多项式$F(x)$,和一个$m$次多项式$G(x)$,请求出$F(x)$和$G(x)$的卷积。 c++ include include include include using namespace std; void read(int &x) { char ch; bool
阅读全文
摘要:"传送门" $$ F_j=\sum_{ij}\frac{q_iq_j}{(i j)^2}\\ E_j=\frac{\sum_{ij}\frac{q_iq_j}{(i j)^2}}{q_j}\\ =\sum_{ij}\frac{q_i}{(i j)^2} $$ 然后设 $$ a_i=\frac{1}{
阅读全文
摘要:"传送门" 没想到湖南省选也出板子题啊 先把题目要求的式子拆一下 $$ \sum_{i=1}^{n}(a_i+x b_i)^2\\ =\sum_{i=1}^{n}(a_i^2+b_i^2+x^2+2a_ix 2b_ix 2a_ib_i)\\ =\sum_{i=1}^{n}(a_i^2+b_i^2)+
阅读全文
摘要:"传送门" 很显然可以用圆方树转成一棵树,然后就可以愉快的上树剖了 接下来考虑方点,当路径经过方点的时候,这个方点的贡献应该是它所表示的点双内的所有点的最小值 然后我们可以考虑将每个方点用一个multiset存下当前点双内的所有点权 但是发现修改时需要枚举包含当前圆点相邻的所有方点,当该图是菊花图时
阅读全文
摘要:"传送门" 考虑建立圆方树,然后将圆点权值定为$ 1$(考虑到每个圆点都会被两个方点计算进去,要去重),方点权值定为点双内的点数 然后对于每个起点$s$和终点$f$,中间点的选择方案就是路径权值和,然后对于每个点为中间点计算贡献,$O(n)$dp就好了 代码: c++ include include
阅读全文
摘要:"传送门" 好题啊,就是有点难写 对于给出的图建广义圆方树,建出广义圆方树圆方树后建虚树,然后统计虚树上的点数(包括虚边上的原树的点) 注意特判$1$不为关键点时将$1$以及$1$连出去的边产生的贡献去掉 还有方点不产生贡献这个有点细节 代码(真的精神污染,没什么好看的): c++ include
阅读全文
摘要:"传送门" 不算太难,后缀数组 将所有的字符串都连起来,就是注意减$height$的时候会有一部分被多减,加回来就好了 代码: c++ include include include include using namespace std; void read(int &x) { char ch;
阅读全文
摘要:"传送门" 树上差分+线段树合并+离散化 对于修改的路径,树上差分就好了 代码: c++ include include include include include using namespace std; void read(int &x) { char ch; bool ok; for(ok
阅读全文
摘要:"传送门" 思路确实简单,很容易想到差分 差分完了之后就是一个求$n$个字符串的最长公共子串,先将所有串拼成一个串,中间加些特别大的数,为了防止差分后出现负数,也要加一个大数,这些细节自己处理下,接下来用$sa$就可以了 二分答案之后拿$height$数组判定就好了 这里说一下判定,如果出现了一个$
阅读全文
摘要:"传送门" 显然还是虚树,虚树之后树形dp 然后我没想到正确的树形dp,只想到一个错误的二次换根 写到一半发现错了,只能写了颗线段树+二次换根,线段树记的就是所有关键点到当前根的距离 写到一半又想到了正确的树形dp,然而真的不想再改了,感觉二次换根也能过: 就是每次对于当前走到的节点记一下它子树里深
阅读全文
摘要:"传送门" 二分答案是显然的啊,然后对于比二分出的值大的直接跑最大匹配,然后判定就好了 代码:
阅读全文
摘要:"传送门" 又做一次题解的搬运工,神仙题 分解质因数很显然是能想到的,不过纯粹的分解质因数只能得到可惜的30分 可以发现一个小于$500$的数,大于$22$的质因数最多只有$1$个 所以我们就可以将小于$22$的质数状压起来 然后对于大于$22$的质数进行讨论 可以知道对于一段大于$22$的质数相同
阅读全文
摘要:"传送门" 第一问是sb题,求$a[i]$严格上升转化为求$a[i] i$的不下降就好了,答案就是$n len$ 第二问好神仙啊,首先也没想到$O(n^3)$能过$35000$ 结论也很nb,对于区间$[l,r]$,要使不降最小代价一定是存在一个分割点$k$,使得前一半都等于$a$,后一半为$b$,
阅读全文
摘要:"传送门" 我是真的垃圾啊,我就不能独立的做完一道题吗 这个题还是莫比乌斯反演 但是很神奇的出现了$\prod$,先不管它,先把答案式写出来 $$ ans=\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)] $$ 然后一贯的套路,枚举$gcd$的值 $$ ans=\p
阅读全文
摘要:"传送门" 好像还是个比较简单的网络流 说实话我不知道网上双向边建成容量为$2$的为什么是对的,我感觉容量为$1$才是对的啊 然后唯一的坑点就是直接建图$a1$可能会流到$b2$,$b1$可能会流到$a2$,这就会误判 然后交换一组起点和终点就好了,再跑就行了(这也是我看了题解的地方) 代码: c+
阅读全文
摘要:"传送门" 开始刷第一版的题,一个dp+最短路的题,不算太难 设出状态$f[i]$表示当前到第$i$天的最小成本 由于变更路线是要花钱的,那么转移考虑上一次变更道路的位置就好了 代码:
阅读全文
摘要:"传送门" 容斥。 发现$H L$范围很小 设$f[i]$为最大公约数为$i$且选的数不全相同的方案数 考虑将$H$和$L$除以$k$,设$l=\lfloor L/k \rfloor,r=\lfloor H/k \rfloor$ 那么答案就是$f[1]+[L include include usin
阅读全文
摘要:"传送门" 好神的树形dp啊! 首先考虑=的情况,显然可以将他们缩成一个点 然后=k$ 那么$a$个白球放的方案数就是$C^{a}_{k}$ 然后$b$个黑球部分要与白球合并,那么合并的方案数就是$C^{b (k a)}_a$ 代码: c++ include include include usin
阅读全文
摘要:"传送门" 一开始想着二维线段树+二次换根来着,然而空间不够并且强制在线 然后就想到了一个比较好的计算方式,详见 "bzoj3626[LNOI2014]LCA" 就是类似这个统计距离和的方法,不过这次是有边权的,区间修改的话,预处理路径的长度就好了 然后发现还是不好做,看题解去 然后看到了动态点分治
阅读全文
摘要:"传送门" 感觉智商越来越不在线了,这么水的题没秒掉 一开始想的直接拿堆维护跑拓扑排序,后来发现看错题意了 然后就一直想怎么拿并查集去维护树的最小值,后来发现维护不了,又GG了 无奈之下看题解,这不就建个反图就没了吗,智商真的不在线 c++ include include include inclu
阅读全文
摘要:"传送门" 首先考虑不加边,那么就是一个有向无环图 答案的统计就是$\sum_{i=2}^{n}in[i]$($in[i]$就是$i$号点的入度) 但是考虑加边之后会出现环,那么就会导致重复计数,需要将重复的部分去掉 重复的原因就是因为环边可能会走到重复的点 现在考虑新加的边$x y$ 我们可以发现
阅读全文
摘要:"传送门" 我是菜鸡不会写,我抄题解,我无耻发博客 "我看的博客" 虽然以上全都属实,但是这个题我确实也学到了些操作 首先先转化一下题意 对于$a,b$要求$a+b|ab$,则$gcd(a,b)!=1$ 我们考虑将$d=gcd(a,b)$,则$a=id,b=jd$ 我们知道$gcd(i,j)==1$
阅读全文
摘要:"传送门" 这个题真的也是有点难度啊(应该是因为我太菜了) $$ ans=\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k\\ $$ 可以设 $$ f(d)=\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==d]d^k\\ ans=\sum_{
阅读全文
摘要:"传送门" 可以先不管$a$的限制 显然问题可以转化,对于一个数$i j$,能同时整除$i$并且整除$j$的数$x$,也就是满足$x|i\&\&y|j$,则$x|gcd(i,j)$,也就是$x$为$gcd(i,j)$的约数,设$g(n)$为$n$的约数和,那么 $$ ans=\sum_{d=1}^{
阅读全文
摘要:定义: 对于两个数论函数$f$和$g$,定义$(f g)(n)=\sum_{d|n}f(d)\cdot g(\frac{n}{d})$ 并且我们可以发现,狄利克雷卷积是满足交换律,结合律以及分配律的。 你或许还需要知道一些完全积性函数: 1、$I(n)$不变的函数,定义为$I(n)=1$ 2、$id
阅读全文
摘要:"传送门" 杜教筛板子题 又是卡了一晚上的常数 我的hash实现能力似乎差了点,写出来的hash连map都不如 用了点奇技淫巧,拿unordered_map把这题A了 先考虑$ans2$ $$ ans2=\sum_{i=1}^{n}\mu(i) $$ 看到$\mu$就想到了$\mu I=ε$ 然后由
阅读全文
摘要:"传送门" 莫比乌斯反演,但是约数有点难搞诶 有一个式子(想想挺显然的,可以保证每个约数只被算一次) $$ d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)==1] $$ 然后就正常了对吧,设 $$ f(d)=\sum_{i=1}^{N}\sum_{j=1}^{M}d(ij)=
阅读全文
摘要:"传送门" 莫比乌斯反演,算是道模板题吧,但是比 "[POI2007\]Zap" 难一些, "zap我也有题解" 对于这个题,一贯的套路,我们设 $$ f(d)=\sum_{i=1}^{a}\sum_{j=1}^{b}[gcd(i,j)==d]\\ g(n)=\sum_{n|d}f(d)=\sum_
阅读全文
摘要:"传送门" 我觉得这个问题的唯一难点是在于问题的转化 显然存在这样一种数,在区间$[l,r]$之间没有一个数是它的约数 然后怎么求这种数呢,线性筛一下 显然我们的$t(p)$就是这种数的最后一个的位置 每种$t(p)$的值的出现次数就是$\binom{n 1}{x 1} x! (n x)!$ 统计答
阅读全文
摘要:"传送门" 首先考虑定下一个端点,然后剩下的就可以递推了 一开始想的是定下左端点,然后预处理出位置最远能看到的位置,后来发现时间GG了 看题解发现定右端点优秀得多 记录下当前$r$最远能看到的位置$p$,能看到$[p,r]$一共需要几个守卫,这个后缀和一下就好了 然后斜率的判断,只需要$l,r$的斜
阅读全文
摘要:"传送门" 对于一些植物存在保护它的植物,比如能攻击到它的和它右边的植物都能保护它 这就符合最大权闭合子图的定义 按照最大权闭合子图的建模方式,正权连源点,负权连汇点,中间就对于每个植物连向保护它的植物就好了 可惜有些保护是成环的,环内的植物以及被这个环保护的植物你一个也碰不了 所以先反向建图,跑一
阅读全文
摘要:"传送门" 看到数据范围这么小,就没想过暴力的办法么 考虑肯定是从近走到远,所以走的点之间一定没有其他的点,所以我们就可以暴力的建图,然后暴力的去dfs就好了 代码: c++ include include include using namespace std; void read(int &x)
阅读全文
摘要:"传送门" 暴力啊,直接树套树上啊 线段树套splay,卡卡常就直接A了 代码:
阅读全文
摘要:"传送门" 考虑每次交换都不会改变每个数所在的行和列(不是指编号,而是指和它在同一行或者同一列的数不会发生变化) 由于每个数互不相同,所以记录下每个数所在的行和列,暴力判断就好了 代码: c++ include include include include using namespace std;
阅读全文
摘要:"传送门" 普通数位dp 代码: c++ include include include include include using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !isdigi
阅读全文
摘要:"传送门" 状压dp 考虑某些店可以不走,所以做的时候记个前缀min就好了 代码: c++ include include include include using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=g
阅读全文
摘要:"传送门" 显然可以发现把$k$状压 显然可以发现三维的dp,$f[i][j][k]$代表当前到$i$,已经连了$j$条边,当前$i\ to\ i k$奇偶性为$k$,然而会重复算 所以再加一维$t$,表示上一次连的边为$i i k+c$ 代码:
阅读全文
摘要:"传送门" 设状态$f[i][j][k]$为枚举到第$i$行,放国王的状态为$j$,目前一共放了$k$个国王 算出来复杂度挺高的,但是剪枝比较niubi,然后就没了 代码: c++ include include include include using namespace std; void r
阅读全文
摘要:"传送门" 神仙题吧,很有东西 看了题解才会做的 先提取有用信息: 1、这个密室是一棵有n个节点的完全二叉树 2、在点灯的过程中,要保证任意时刻所有被点亮的灯泡必须连通 3、在点亮一个灯泡后必须先点亮其子树所有灯泡才能点亮其他灯泡 所以get到信息 1、树高严格$logn$ 2、点亮的灯泡组成一个联
阅读全文
摘要:"传送门" 虽然是D,但是还是Sb题,把模式串跑一遍KMP,然后把按顺序放,每次放完之后跳到对应的前缀,继续放。 如果最后1的数量还有剩,再将最后的位数全部放1 代码: c++ include include include include using namespace std; void rea
阅读全文
摘要:"传送门" 我一开始想的是考虑每个点的颜色 设的状态就是$f[i][j]$表示$i$子树里有$j$个黑点的$i$子树的收益最大值,后来发现无法转移 那么考虑答案的统计,可以对于边统计答案 那么我们就可以考虑$f[i][j]$为$i$子树里有$j$个黑点对于全局答案的贡献最大值 也就是对于边考虑统计答
阅读全文
摘要:"传送门" 树形dp 对于每个点维护其子节点的走法是否唯一,每次取最大的并且不为负的(停留次数 1)个子儿子权值,然后判断走法是否唯一 假如有子节点的权值为0,走法也不唯一 代码: c++ include include include include include using namespace
阅读全文
摘要:背包: 1、 "bzoj2287:【POJ Challenge】消失之物" 2、 "bzoj2748:[HAOI2012]音量调节" 3、 "bzoj2794:[Poi2012]Cloakroom" 4、 "bzoj1190:[HNOI2007]梦幻岛宝珠" 树形dp: 1、 "bzoj1864:[
阅读全文
摘要:"传送门" 简单树形dp 设$f[i][j]$为当前为$i$号节点,当前颜色是$j$ 转移枚举一下子节点颜色,判断一下就好了 代码:
阅读全文
摘要:"传送门" 二进制分组优化背包 理解的差不多了,但是无法具体阐述,留坑 代码:
阅读全文
摘要:"传送门" 背包,想到一个思路这个题就没了,还是很简单的 将物品按$a_i$从小到大排序,询问按$m$从小到大排序,限制一下$a_i$,最大化$b_i$的最小值就没了 代码: c++ include include include using namespace std; void read(int
阅读全文
摘要:"传送门" 简单背包,本来sb了,写的一维数组,后来发现会影响后面的,改成二维就好了 wa的代码给出来: c++ include include include include using namespace std; void read(int &x) { char ch; bool ok; fo
阅读全文
摘要:"传送门" sb背包,先做一遍背包,然后考虑每个物品不用造成的影响 代码: c++ include int n,m,f[2001],a[2001],g[2001]; int main() { scanf("%d%d",&n,&m); for(int i=1;i=a[i];j )(f[j]+=f[j
阅读全文
摘要:"传送门" 首先知道每段$[i,i+1]$都能提供p1的贡献,预先加上就行了 然后的区间都是3个以上的了 对于p1的贡献,可以考虑中间的数$i$,设$l[i]$为左边第一个大于它的数的位置,$r[i]$为右边第一个大于它的数的位置,对于每一个$l[i]$和$r[i]$可以发现贡献是p1 对于p2的贡
阅读全文
摘要:"传送门" 显然是求生成树 只有两种情况会导致no solution: 1、如何加边图都不连通 2、必须要加的鹅卵石边超过k条 首先可以一遍kruskal判断出必须要加的鹅卵石边是多少:优先加水泥路的边 然后将必须要加的鹅卵石边加上去,再多加几条边使鹅卵石边等于k条,再去加水泥路 最后判断图是否联通
阅读全文
摘要:"传送门" 很容易看出是虚树吧,难点在于统计答案 可以考虑将虚树上的点预处理出来是由哪些关键点控制的 可以两次dfs初步处理一下(考虑下对上的影响和上对下的影响,但是兄弟节点之间的关系更新不到,需要在统计答案时更新一下) 然后考虑统计答案 考虑每个点$u$不在虚树中的儿子$v$,记它为size[v]
阅读全文
摘要:"传送门" 解法一:后缀数组 T=0,就是求本质不同,后缀数组经典用法 T=1,二分解决 代码: 解法二:后缀自动机 后缀数组做这个题显然有些强人所难 所以我们用后缀自动机可以更简单的解决 我们知道后缀自动机可以$O(n)$求出每个子串的出现次数和不同字串的个数 将这两者同意一下就可以满足这个题目的
阅读全文
摘要:"传送门" 模板集合吧,除了码农,没啥难的。。。 和 "bzoj2243:[SDOI2011]染色" 十分相像,但是多了点集和查询的区别 然后点集显然可以看出是虚树问题,查询可以用点分治$O(nlogn)$,也可以二次换根$O(n)$,显然二次换根$O(n)$更加优秀 然后码就是了 代码: c++
阅读全文
摘要:"传送门" 最小割,割点,模板。。。 代码: c++ include include include include include using namespace std; void read(int &x) { char ch; bool ok; for(ok=0,ch=getchar(); !
阅读全文
摘要:"传送门" AC自动机也可以写的啊,就是判断多了点,思路和KMP的挺像的 "具体的可以参考一下这一篇" 然后贴一个代码: c++ include include include include include include using namespace std; void read(int &x
阅读全文
摘要:"传送门1449" "传送门2895" 平方很难处理,考虑剩下的比赛所有队全输(只能全输,全赢保证不了费用流的正确性),考虑计算每个队多赢一次的贡献 拆开: $c_i (x+1)^2+d_i (y 1)^2 c_i x^2 d_i y^2$ $=2 c_i x+c_i 2 d_i y+d_i$ 然后
阅读全文
摘要:"传送门" 和学长刚,说自己能不写返回值为struct的query并且不写单点查询而AC此题,挣扎了半个小时还是改回去了 直接树链剖分,对于每个节点记一下最左边的和最右边的颜色以及区间内的颜色段数,区间合并一下就好了 对于查询的时候,也合并一下,跳链的时候注意看一下两条链相邻的颜色,判断一下 这个题
阅读全文
摘要:"传送门" 这个题目和 "我的另一篇博客" 做法很像 做完那个几乎就会这个了吧 如果你不会,你可以继续往下看 实际上由于当前的数的sa不一定连续 所以需要求出任意两个的最长公共前缀 假设$x,y,y x$,就是$min\{height[x+1],...,height[y]\}$ 然后把原本的断开,把
阅读全文
摘要:"传送门" 解法一:后缀数组 可以知道每一个子串都是后缀的前缀,那么对于第$i$小的后缀的贡献就可以表示为n sa[i]+1 然而会存在重复的子串,注意height数组的定义,对于sa[i 1]和sa[i],只有height[i]个子串会被重复计算,每次都减掉就好了 代码: c++ include
阅读全文
摘要:"传送门" $log$多似乎不是什么问题,最容易想到的就是4个$log$的树剖+树套树吧 衷心希望大家别写线段树套线段树,这个东西真的极容易MLE(这题不会)以及TLE(这题在洛谷会TLE1个点,bzoj可以AC) 这题本质就是树上路径动态求第k大经过的点值,处理路径问题用树链剖分就好了,动态第k大
阅读全文