摘要:
这题动态的难做,因此考虑静态转化,先建成完全的树 之后直接维护,当我们新加入这个点的时候,把这个点的之前权值记录下来 因为这个时候才会被操作影响 #include<bits/stdc++.h> typedef long long ll; using namespace std; typedef pa 阅读全文
摘要:
经典套路 动态开点维护质数个线段树,这样我们每次在质数上插入,只要维护一个最小值查询就能知道对于这个质数的最小的那个是谁 因为一个数分解的质数不会太多,主要是数不大,所以做法合理 #include<bits/stdc++.h> typedef long long ll; using namespac 阅读全文
摘要:
经典双指针分治法,对于每个i,求出最近的r 但是数据比较大,需要一个离散化 #include<bits/stdc++.h> typedef long long ll; using namespace std; typedef pair<int,int> pll; const int N=1e6+10 阅读全文
摘要:
感觉复杂度很有问题的 但是这个算法比较好像,就是先连二分图,从最小权值一直做匹配 数据可能并不是特别强,可能也是确实网络流的算法都是能跑较大数据 #include<bits/stdc++.h> typedef long long ll; using namespace std; typedef pa 阅读全文
摘要:
经典填格子问题,这种题都是推出前面的情况后,再不重复的情况求出后面的递推式 因为本题次数大,因此考虑使用矩阵快速幂优化 #include<bits/stdc++.h> typedef long long ll; using namespace std; const int N=30; const i 阅读全文
摘要:
朴素的思路就是二维dp,表示上次跳了几个 但是这个存不下,又因为题目提示我们第一次一定是D 因此我们第二维表示上次移动了D+j次,这是因为j只要移动250,就能到达终点,因此可以存下 但是可能是负数,因此我们使用坐标系平移 #include<bits/stdc++.h> using namespac 阅读全文
摘要:
先对高度进行排序 之后模拟插入的方法,因为我们要求比自己高的人在前面或者后面有k个 那么如果当给定的k大于n-i那么说明非法,因为只有n-i个空位剩余,做不到要求。 那么接下来我们考虑是前面有k个还是后面有k个,因为我们是按高度来做的,所以对k和n-i-k取个min,使得前面的空位尽可能少,这就是答 阅读全文
摘要:
对于这类问题需要掌握nlog求解最长上升子序列的问题 我们发现可以枚举l后的每个点作为删除后的上升子序列的起点。 因为最后的答案肯定以某个点作为起点,因此我们枚举完就能知道答案 因此我们在删除前的一段中二分找到这个点所在的位置,前后相加-1就是当前的答案 对于所有答案取max即可 #include< 阅读全文
摘要:
如果直接拓扑建图,那么建图复杂度太高,因此我们考虑线段树优化建图 也就是区间连边,这样也能达到对应的目的,因为是单向边,建一个树即可 之后跑一下拓扑排序 #include<bits/stdc++.h> using namespace std; typedef long long ll; typede 阅读全文
摘要:
计数类dp,我们设计状态为以i为根,i所在连通块大小为j的合法方案 枚举他的子树,这条边是否断裂,如果断裂,那么直接乘以子树合法方案,如果不断,那么就是计算贡献 #include<bits/stdc++.h> using namespace std; typedef long long ll; ty 阅读全文