摘要:
A - Reachable Towns 参考了题解:单调栈+并查集 这题一开始用的是O(n^2)枚举+并查集,T掉了 做法: 对原序列的第一维坐标升序排序,维护一个以第二维坐标为参照的单调不增的单调栈,栈中存放(pos, y)二元组,这个表示城市pos所在的集合中最小的y坐标。 #include<i 阅读全文
摘要:
问题描述 炫炫回了内蒙,肯定要吃羊肉啦,所有他家要宰羊吃。 炫炫家有N只羊,羊圈排成一排,标号1~N。炫炫每天吃掉一只羊(这食量!其实是放生啦),吃掉的羊的邻居会以为它被放生了,然后又会告诉他们的邻居,这样一直传播下去,除非某个邻居已经被“放生”了。每一天,所有知道某羊被“放生”了这个消息的羊都会很 阅读全文
摘要:
问题描述 小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。 小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。 这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。 阅读全文
摘要:
注意:f(i, j)这个集合表示所有从0走到j的所有走法中走过i(二进制表示)中点的所有走法的集合,其中最后一步走到了j。一定要注意i仅仅表示走过了哪些点,而不代表走的顺序(可以是任何的合法顺序)。 #include<iostream> #include<cstring> using namespa 阅读全文
摘要:
#include<iostream> #include<cstring> using namespace std; const int N = 6010; int h[N], e[N], ne[N], idx; int w[N]; int n; int f[N][2]; int st[N]; voi 阅读全文
摘要:
#include<iostream> using namespace std; const int N = 1010; char a[N], b[N]; int n, m; int f[N][N]; int main(){ scanf("%d%s%d%s", &n, a + 1, &m, b + 1 阅读全文
摘要:
#include<iostream> using namespace std; const int N = 1010; char a[N], b[N]; int n, m; int f[N][N]; int main(){ cin >> n >> m; scanf("%s%s", a + 1, b 阅读全文
摘要:
数据范围10^5, 所以考虑O(nlogn)或者O(n)的复杂度,所以最多枚举一个数组。 到底是枚举数组a,还是b还是c 要求满足ai < bi < ci 如果枚举a,那么由于b和c之间存在限制,即对b和c的选择不独立,所以不可以用乘法原理 而枚举b的话,a和c是独立的, 可以用乘法原理。 前缀和O 阅读全文
摘要:
a[1] ~ a[N]存储1~N的一个排列 枚举一个区间[l, r]:a[l], a[l + 1], ..., a[r], 如果区间[l, r] 的max - min = r - l可以推出[l, r]为一个连号区间。 证明: $因为数组a存储1到N的全排列,所以a[l] - a[r]中不存在重复元 阅读全文
摘要:
思想:贪心+二分$O(nlogn)$ 末尾小的lis比末尾大的lis更优,因为他有希望去更新出更长的最长上升子序列 b[i]表示长度为i的最长上升子序列中末尾元素的最小值,b[i]单调增(用二分的条件,这个东西要证明) #include<iostream> using namespace std; 阅读全文