摘要:
题目大意:需要维护一个支持以下操作的数据结构:(1)支持插入一个字符串(2)支持删除所有前缀等于给定字符串的单词(3)查询该数据结构中是否存在一个以给定字符串为前缀的字符串 题解:由题目可知,需要维护数据结构就是一棵字典树。其中,支持插入和查找操作是字典树中的基本操作,即:在 Trie 的每个顶点处 阅读全文
摘要:
Update at 2019.10.9 主席树的核心思想是多棵权值线段树对区间的划分具有一致性,且相同区间的值具有可减性。 可持久化的思想体现在对任意区间 $[l,r]$ 的处理上。 代码如下 cpp include using namespace std; const int maxn = 2e5 阅读全文
摘要:
题目大意:给定一个长度为 N 的序列,从序列中任意挑出三个数,求满足中间的数字值最小(最大)有多少种情况。 题解:建立在值域上的树状数组,从左到右扫描一遍序列,统计出每个点左边有多少个数大于(小于)该点的值,再从右到左扫描一遍序列,统计出每个点右边有多少个数大于(小于)自己,最后计算答案贡献即可。 阅读全文
摘要:
题目大意:给定 N 个物品,每个物品有两个维度的费用,有两个维度的价值,求在有一定费用基础的前提下,满足其中一个维度的价值最大化的前提下,第二个维度的价值最小是多少。 题解:由于是两个维度的价值,因此在 dp 转移决策阶段需要发生改变,来满足题目需求。 题目要求的是在最优化一个变量的时候可以最优化另 阅读全文
摘要:
题目大意:求给定的一张无向带权图的次短路。 题解:先跑一遍 spfa 求出从起点到终点的最短路,记录路径。接着枚举删边,并重新跑 spfa,统计最小值即可。 至于为什么 dp 做法不行,暂时还不清楚。 代码如下 阅读全文
摘要:
题目大意:输出仅由 0 和 1 组成的长度为 N 的字符串个数,并且其中不能含有 3 个连续的相同子串。 题解:数据太水,正规解法应该是枚举后缀进行判断。 代码如下 cpp include using namespace std; const int maxn=31; int n,s[maxn],a 阅读全文
摘要:
update:2019.3.13 代码如下 cpp include using namespace std; const int maxn=1e7+10; int n,m; bool vis[maxn]; void read_and_parse(){ scanf("%d%d",&n,&m); vis 阅读全文
摘要:
核心思想:每个和数都被自己最小的素数因子筛掉。 代码如下 cpp include using namespace std; const int maxn=1e7+10; int n,m,p[maxn 3],cnt; bool vis[maxn]; void read_and_parse(){ sca 阅读全文
摘要:
题目大意:给定一个大小为 N 的集合,每次可以从中挑出 2 个或 3 个数进行合并,合并的代价是几个数的权值和,求将这些数合并成 1 个的最小代价是多少。 引理:K 叉哈夫曼树需要保证 $(n 1)\%(k 1)=0$,在此基础上,每次取 K 个合并即可得到最小代价。 代码如下 cpp includ 阅读全文
摘要:
题目大意:给定一个 N 个点的无向完全图,边有两个不同性质的边权,求该无向图的一棵最优比例生成树,使得性质为 A 的边权和比性质为 B 的边权和最小。 题解:要求的答案可以看成是 0 1 分数规划问题,即:选定一个数 mid,每次重新构建边权为 $a[i] mid b[i]$ 的图,再在图上跑一遍最 阅读全文