遇到的问题


遇到的问题

结构体LIS的问题

已解决

对于$n^2$可以解决的$LIS$问题,可以记录答案数组。

结构体LIS问题,利用二维偏序即可。

记忆化搜索实现起来更加方便,复杂度可能偏大,(递归)。

$O(nlogn+n)$实现LIS加上输出对应答案数组,注意LIS的d[]数组储存的是对应LIS长度的最小末尾元素,要输出答案数组还需要记录每个元素对应的LIS长度。

https://harris.blog.csdn.net/article/details/106444512


$dp$的常见范围 $n^2 (5\times 10^3,10^3)$

https://codeforces.ml/problemset/page/21?tags=dp,1500-2000


子串问题

$n(10^6)$

$O(n)$的递推问题,可能需要用到辅助数组,栈来递推。

如括号匹配的dp问题。

子串的dp问题,往往是类似区间合并,利用辅助数组来合并状态。

C. Looking for Order

状压的好题,跟顺序没有关系,所以可以直接剪枝跑。


给定一棵二叉搜索树的形态和序列,对应的填数是唯一确定的。

D. How many trees? 本题由上述知识可知,题意转化为求$n$个结点组成高度$\ge h$的二叉树形态个数。

树形dp问题:求不相交两个路径最大乘积。

枚举割边,分成两个连通块,然后dfs求两个连通块的直径乘积。

维护一个最大和次大子结点路径。

sum表示该子树的直径:分情况讨论,经过该结点,不过经过该节点。

int dp;
int dfs(int u,int fa){
    int sum=0,mx1=0,mx2=0;
    for(int v:e[u]){
        if(v==fa) continue;
        sum=max(sum,dfs(v,u));//不经过该结点.
        if(dp+1>mx1) mx2=mx1,mx1=dp+1;
        else if(dp+1>mx2) mx2=dp+1; 
    }
    sum=max(sum,mx1+mx2),dp=mx1;
    return sum;
} 

https://codeforces.ml/problemset/problem/14/E

多维dp问题。

波峰,波谷,需要维护最后两个变量来递推。


https://codeforces.ml/contest/16/problem/E

状压dp解决概率问题的好题。

貌似还有一个递推求二进制1的方法。

https://leetcode-cn.com/problems/counting-bits/solution/bi-te-wei-ji-shu-by-leetcode/

复习一波:

int cnt=0;
while(x) x&=x-1,cnt++;
return cnt;

for(int i=1;i<=n;i++)    //O(n)
    bit[i]=b[i>>1]+(i&1);
for(int i=1;i<=n;i++)    //O(n)解决.
    bit[i]=bit[i&(i-1)]+1;

贪心+高精度

https://codeforces.ml/contest/18/problem/D

遇到贡献为2^x 的最值问题,考虑贪心。因为$2^x>2^{x-1}+2^{x-2}\dots 2^2+2^1+2^0$.

此题给贡献从大到小排序,然后贪心地选择,每选择一就将该区间标记。

然后高精度加法预处理 $2^x=2^{x-1}+2^{x-1}$。


https://codeforces.ml/contest/18/problem/E

dp的好题,按行dp,因为每行必须两种颜色,$dp[i][x][y]$


尺取,队列维护区间的答案。

https://ac.nowcoder.com/acm/contest/9983/B


//V>=n下的最小价值,一个限制条件+物品选不选的问题(01背包)


把一个序列切一刀分成两个和相等的子数组,枚举切的位置即可。

把一个序列切两刀分成三个和相等的子数组的方案数:因为子数组的和是可以确定的:$\dfrac{sum}{3}$,然后求可以预处理出前后缀和,后缀和等于$\dfrac{sum}{3}$的个数,枚举对于每个前缀和$=\dfrac{sum}{3}$的位置$i$,有多少个$suf[j]=\dfrac{sum}{3},j\ge i+2$。


==Hint:把一个序列分成两个不相交且非空的和相等子数组的方案数?==

一个暴力的想法,枚举所有区间,然后找另外相等区间与其相等的个数。

复杂度大约在:$O(n^4)$。。。。


求最大零矩阵周长。

暴力$O(nm)^3$,考虑类似二维前缀和$dp$优化。

确定起始点$(i,j)$,终点$(x,y)$成立的条件是$a[x][y]=0$且$dp[x-1][y]$成立且$dp[x][y-1]$成立。

时间复杂度:$O(nm)^2$。


https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/

滑动窗口经典题,维护定长区间的和,找到最值。


https://www.luogu.com.cn/problem/U148619?contestId=40088

断环成链,ST表预处理出区间最值,然后二分找到len. [x-len,x+len],注意因为i!=j,所以是找[i-len,i-1],[i+1,i+len]的区间最值。

ST表习题待练习。


分块(暴力大法好!)待学。

https://www.luogu.com.cn/blog/cyffff/ti-xie-t2-diao-da-post


https://atcoder.jp/contests/abc191/tasks/abc191_c

这是什么神仙思维题??


并查集重新建图跑dfs,注意标记边剪枝叶。

计算sz的时候可以不用再合并的时候算,而是类似桶把s[i]扫一遍。


spfa 可求最长路判正环,求最短路判负环。


背包问题,不能按$\dfrac{value}{weight}$的比值排序贪心做。

只有两种$weight$的背包问题,只需要分组,然后按$value$从大到小排序,然后第一组的个数,确定第二组的个数,取最值即可。


最小有向边生成树,很简单,除了根之外其他每个结点有且仅有一个父亲,所以存一下每个结点的最小边权父亲,然后除了根之外求和。


