原题传送门 每次查询的实际就是将地图的一个前缀和一个后缀合并后的图的最小生成树边权和 我们要预处理每个前缀和后缀的最小生成树 实际求前缀和(后缀和)的过程珂以理解为上一个前缀和这一列的最小生成树进行合并,实际最后前缀和后缀合并也是这样 如果暴力进行合并的话,每次边数是nm级别的,明显会TLE和MLE 我们考虑一下,实际每次合并主要和最左.最右两列(称这些点为关键点)有关,每次合并,原来最小生树中有可能会有一些边要删掉使得合并后是最小生成树.感性理解一下,珂能删掉的边一定在两个关键点在原来最小生成…
[题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,...,S_{n-1},S_n,S_{n-1},...S_2,S_1 \}\). 现在给定一个长度为\(n\)的字符串\(S^{'}\)表示原字符串\(S\)经过若干次(可能为0)旋转之后的一个前缀, 求原来字符串可能的长度\(l\). 显然当\(l > n\)时一定可行,所以只需要输出所有的\(l\leq…
原题传送门 神鱼说这道题是强制离线(smog 我们珂以把被单点修改,单点查询的点单独拿出来处理,把每个数表示成\(mul*x+plus\) 初始状态下\(mul=1,plus=0\) 操作1:在总和中减去\(val[pos[x]]\)(\(pos\)表示离散化后的位置,\(val\)表示特殊点的数值):将\(val[pos[x]]\)变成\(\frac{val_{new}-plus}{mul}\):如果\(pos[x]\)不在非零位置的栈中,将\(pos[x]\)压入栈中:在总和中加上\(val…
原题传送门 构造题. 明显p,q都越大越好 我们考虑每次取出度最小的点,加到尴尬聚会的集合中(因为把与它相邻的点全删了,不珂能出现认识的情况),把它自己和与自己相连的点从图上删掉(边也删掉),记下这个点的度,最后找尴尬聚会中度数最大的点,把它及在它之后删除的点加入热闹的聚会的集合中,这时p就是这个点的度数.这时p,q都较大,就珂以过了,正确性我也不会证明 #include <bits/stdc++.h> #define inf 0x3f3f3f3f #define N 10005 #defin…
关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可以通过改变顺序使这一次移动合法 证明: 考虑到达位置上的那个棋子, 如果它没有到达最终位置, 则我们考虑将该棋子移至下一步, 如果下一步还有没有到达最终位置的棋子, 则也移动它 否则直接调换这两个棋子的移动顺序即可 好的我们去除了题目中的要求: 「移动过程中不能出现多颗棋子同时在某一格的情况」, 接…
本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优化)来做,计数操作改装进去,ans[1]=1;迪杰斯特拉更新边长的时候如果大于号(具体见代码)就覆盖,相等的话就加上 4.%楼上SPFA,BFS大佬 具体见代码,其实就是在迪杰斯特拉里面填了几笔(逃 代码巨丑(捂脸) #include<cstdio> #include<cstring>…
感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT$ 明显是求它的前驱与后继(可能有相同的),所以就用平衡树,但是又要求两个相邻的数的差,就可以有再开一个平衡树存放差值 实现:抛开奇奇怪怪的的题面,主要考虑这三个操作: 1.$INSERT$ $i$ $k$: 这个很简单,用链表就行了(数组模拟的),但是要注意,插入的时候,要接着上一个在这插入的,还…
分析 可以发现第一列和最后一列永远不会被删除,于是我们可以想到维护前后缀最小生成树,但是直接维护的话显然时间空间两爆炸.(通过上网找题解)可以发现我们关心的只是最左边和最右边两列,而不关心内部的连边情况.所以我们可以仅维护这两列的节点在最小生成树上形成的虚树,边权是对应链上最大的边权,合并时对两棵虚树上的所有边再跑一遍最小生成树就好了. 由于虚树的大小是\(O(n)\)级别的,所以该算法的时间复杂度为\(O(n(m+q) \log n)\). (这代码写起来有点恶心.) 代码 #include…
讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 代码(20pts): #include <bits/stdc++.h> using namespace std; char c[100001][1001]; bool pd(int x, int y) { int l1 = strlen(c[x]), l2 = strlen(c[y]); if(…
[APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可能保持所有道路免费.为此亟待制定一个新的道路维护计划. 国王已决定保持尽可能少的道路免费,但是两个不同的村庄之间都应该一条且仅由一条 且仅由一条免费道路的路径连接.同时,虽然水泥路更适合现代交通的需 要,但国王也认为走在鹅卵石路上是一件有趣的事情.所以,国王决定保持刚好 K 条鹅卵石路免费. 举例来…
终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都是重链中的黑点, 深度就是关键字. 考虑每一种操作 0 : 改变颜色 在他所在的重链上插入一个黑点或者earse掉 1 : 查询 就像树链剖分一样, 一直往上跳重链头然后更新答案即可 代码较短 #include <bits/stdc++.h> #define maxn 101000 #define…
把有单点修改和查询的点离散进一个数组,然后单点修改直接改,记录一个修改时间t,维护一个sm表示这些离散的点的和,val表示出了离散点其他点的值,因为都是一样的所以只记录这一个值即可,记录ljlc为加法乘法的lazytag,整体加整体乘的时候像线段树一样改smljlc,还有修改val,整体赋值的时候把valsmljlc都初始化,记录一个赋值时间ti 单点查询的时候如果这个点的修改时间比当前赋值时间早就直接val,否则是数组值和lazytag操作一下,整体查询直接sm+val*has即可 那个求逆元…
话说这题放在智推里好久了的说,再不写掉对不起自己233 首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客 那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一堆的石子个数 考虑阶梯Nim的结论:奇数编号堆的石子异或和为\(0\),发现我们可以搞一个很暴力的DP出来 \(f_{i,j,k}\)表示当前放了前\(i\)堆石子,总共用了石子个数是\(j\),其中奇数堆石子的异或和为\(k\)的方案数,转移的时候直接枚举当前堆拿了几个即可,复杂度\(O(n^3\…
来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状态的最小花费 其中j是一个二进制数(用十进制来表示)第i位的1.0分别表示是否已经到达第i点(1表示已经到达,0表示还未到达) (因为m很大,n很小,会有重边,所以用邻接矩阵(e[u][v])) 由此可以列出状态转移方程: f[i][j]=min{f[i][k]+diss[i][k][u]*e[u]…
这题是真的水啊... ------------ 昨天模拟赛考了这题,很多人都是O($n^3$)水过,但我认为,要做就做的足够好(其实是我根本没想到O($n^3$)的做法),然后就开始想O(n)的解法. 首先看题目,前面一大堆看似是废话,其实还是有很大用处的. 问题描述中提到了树的中心,但后面却貌似没有用到,其实中心是给我们带来提示的. 既然是求最小偏心距,那必然是要在直径上找,不然偏心距并不能有过多的减少,所以第一步,定下在直径上找. 然后直径上找也要讲究方法,假如整条路径在中心的左边或右边,那…
M斐波那契数列 此题对数学基础要求较高 来源矩阵乘法_百度百科 一个m*n的矩阵是一个由m行n列元素排成的矩形阵列.矩阵里的元素可以是数字符号或者数学式. 形如[acbd][abcd]的数表称为二阶矩阵,其中a,b,c,d称为这个矩阵的元素. 形如 [x1x2][x1x2] 的有序对称为列向量 设 A=[acbd]A=[abcd] B=[x1x2]B=[x1x2] 则C=[ax1+bx2ax2+bx1]C=[ax1+bx2ax2+bx1] 称为二阶矩阵A与平面向量B的乘积,记为AB=C 更一般的…
生成函数板子题...... 要写高精,还要NTT优化......异常dl 这个并不难想啊...... 一次召唤会涉及到\(10\)个因素,全部写出来,然后乘起来就得到了答案的生成函数,输出\(n\)次项的系数就好了. 下面把\(10\)个条件列一下 \[1 + x^6 + x^{12} + \cdots = \frac{1}{1-x^6}\] \[1+x^2+x^3+\cdots+x^9 = \frac{1-x^{10}}{1-x}\] \[1+x^2+x^3+x^4+x^5 = \frac{1…
这个柿子挺别致的......还有信仰膜数998244353 直接讲正解吧...... 首先发现这个柿子从上往下算好像不怎么行,我们从下往上看,(下面令\(Ans_r = sum_{k,1,r}\)). 考虑\(a_i\)对\(Ans_r\)的贡献(\(1 \le i \le r\)),即\(a_i\)在\(sum_{k,1,r}\)中被算了多少次,我们假设\(a_i\)被算了\(c_i\)次.答案就是\(Ans_r = \sum\limits_{i = 1} ^ r a_i c_i\) 废话.…
分治FFT的板子为什么要求逆呢 传送门 这个想法有点\(cdq\)啊,就是考虑分治,在算一段区间的时候,我们把他分成两个一样的区间,然后先做左区间的,算完过后把左区间和\(g\)卷积一下,这样就可以算出左区间里的\(f\)对右边的贡献,然后再算右边的就好了. 手玩一组样例吧:g=[0,3,1,2](默认\(g[0] = 0\)) 一开始,只有f[0]=1 f: [1 0|0 0] 然后我们从中间分开来,先算左边的 f: [1|0|0 0] 然后在分下去我们会找到\(f[0]\),就拿这一段和\(…
三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说把多项式\(f(x)\)写成两个多项式相加的形式: \[ f(x) = wf_0(x) + f_1(x) \] 这样在这道题中取\(W = 2^{15}\)就可以避免爆long long了. 乘起来的话就是 \[ f \cdot g = (w f_0 + f_1)(wg_0 + g_1) = (f_0 g…
妈妈我终于会这道题了! 设\(n\)个点的有根仙人掌个数的指数型生成函数(EGF)为\(F(x)\), 令\(f_i = [x^n]F(x)\) 对于\(f_i\), 我们考虑钦点\(1\)号点为根, 然后考虑与\(1\)相邻的是什么 \(1\)不在环上: 对于这种情况, 我们可以发现与它相邻的还是一颗仙人掌, 于是它的生成函数还是\(F(x)\) \(1\)不在环上: 对于这种情况, 我们考虑环的大小\(i\), 那么去除点\(1\), 它的生成函数就是\(F^i(x)\), 但是考虑到对称的…
通过子任务1.3十分显然,子任务4实际上就是线段树,和我下午写的[SDOI2015]道路修建一模一样,堪称“我抄我自己”,不会的可以先做一下这个题. 然后考虑正解,参考了zhoushuyu的博客,首先可以对前i列做MST,就是把前i-1列和第i列合并起来,而这时候只需要把第1和第i列的点作为关键点建立虚树,虚树边权为原树路径最大值,然后每次O(n)对虚树合并即可.后缀也同样做一遍即可.查询时,就是把整张图分成两半,同样只需要维护前后缀的左右两列建立虚树即可,复杂度O(n(m+q)logn) #i…
有一种神奇的算法叫做floodfill 就是一个n*m的矩阵,a[i][j]为当前高度,我们可以任选一个点倒水,开始bfs,如果要搜的点没有被搜到过,并且高度小于当前的点,我们就把这个点加入队列中 而这道题我们可以用floodfill做 先假设有解,也就是说假设干旱区里的所有城区都能建水利措施. 对于第一行湖泊,显然我们bfs往下floodfill覆盖的最后一行肯定是个区间,那么对于第一行两个点floodfill后覆盖的最后一行的两个区间,如果左边端点floodfill的右边一部分与右边端点fl…
洛谷1552 [APIO2012]派遣 原题链接 题解 luogu上被刷到了省选/NOI- ...不至于吧 这题似乎有很多办法乱搞? 对于一个点,如果他当管理者,那选的肯定是他子树中薪水最少的k个,而且这k个薪水之和<=m k又要最大 可以维护n个可并堆(代码里是斜堆(不会左偏树)(平衡树启发式合并也行???)) 每次dfs所有儿子,搞完以后再把儿子的堆与键值为自己薪水的节点全部merge起来,然后一直弹最大的弹到和<=m为止,然后用堆的size*L更新答案. 用大根堆维护. Code //…
题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 复制 abcd aaaa ababab . 输出样例#1: 复制 1 4 3 题解 Luogu的题解 这里是对目前最高赞题解结论的证明. 结论:设字符串长度为$n$,最长相同前后缀的长度为$next[i]$, 如$n$%$(n-next[n])=0$,则答案为$n/(n-next[n])$,否则为$1$. 证明: 我们求$next$数组的时候,相当于每次把当前串这样对齐了一下↓ 而$next$求到$n$时,上面…
首先,重链剖分我们有所认识,在dsu on tree和数据结构维护链时我们都用过他的性质. 在这里,我们要介绍一种新的剖分方式,我们求出这个点到子树中的最长链长,这个链长最终从哪个儿子更新而来,那个儿子就是所谓的“重儿子”,也可以叫长儿子. 我们的做法就是,在统计一个点的信息时,对于重儿子,我们直O(1)接继承它的答案(这里有指针技巧,只能看代码,不可言传),对于轻儿子我们暴力统计. 复杂度分析:一个点被计算,最多只会在作为重链上的点时被继承一次,在重链顶端时被暴力统计一次.所以最终复杂度是O(…
简单之至的题解 \(Luogu\) 比楼上的简单,代码只有二十行 首先看题的时候发现这个无法做到直接求 因为数据范围好像有点超乎想象 但是对于这种递推的题来说一般就是从小的往大的推 那么我们递推的过程就是每一次挽回 我们发现我们挽回一次之后问题就变成了一个子问题 但是这个子问题的挽回顺序变了,我们只需要在递推的时候反过来就好了 这个题又非常的善良给了我们当前这一行的最大值 明显的暗示递推好吧~~~ 我们直接枚举当前的枫叶数量 计算挽回一次之后还剩下多少 用剩下的枫叶数目对应的答案,先翻转一下,在…
原题传送门 这题和Luogu P1972 [SDOI2009]HH的项链很像,只是数据大小有些差别,题解 我博客里对莫队的介绍 我们在排序询问时,普通是这样qaq inline bool cmp(register query a,register query b) { return a.bl==b.bl?a.r<b.r:a.bl<b.bl; } 我加了一个奇偶优化:按奇偶块排序.如果区间左端点所在块不同,那么就直接按左端点从小到大排:如果相同,奇块按右端点从小到大排,偶块按右端点从大到小排.…
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个\(N×M\)的网格,有些格子为不可移动的障碍.机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方.机器人接受的指令有:向前移动\(1\)步(\(Creep\)):向前移动\(2\)步(\(Walk\)):向前移动\(3\)步(\(Run\)):向左转(…
题目链接:https://www.luogu.org/problemnew/show/P1373 想不出来状态 看了一眼题解状态明白了 dp[i][j][h][1/0] 表示在i,j点差值为h是小A还是uim移动的 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ll long long using namespace std; con…