
ACM训练
文章平均质量分 94
mr.chen116
要成为一条有梦想的蒟蒻
展开
-
一些干净的DP题目
Making the Grade给一个长为n(n<2000)的序列A,将其变成一个非增或非减的序列B的绝对值改变量。key:B中所有的数都是A中的数。因为若al<b<ara_l<b<a_ral<b<ar时,总能令b变成其中一个值。则枚举bib_ibi为每个A中的值即可。dp[i][j]表示bi≤unqjb_i≤unq_jbi≤unqj时,目前的最小代价。// #include<bits/stdc++.h>#include<ios原创 2021-03-02 16:11:57 · 393 阅读 · 0 评论 -
图上DP
文章目录DAG上DP拓扑序SPFA普通图上DPSPFA记忆化搜索DAG上DP先对图进行预处理,再进行DP。一般都有两种套路,拓扑序或如Dijkstra或SPFA的最短路算法。拓扑序P4645 [COCI2006-2007 Contest#3] BICIKLI题意:一个有向图中,1->2之间有多少条不同路径。(有可能是0或inf)思路:在1->2的任意路径上有环即为inf。但是环若是在死路上就没影响。所以先在正向图从1开始DFS所有点,并标记1。在反向图从2开始DFS所有点,并标记为2原创 2021-03-02 16:11:06 · 1144 阅读 · 0 评论 -
图转树,边化点
文章目录[2016-2017 ACM-ICPC CHINA-Final G. Pandaria](https://codeforces.com/gym/101194/problem/G)\[AMPPZ2014\]Petrol2016-2017 ACM-ICPC CHINA-Final G. Pandaria题意:给一个nnn个点,mmm条有权边的无向图。每个点有一个颜色。多次查询在线查询x wx\ wx w,从xxx出发,只能走边权小于等于www的边,可以到达的所有点中数量最多的颜色原创 2021-02-25 23:05:42 · 2701 阅读 · 0 评论 -
DP的优化(斜率优化)
斜率优化[HNOI2008]玩具装箱TOY易得朴素思路,但时间复杂度超过1e8。dp[i]=min(dp[j]+(sum[i]+i−sum[j]−j−L−1)2),i>jdp[i]=min(dp[j]+(sum[i]+i−sum[j]−j−L−1)^2),i>jdp[i]=min(dp[j]+(sum[i]+i−sum[j]−j−L−1)2),i>j设Ai=sum[i]+i,Bj=sum[j]+L+j+1A_i=sum[i]+i, B_j=sum[j]+L+j+1Ai=sum原创 2021-01-27 16:38:15 · 401 阅读 · 0 评论 -
计算几何知识
直线和线段是否相交跨立实验,judge_point其中一个为0,或者异号。struct Point{ double x,y; Point operator- (const Point &v) const { return Point{x-v.x, y-v.y}; } int operator* (const Point &v) const { double flag = x*v.y - y*v.x; if(a原创 2020-11-06 15:41:41 · 324 阅读 · 0 评论 -
计算几何题集
判断点和射线的那边向量叉乘判断符号解决。向量叉乘使用右手法则。v1=(x1,y1),v2=(x2,y2)v1×v2=x1∗y2−y1∗x2v_1=(x1,y1),v2=(x2,y2) \\v1×v2=x1*y2-y1*x2v1=(x1,y1),v2=(x2,y2)v1×v2=x1∗y2−y1∗x2例:HDU 6857 依次给出三个点,求是顺时针旋转还是逆时针。s=v13×v23=(x1−x3)(y2−y3)−(y1−y3)(x2−x3)s=v_{13}×v_{23}= (x1-x3)(原创 2020-11-06 15:40:45 · 389 阅读 · 0 评论 -
K-D树
K-D树dim维空间中,维护一堆点,可以快速查询离某个点最近的点。建树。第a层按照第a%dim维中值分为左子树和右子树,O(nlogn)O(n\log n)O(nlogn)删除和新增节点。替罪羊树的思路,删除即标记已删除,新增直接插入。不平衡就拆掉这个子树重建。查询。按照每个点在树节点那一维的左边还是右边,先查那一个子树,再判断全局最小距离比查询点到分界线的距离大,则再查另外一个子树。#include <bits/stdc++.h>#define endl '\n'#defi原创 2020-11-05 20:43:18 · 131 阅读 · 0 评论 -
树形结构
树上背包P2014 [CTSC1997]选课n+1个节点选m+1个节点,让权值之和最大。选子节点要先选父节点。#include<bits/stdc++.h>using namespace std;#define endl '\n'using ll = long long;using pii = pair<int,int>;const int maxn=1e5+3;const ll mod=1e9+7;vector<int> G[305];int n,原创 2020-11-04 16:42:36 · 556 阅读 · 0 评论 -
数位DP
Windy 数Windy定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为2的正整数被称为Windy数。Windy想知道,在A和B之间,包括A和B,总共有多少个 Windy 数?#include<bits/stdc++.h>using namespace std;int f[12][12],digit[12],cnt;int dfs(int x,int st,int op){ // x为当前为第几位 st为前缀状态 op表示前缀和当前求解的数字的关系,1为相同 0为小于原创 2020-09-26 16:00:30 · 215 阅读 · 0 评论 -
HDU 5936 折半枚举法
Differencekk说是16年CCPC杭州赛的银牌题给定x,K(x<109,1≤K≤9)x,K(x<10^9,1≤K≤9)x,K(x<109,1≤K≤9)求满足x=f(y,K)−yx=f(y, K)-yx=f(y,K)−y的所有正整数y的数量。f(y,K)=∑z in every digits of yzK(f(233,2)=22+32+32=22)f(y, K)=\sum_{z \text { in every digits o原创 2020-09-24 18:51:08 · 220 阅读 · 1 评论 -
HDU 1400 插头DP,状压DP
HDU 1400状态压缩DP逐行进行。详细看注释。跑出4s。Q_Q#include<bits/stdc++.h>#define debug(_x) cout<<#_x<<":"<<_x<<endl#define endl '\n'using namespace std;using ll = long long;ll f[2][1<<12],*f1,*f0;int n,m;bool judge(int s,int t)原创 2020-08-20 02:57:30 · 432 阅读 · 0 评论 -
笛卡尔树
定义笛卡尔树是一种key的二叉搜索树,val的小顶堆,Treap是特殊的笛卡尔树。如图,中序排序为key(此处为序列下标)的升序排列,且父节点的val小于子节点的val。构造使用栈始终维护以根节点为开始的右链。按key从小到大依次入栈。加入点u时,找到栈中第一个val小于val[u]的点x。把x的右儿子变成点u的左儿子,点u作为点x的右儿子。(保持中序遍历key有序)。应用HDU 1506...原创 2020-08-15 14:19:25 · 278 阅读 · 0 评论 -
HDU 1506 单调栈,笛卡尔树,DP
题目如图,求最大的矩形面积。单调栈维护一个单调递增的栈。当新进来的数小于前面的,前面的高出部分已经起不到作用了。故在加入新的前,弹出所有高出的元素,统计答案。再加入新的值,把宽度设成刚刚弹出的宽度加1。O(n)O(n)O(n)#include <bits/stdc++.h>#define debug(__x) cout<<#__x<<"="<<__x<<endl#define endl '\n'using namespace std原创 2020-08-15 14:18:53 · 234 阅读 · 0 评论 -
组合数学
超级易懂的link题目HDU 2082直接把不同字母的多项式相乘就行,模板题如只有2个a,3个c,1个g(x0+x1+x2)(x0+x3+x6+x9)(x7)(x^0+x^1+x^2)(x^0+x^3+x^6+x^9)(x^7)(x0+x1+x2)(x0+x3+x6+x9)(x7)#include<bits/stdc++.h>using namespace std;typedef long long ll;int num[30]; // 每个字母的数量ll sup[55原创 2020-08-11 00:06:29 · 165 阅读 · 0 评论 -
树上差分
差分差分是前缀和的逆运算。d1...nd_{1...n}d1...n是差分数组,a1...na_{1...n}a1...n是原数组。关系如下式。di=ai−ai−1d_i=a_i-a_{i-1}di=ai−ai−1则通过d1...nd_{1...n}d1...n数组求aia_iai,为求d1...nd_{1...n}d1...n数组的前缀和。ai=∑j=1idja_i = \sum_{j=1}^id_jai=j=1∑idj通过d1...nd_{1...n}d1...n原创 2020-08-10 23:26:54 · 334 阅读 · 0 评论 -
A* & IDA*搜索
f(n)=g(n)+h(n)f(n)=g(n)+h(n)f(n)=g(n)+h(n)不但考虑前向代价,而且考虑后向代价。由于后向代价不可知,因而需要使用估价函数。题目HDU 6181求次短路,先反向SPFA准确求出h(n)h(n)h(n)准确的后向代价,再用A*搜索,第几次去到终点就是第几短路。#include<bits/stdc++.h>using namespace s...原创 2020-08-09 14:17:46 · 235 阅读 · 1 评论 -
矩阵树定理求图的生成树数量
矩阵树定理MMT=LMM^T=LMMT=L即det(L0)det(L_0)det(L0)就是生成树的数量。原创 2020-08-08 22:04:17 · 1318 阅读 · 0 评论 -
线性基
解决的问题是1给一堆数可不可以异或出某个数xxx,2这堆数的最大异或和。原理: 把原序列AAA,转化成序列PPP,使得PiP_iPi的最高位为第iii位,使得AAA上的异或和的值域与PPP上一样。构造: 对于AAA中每新增加的一个数,都从他的最高位开始遍历PPP,若Pi≠0P_i\not =0Pi=0,则v=v⊗Piv=v\otimes P_iv=v⊗Pi,继续一直找到不为0的PiP_iPi,令Pi=vP_i=vPi=v。void ins(LL v){ for(int i=51;i&原创 2020-08-08 17:10:29 · 115 阅读 · 0 评论 -
寒训day5 图的存储 & SEARCH & 最短路
图的存储邻接矩阵一个简单粗暴的二维数组。一般只会在Floyd算法有用到,适合稠密图。G[u][v]=1; //表示u-&amp;gt;v有一条长为1的边链式前向星最常用到的存图方式,用静态链表前插元素的方式存储图。在Dijkstra算法与SPFA中我都用这种方式,适合稀疏图。邻接表emmm…大概是链表数组,第一维描述点,第二维记录点所对应的边。操作比较麻烦,还要动态开点。适合稀疏图。...原创 2019-03-17 23:34:55 · 123 阅读 · 0 评论 -
KMP算法
前言虽然之前有用过,但是只是知道原理,求next数组的部分有点模糊。本篇详讲。某大牛解释原创 2019-03-17 23:36:08 · 112 阅读 · 0 评论 -
寒训day9 初等数论
enen欢迎使用Markdown编辑器新的改变威尔逊定理功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Mar...原创 2019-06-09 23:56:53 · 218 阅读 · 0 评论 -
LCA
BB众所周知,LCA有N种方法。一种种慢慢学。。。方法1. 倍增求法2. 待续…Problem ListPOJ 1986//POJ 1986 lca模板#include<bits/stdc++.h>using namespace std;const int maxn=4e4+5;struct Edge{ int to; int len;};vector...原创 2019-07-18 16:41:58 · 89 阅读 · 0 评论 -
主席树
梦寐中的主席树!啊!原来好简单!大致知识权值线段树离散化每加一个点新建一条根到叶的路实现用NlogN空间存N个权值线段树查询[x,y],用第y棵树与第x-1棵树做差完事~Problem List洛谷P3834 主席树模板HDU 4417 Super Mario//Luo P3834#include<bits/stdc++.h>using namespac...原创 2019-07-18 22:09:45 · 126 阅读 · 0 评论 -
数学
给定n个点,确定一个多项式(最高次为n-1),并将k代入求值公式F(k)=∑i=1nyi∏i≠jk−xjxi−xjF(k) =\sum_{i=1}^n y_i \prod_{i =\not j} \frac{k-x_j}{x_i-x_j}F(k)=i=1∑nyii≠j∏xi−xjk−xj...原创 2019-08-09 01:59:04 · 175 阅读 · 0 评论 -
数论
参考https://www.cnblogs.com/Rye-Catcher/p/8478936.html原创 2019-08-28 16:54:13 · 154 阅读 · 0 评论 -
SZU寒训day1
SZU寒训day1introductionday1的主要内容是贪心、二分、三分、快速幂。本文纯属做个回顾。贪心贪心就是用当前最优来替代整体最优啦。但是不是所有地方都可以这么用,要自行证明当前最优时整体解必然最优。二分二分查找时间复杂度:O(logn) 当然很多时候还需要一个O(nlogn)的快排二分答案用于答案有一定范围?验证答案的函数是单调的?(比如求minimax或maxi...原创 2019-03-18 17:04:27 · 274 阅读 · 2 评论