摘要:
传送门 并查集 数据较大 直接用tarjan求联通块会超时 注意到只有删除没有添加 如果是只有添加就很容易用并查集求联通块 所以考虑把过程反过来 即 一开始是没有边的 然后逐渐添加边 把联通块数量存起来 再输出就好了.. 一开始先遍历一遍最终状态,求出联通块数量 然后慢慢加边,存一下答案 顺便注意一 阅读全文
摘要:
传送门 DP 注意虽然数据小但是搜索还是会超时 不能搜索 考虑DP: 但如果强行DP还是不够 那考虑优化: 每个格子只有两种状态: 选 or 不选 (当然如果这个格子是"贫瘠的"就一定不能选) 明显可以用一个2进制表示 而整行的状态就可以用一串2进制表示 状态的压缩就完成了 可能有人会疑惑n,m最大 阅读全文
摘要:
传送门 二分图 稍微讲一下二分图: 就是一个图分成两个部分A和B,这个图的无向边只连接不同的两个部分,即边不能在A或B的内部自己连自己 然后问你最大能找到多少匹配 匹配是指 A中的一个点与B中的一个点有边 并且 这两个点都还没有与其它点匹配 这种问题一般用匈牙利算法: 匈牙利算法的思想很简单 对于一 阅读全文
摘要:
传送门 主席树解法设las[ i ]表示数列中第 i 个数的值 上一次出现的位置,num[ i ]为原数列中第 i 个数的值1. 把 从第 1 到第 i 个数的 las 的值 的出现次数 建立一个线段树那么第 i 个叶子节点 i 就表示 las 值为 i-1 的出现次数对于序列 1 2 1 3 4 阅读全文
摘要:
传送门 显然是DP容易想到状态压缩:按行处理,按列表示状态状态显然,这一列放0个,放1个,放2个然而还是不够..继续优化换种思路:设f[i][j][k]表示处理到第i行,并且这i行m列中有j列放了一个棋子,k列放了2个棋子,其他的没放。好了状态出来了转移也就好写了..看代码就好了..可以用滚动数组, 阅读全文
摘要:
传送门 DP每次向下一格,显然是DP方程也十分显然:设$f[i][j]$为到第$i$行第$j$列时能得到的最大价值显然$f[i][j]=max(f[i-1][k]+v[i][j]),( max(0,j-t)<=k<=min(m,j+t) )$然后40分,其他超时..考虑优化方程稍微变一下:$f[i] 阅读全文
摘要:
传送门 DP数列长度过大无法枚举,考虑DP设f1[i]储存以第i个字符为结尾时,的最后一个数最小时,这个数的开头的位置(很难想有木有)OK,状态有了,方程想一想就出来了:设$num[i][j]$为数列中从i到j的数连起来后的值,$len$为数列长度则如果$num[ j ][ i ]>num[ f1[ 阅读全文
摘要:
传送门 DP其实主要是单调队列..数据最大为一千,考虑O(n^2)的做法在a*b的矩形中找出n^n的正方形再怎么样至少也要把a和b分别枚举吧。必须考虑O(1)处理单个正方形最大最小值。容易发现正方形大小不变为n,如果只看一行,就是滑动窗口,那么处理单个正方形最大最小值时间复杂度为O(n);仔细思考后 阅读全文
摘要:
传送门 现在看看自己早期的题解真是惨不忍睹...(upd in 2019.8.11) 算法 最短路+DAG上的dp+建图 思路 首先是求最短路,但是题目没给出边的范围,所以我选用 $Dijkstra$ 求最短路,SPFA可能会爆炸 先分别求出以两个人为起点的单源最短路径,然后判断一条边 $(a,b) 阅读全文