随笔分类 -  基础—贪心

摘要:首先O(n^3)的贪心很好想,就是枚举k然后从前往后扫,扫到反就翻转区间 然后考虑优化掉翻转区间维,就是搞成差分的形式,在翻转区间的尾部打上标记,再用一个变量维护当前的翻转次数,加到当前状态上来判断是否需要翻转即可 cpp include include include using namespac 阅读全文
posted @ 2018-05-25 18:09 lokiii 阅读(198) 评论(0) 推荐(0)
摘要:按左端点排序,贪心的选即可 cpp include include include using namespace std; const int N=10005; int n,l,p,ans; struct qwe { int x,y; }a[N]; bool cmp(const qwe &a,co 阅读全文
posted @ 2018-05-09 16:10 lokiii 阅读(113) 评论(0) 推荐(0)
摘要:二分答案,贪心判定 阅读全文
posted @ 2018-05-09 15:40 lokiii 阅读(117) 评论(0) 推荐(0)
摘要:长得挺唬人的贪心,按照右端点排序,用最小值线段树的询问判断当前牛是否能放进去,能的话更新线段树,ans++ 来自https://www.cnblogs.com/rausen/p/4529245.html非常严谨的证明 阅读全文
posted @ 2018-05-06 15:12 lokiii 阅读(127) 评论(0) 推荐(0)
摘要:洛谷上能过的最大流bzoj上T了……但是贪心做法明明在洛谷上比最大流要慢啊……如果是最大流的话就是裸题了吧 说一下贪心,就按照防晒霜排序,然后对每一个防晒霜选一头可以使用的且r最小的牛 就,没了。 贪心 阅读全文
posted @ 2018-05-06 11:09 lokiii 阅读(188) 评论(0) 推荐(0)
摘要:从小到大排个序,然后能选就选 阅读全文
posted @ 2018-05-05 11:48 lokiii 阅读(154) 评论(0) 推荐(0)
摘要:还以为是dp呢 首先默认答案是n 对于一个影子,如果前边的影子比它高则可以归进前面的影子,高处的一段单算; 和他一样高的话就不用单算了,ans ; 否则入栈 阅读全文
posted @ 2018-05-04 21:56 lokiii 阅读(137) 评论(0) 推荐(0)
摘要:脑子一抽写了个堆,发现不对才想起来最值用二分 然后判断的时候贪心的把不合mid的区间打通,看打通次数是否小于等于m即可 阅读全文
posted @ 2018-05-04 16:52 lokiii 阅读(141) 评论(0) 推荐(0)
摘要:高端贪心,好久没写splay调了好久…… 以下v为价格,w为鲜嫩度 把牛和草都按v排升序,扫草,首先把v小于等于当前草的牛都丢进splay,这样一来splay里全是可选的牛了,按w排序,然后贪心的为当前的草取牛:w小于等于当前草的w的牛,取出来删除,ans加上当前草的价格(没有则跳过) 取牛的时候统 阅读全文
posted @ 2018-05-04 16:34 lokiii 阅读(183) 评论(0) 推荐(0)
摘要:dfs,如果一个点的儿子、本身、父亲都没有塔,就在父亲上建一个 原理不明…… cpp include include using namespace std; const int N=10005; int n,h[N],cnt,ans; bool v[N]; struct qwe { int ne, 阅读全文
posted @ 2018-05-03 19:58 lokiii 阅读(122) 评论(0) 推荐(0)
摘要:仿佛学到了贪心的新姿势…… 考虑相邻两头牛,交换它们对其他牛不产生影响,所以如果交换这两头牛能使这两头牛之间的最大值变小,则交换 阅读全文
posted @ 2018-05-03 19:26 lokiii 阅读(162) 评论(0) 推荐(0)
摘要:按s从大到小排序,逆推时间模拟工作 阅读全文
posted @ 2018-05-03 07:58 lokiii 阅读(133) 评论(0) 推荐(0)
摘要:因为交换相邻两头牛对其他牛没有影响,所以可以通过交换相邻两头来使答案变小。按照a.t b.f排降序,模拟着计算答案 cpp include include include using namespace std; const int N=100005; int n; long long ans,su 阅读全文
posted @ 2018-05-02 22:00 lokiii 阅读(175) 评论(0) 推荐(0)
摘要:这个题方法还挺多的,不过洛谷上要输出方案所以用堆最方便 先按起始时间从小到大排序。 我用的是greater重定义优先队列(小根堆)。用pair存牛棚用完时间(first)和牛棚编号(second),每次查看队首的first是否比当前牛的起始时间早,是则弹出队首记录当前牛的答案,再把新的pair放进去 阅读全文
posted @ 2018-05-02 21:19 lokiii 阅读(198) 评论(0) 推荐(0)
摘要:先按照时间顺序加,价值塞进小根堆里,碰到不合法情况就从堆里减去 阅读全文
posted @ 2018-04-27 17:46 lokiii 阅读(172) 评论(0) 推荐(0)
摘要:不知道算不算博弈 很妙的贪心,一直在想SG函数结果... 首先从大到小排个序,然后考虑当前的人要怎么选:如果不选最后一段,那么另一人会选,这样不利于当前的人,所以每个人一定会选最后一段 设f[i]为要选i了,先手的最大差,显然是max(a[i] f[i 1],f[i 1]),就是先手只选了最后一个和 阅读全文
posted @ 2018-04-26 17:58 lokiii 阅读(144) 评论(0) 推荐(0)
摘要:先打能回血的,按消耗从小到大打; 然后按回血量降序打剩下的(把消耗和回血反着看就是上一种怪,打法一样); 中间体力小于0就输出无解 cpp include include include using namespace std; const int N=100005; int n,t1,t2; lo 阅读全文
posted @ 2018-04-26 12:04 lokiii 阅读(159) 评论(0) 推荐(0)
摘要:关于没有忍者的区间用线段树判就好啦 然后把剩下的区间改一改:l/r数组表示最左/最右没被删的点,然后删掉修改后的左边大于右边的;l升r降排个序,把包含完整区间的区间删掉; 然后设f/g数组表示i前/后的最少需要忍者数,这个贪心来转移即可,就是把忍者放在区间的最右/左位置 然后对于每个r判断。为什么是 阅读全文
posted @ 2018-04-15 22:08 lokiii 阅读(171) 评论(0) 推荐(0)
摘要:先把水泥路建生成树,然后加鹅卵石路,这里加的鹅卵石路是一定要用的(连接各个联通块),然后初始化并查集,先把必需的鹅卵石路加进去,然后随便加鹅卵石路直到k条,然后加水泥路即可。 注意判断无解 cpp include include using namespace std; const int N=20 阅读全文
posted @ 2018-04-13 22:07 lokiii 阅读(194) 评论(0) 推荐(0)
摘要:数组若干+手动二分一个的算法,bzoj rank8 ===============================废话分割线=================================== 我我我我我!一定要说一下我的心路历程!我只用了几个数组和一个手动二分!在洛谷和bzoj都过了所以应该是对 阅读全文
posted @ 2018-04-11 17:33 lokiii 阅读(170) 评论(0) 推荐(0)