随笔分类 - 算法/数据结构
摘要:题目链接 题意:一个只含e, a, s, y的字符串,问[l, r]内有多少个easy序列? 题解:倍增。
阅读全文
摘要:HDU5925 题意:给出一个R*C(R, C <= 1e9)的地图,地图上有n(n <= 200)个点的障碍,其余为空地。问有多少个四连通图以及各个四连通图的大小。 题解:离散化。将x, y坐标分别离散化。对于xi点再插入xi-1, xi+1两个点。 则离散化后的权值大小为xi-xi-1.对y作同
阅读全文
摘要:DP+bitset HDU5716 dp[i][j] = dp[i-1][j-1] && (s[i] in set[j]); 第二维压bitset 1 #include <bits/stdc++.h> 2 #define X first 3 #define Y second 4 #define mp
阅读全文
摘要:题意:一条直线上有n个炸弹,给出每个炸弹的爆炸半径,可以引爆另一个炸弹爆炸。问:每个炸弹爆炸后,最多有几个炸弹一起爆炸? 迭代,用线段树更新。 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #define ll
阅读全文
摘要:题目链接 题意:n个人,每个人有一个能力值。给出m组关系A, B, 表示A的能力值大于B的能力值。 问:m组关系中是否有自相矛盾的?若不矛盾,问:第1个人在所有人的能力值中排名第几?有多少人的能力值的排名可以确定? 题解:拓扑排序。存两个图,原图与反图。 若原图可达该点数+反图可达该点数-1 = n
阅读全文
摘要:题意:N个点的一棵带权树。切掉某条边的价值为切后两树直径中的最大值。求各个边切掉后的价值和(共N-1项)。 解法一: 强行两遍dp,思路繁琐,维护东西较多: dis表示以i为根的子树的直径,dis2表示切掉以i为根的子树后的直径。 第一遍dp,记录 down[][0]:从i结点向下的最大距离 dow
阅读全文
摘要:某次投了阿里算法岗玩,有一道题是这样的: 某张试卷有20题,做对一个得5分,做错一个得-3分,不做得0分。问:最后得分有几种情况? 随便写个程序暴力算一下即可。 那么如果范围比较大应该怎么办? 今天看《组合数浅谈》(王连笑著,哈尔滨工业大学出版社)里有讲解法。 设有n道题,评分标准如下:每道题答对得
阅读全文
摘要:题意:给定n个数字,你可以从中选出一个数A(不能对该数进行修改操作),并对其它数减小至该数的倍数,统计总和。问总和最大是多少? 题解:排序后枚举每个数作为选出的数A,再枚举其他数, sum += a[i]-a[i]%A;复杂度为O(n^2), 爆炸。 显然应该降至O(nlogn). 枚举每个数a[i
阅读全文
摘要:题意:给一个序列,可以进行若干次操作,每次操作选择一个数让它+1或-1,问最少要几次操作使得序列变为严格单调递增序列。 题解:首先考虑非严格递增序列,则每个数字最终变成的数字一定是该数组中的某个数。那么O(n^2)复杂度dp一下即可。 dp[i][j]表示第i个数变成第j小的数,dp[i][j] =
阅读全文
摘要:题目链接 题意:给定一棵n个结点的树,问:对于每个结点,能否通过删除一条边并添加一条边使得仍是树,并且删除该结点后得到的各个连通分量结点数 <= n/2? 题解:树形dp,两遍dfs,第一遍dfs求得以各个结点为根的子树的结点数,以及各个结点下面切掉某条边后最多可切出多少个结点; 第二遍dfs求得每
阅读全文
摘要:数组A包含N个整数(可能包含相同的值)。设S为A的子序列且S中的元素是递增的,则S为A的递增子序列。如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS)。A的LIS可能有很多个。例如A为:{1 3 2 0 4},1 3 4,1 2 4均为A的LIS。给出数组A,求A的LIS有多
阅读全文
摘要:题意:给你n点m边的图,然后让你确定每条边的方向,使得入度=出度的点最多 。 度数为偶数的点均能满足入度 = 出度。 证明:度数为奇数的点有偶数个,奇度点两两配对连无向边,则新图存在欧拉回路,则可使新图所有点入度 = 出度。 1 #include <bits/stdc++.h> 2 using na
阅读全文
摘要:以下这份代码并没有过。但感觉没有问题。不是蜜汁WA就是蜜汁T。 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 typedef long long ll; 6 using
阅读全文
摘要:题目链接 题意:给定两个长度为n的数组a与长度为m的数组b, 给定一个操作符op满足 x op y = x < y ? x+y : x-y. 有q个询问,每次给出询问c,问:有多少对(i, j)满足a[i] op b[j] = c ? 0 <= c <= 100000, 其余数据范围在[0, 500
阅读全文
摘要:题意:dp[n] = ∑ ( dp[n-i]*a[i] )+a[n], ( 1 <= i < n) cdq分治。 计算出dp[l ~ mid]后,dp[l ~ mid]与a[1 ~ r-l]做卷积运算。 1 #include <bits/stdc++.h> 2 using namespace std
阅读全文
摘要:题意:1~n 的全排列中,有多少个排列满足任意从中间切成两段后,左边段的最大值大于右边段的最小值? 例如:n为3时有3种 2 3 1 3 1 2 3 2 1 解释:比如 2 3 1 (2) (3 1) 1比2小 (2 3) (1) 1比2小 都满足上面的条件。 3 2 1 (3)(2 1) 1比3小
阅读全文
摘要:先简短几句话说说FFT.... 多项式可用系数和点值表示,n个点可确定一个次数小于n的多项式。 多项式乘积为 f(x)*g(x),显然若已知f(x), g(x)的点值,O(n)可求得多项式乘积的点值。 我们所需要的就是O(nlogn)快速地将两个系数多项式表示成点值多项式,O(n)求得乘积的点值表示
阅读全文
摘要:用manacher算法O(n)求出所有的回文半径。有了回文半径后,就可以求出L[i]表示以i结尾的回文串的起始位置的和R[i]表示以i起始的回文串的结尾位置的和,然后就可以求出答案了,这里要注意奇偶长度回文串的不同处理。复杂度O(n) 1 #include<bits/stdc++.h> 2 usin
阅读全文
摘要:取出纵向边按x坐标排序,在y方向上建立线段树。 每次查询当前有效长度len,ans += len*(x[i]-x[i-1]); 其中len为T[rt].len; 查询完毕后更新y方向上线段树,入边+1, 出边-1。 1 #include<bits/stdc++.h> 2 using namespac
阅读全文
摘要:比赛的时候知道用树状数组,但有点乱不知道怎么处理。 统计不同的gcd的个数其实就是用树状数组统计区间内不同的数的模板题啊... 复杂度O(nlogn) 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5+10;
阅读全文

浙公网安备 33010602011771号