神奇构造题,用$1\times 2,2\times 1,2\times 2$填矩阵$n\times m$。

1.矩阵面积得为奇数。

2.$n,m$若存在奇数:

$n$为奇数,至少要$a-=\dfrac{m}{2}$

$m$为奇数,至少$b-=\dfrac{n}{2}$。

然后先假设都用$c$涂,一个小$tips$,$4$个$4$个的涂,且相连小正方形不同色,这样便于后面$a,b$来覆盖。


类似归并排序的模拟 比赛排名题,不是很熟。

每轮相邻的人比赛,最开始$(1,2)(3,4)(5,6)\dots$,胜者相邻后的继续比。

则第$k$轮可能比赛的人是$[(x-1)2^k+1,x2^k]$。

都减$1$,$[(x-1)2^k,x2^k-1]$

如何确定两个人是否能在第$k$轮遇到$:\dfrac{a-1}{2^k},\dfrac{b-1}{2^k}$。


构造题杀我。

傻逼树上博弈杀我。

思维杀我。

傻逼数学。

暴力dp是啥玩意,数据结构玩不动。


https://baike.baidu.com/item/%E7%93%B6%E9%A2%88%E7%94%9F%E6%88%90%E6%A0%91/2397900

最小生成树一定是瓶颈生成树。

BZOJ2429

最小支撑树?


image-20210216214054423

https://blog.csdn.net/twtsa/article/details/8120269

极大化子矩形 论文。

悬线法 $O(nm)$

求最大不含障碍的子矩形。

枚举每个点向上扩展的最大高度(矩形的宽)$up[i][j]$,这个递推即可。

然后该悬线能向两边扩展的最大长度(矩形的长)。

递推$l[i][j]=l[i][j-1],r[i][j]=r[i][j+1]$。

$ans=max(ans,up[i][j]\times (r[i][j]-l[i][j]+1))$。

https://www.cnblogs.com/zhenglw/p/10102833.html

单调栈也可解决,还是需要预处理$up[i][j]$,

一行一行的维护,维护一个单调递增栈,当前待处理的矩形高如果$\le$栈顶就更新答案,然后弹出。


基环树,省选-黑题难度,待学。

https://www.luogu.com.cn/blog/ShadderLeave/ji-huan-shu-bi-ji


https://www.luogu.com.cn/blog/xww666/post-tuan-dui-t167649-qu-ti-xie

期望dp,树上高斯消元。


树形dp,好难写。


费用流问题

image-20210217171818968

取反边的费用还有讲究吗?


神仙路径统计问题

https://www.luogu.com.cn/blog/wolfind/yi-suo-ge-lu-jing-ji-shuo-wen-ti


https://leetcode-cn.com/problems/longest-repeating-character-replacement/

滑窗


Hash需要练习


求两点斜率的更好写法。!

会不会有精度误差。


类似线段树的区间修改 lzay tag一样。

树也可以实现 lazy 标记子树操作加。


image-20210221122126105

要初始化才能用。—-


leetcode 的isalpha 大小写都只会返回1024 醉了。


multiset 能logn 维护区间的最大,最小值。

两个单调队列能O(1) 维护最大,最小值。


单调队列能解决的问题:

区间最值。

dp优化:转移时:$dp[i]=max(dp[j])+a[i] ,j\in[l,r]$


区间平均值最大的区间长度 。

假了:肯定是最大那一个数,长度为1是最优的。

定区间 最大值最小。

​ 最小值最大。


常数优化:连续访问内存

$a[20][N]$优于$a[N][20]$。


网络流解决区间差分问题。


关于max,min 的宏定义问题

#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:bd

一般变量,宏定义较快,若参数为函数,因为宏定义在比较时会计算一次,返回计算值时也会计算一次,所以函数会执行两次,若为递归函数,则时间非常可怕。

所以一般还是用自带的比较函数。


lucas定理。

分形递归题。


二维矩形并,交,周长,面积,重合问题。


扩欧复杂度 ? log(a+b)


EK EK EK EK 写板子

Dinic Dinic Dinic Dinic


用了IOS 之后不能用puts 了,不然会出错。

用若干变量初始化 vector

vector<int>v={a,b,c};

表达式排序

sort(a.begin(),a.end(),[](const auto &b,const auto &c){
            return b[0]==c[0]?b[1]>c[1]:b[0]<c[0];
        });

CDQ CDQ CDQ CDQ 分治


有向图求入度为0的点的个数,可以用floyd或者tarjan

并查集可用于无向图判环(因为并查集能维护双向关系),但是不能判自环,因为初始赋值就是。

种类并查集 可以维护 敌对关系,朋友关系,单向关系。


两个栈实现 队列,一个栈为输入栈,另一个栈为输出栈,当输出栈不为空时 pop,peek操作直接取输出栈的栈顶,否则把输入栈的元素都丢入输出栈。

质因数分解求所有质因数复杂度最坏是$\sqrt{n}$的,如$n$为质数。

用埃氏筛可以$O(nloglogn)$预处理出每个数的所有质因数。


循环数组 仍然可以用单调栈求向左/右 第一个比它大/小的元素 ,只需要断环成链即可。


==期望dp==

一般是倒着。

==区间 MEX==

Treap(待复习)

https://www.luogu.com.cn/record/list?user=257206&language=&orderBy=0&page=6


除0错误 也会导致RE


组合数+周期+取模 等问题!


生成函数—–

$n$个结点的二叉树个数$C_n$卡特兰数,$n$个结点所有不同二叉树的叶子总数$nC_{n-1}$


文章作者: Harris-H
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Harris-H !
评论
  目录