摘要:
相当于一个背包问题,设计状态为f[i][j]表示前i个,达到j元的方案,这样记住合法的方案之后除非法方案即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; con 阅读全文
摘要:
我们把每个种族看作一个集合 已知最后他们联通,那么这就意味着他们到达某一点联通的代价是最小的 因此我们枚举所有点,找到最小值。 事实上,最后答案的连通块上面的点都是最小的,他们没有区别 #include<bits/stdc++.h> using namespace std; typedef long 阅读全文
摘要:
这个depth的式子就很有那味,明显就是把他拆分掉,维护0次项,一次项和二次项 因为只能从头,所以递归维护即可,注意到如果小于0了,就把他的贡献剪掉。 我第一次写的时候用了dfs序+线段树维护,复杂度感觉还行,但是内存和常数太大,过不了,只过了70%,这题本来也不用这么麻烦做 数据量给到1e6,用大 阅读全文
摘要:
题目比较水,但是为了给我的tag加点量就水一篇题解 这题一个暴力的贪心就是按照利润排序,然后对于大的利润去找能满足条件的最晚的一天 这样的复杂度比较高,找的过程可以可以用set自带的二分去做,这样就是nlogn了 #include<bits/stdc++.h> using namespace std 阅读全文
摘要:
这题奇数部分比较容易想到,用优先队列维护每个位置前能否取到指定个数,这样枚举每个位置座位中位数即可 对于偶数,由于两个数位置不确定,并且不能枚举两个,因此还是考虑要维护一个 这样就需要一个log复杂度以内的算法找到每个对应的最优解,常见的就是二分算法 我们观察题目性质,果然符合单调性,因为对于左边定 阅读全文
摘要:
我们观察到只有查询操作。 这个查询可以通过线段树来实现,因为可以通过维护最大最小值来维护差值最大值,因为是一个星期,所以容易相当答案是关于周期循环的,因此建立七棵线段树。 恶心的是有两个方向,因此我们要建十四棵线段树维护 #include<bits/stdc++.h> using namespace 阅读全文
摘要:
复健牛客每日一题系列 这题的dp感觉很浓,因为数据范围给的很像dp 刚开始我被能多次操作困惑了,以为是什么巧妙的贪心 但是其实多次能拿,一次也能拿,我们可以通过放的位置控制在m之内 因此这题是一道背包dp,因为每个物品都有三种选择,左边右边或者不放,而第二维状态可以表示为两边的差值 这题会产生负的, 阅读全文
摘要:
虽然题目说着分两种类型,其实就是相当于对于每一行,选择一个矩形去框 那么这样就统一了形式,而我们发现,每一行只跟上一行相关。 还有一个问题是交叉部分的去重,我们发现这有三种情况,因此对于三种情况分别讨论 但是枚举更新复杂度太高,因此想到优化,这种优化比较套路,用线段树求区间最大值就行 #includ 阅读全文
摘要:
B题 双指针+贪心,先按照权值排序,对于每个l,找到最近符合条件的r 注意如果可以不取A,那就别取A #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const 阅读全文
摘要:
因为只有一条路,因此可以发现同一个深度的节点他们的父亲要相同 不同深度的节点,深度大的节点的父亲要在深度小的节点的父亲的子树当中 因此我们需要使用dfn就能查看是否在子树当中 #include<bits/stdc++.h> using namespace std; typedef long long 阅读全文