摘要: dp,用f[i]表示i划分的方案,直接枚举最后一个数是错误的,因为会导致c重复计数,然后正解十分神奇——当i为奇数,那么分解中一定有1,因此f[i]=f[i-1]当i为偶数若有1,同样转移到f[i-1];没有1,可以将所有因数除以2,即f[i]=f[i-1]+f[i/2],注意对1e9取模 1 #i 阅读全文
posted @ 2019-11-13 17:34 PYWBKTDA 阅读(99) 评论(0) 推荐(0)
摘要: 按照Di排序,从小到大枚举物品,考虑如果直接能选就选上,不能选就考虑替换之前价值最小的来选(显然一定是可行的,只需要在原来选价值最小的时候选这个就行了),这个东西用堆来维护即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 阅读全文
posted @ 2019-11-13 15:38 PYWBKTDA 阅读(121) 评论(0) 推荐(0)
摘要: 初始如果没有限制,很显然每一头牛高度都是h当只有一个限制,让h[a]到h[b]的高度都减1即可容易发现两个限制不会相交(否则必然矛盾),只会包含或相离,因此没有影响,直接差分/线段树即可(注意:1.不保证a<b;2.可能会有重复) 1 #include<bits/stdc++.h> 2 using 阅读全文
posted @ 2019-11-13 15:12 PYWBKTDA 阅读(144) 评论(0) 推荐(0)
摘要: 很显然是一个最小割的模型,将网格图黑白染色分为两类,黑的向S连工业费用,向T连商业费用,白的反过来即可然后对于相邻的点,连上两个点的C之和(因为会产生两个),当然也可以变成两条边,就不需要存下C矩阵了 1 #include<bits/stdc++.h> 2 using namespace std; 阅读全文
posted @ 2019-11-13 11:55 PYWBKTDA 阅读(158) 评论(0) 推荐(0)
摘要: 构建一棵trie树,然后每一个点的次数*深度取max即可(然而这道题并没有这么简单)首先字符串长度为500000,字符类型52种,需要用邻接表存储(用map就别想了)然后字符串的读入十分麻烦,需要用getchar来读入,还要判掉多余回车最后还有点卡常,要注意常数 1 #include<bits/st 阅读全文
posted @ 2019-11-13 10:23 PYWBKTDA 阅读(134) 评论(0) 推荐(0)
摘要: 根据purfer序列的原理,每一个purfer序列都一一对应了一棵树,每一个点在purfer序列中出现的次数就是它的度数,那么直接用组合数去计算即可,注意要加高精度 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 str 阅读全文
posted @ 2019-11-13 09:47 PYWBKTDA 阅读(137) 评论(0) 推荐(0)
摘要: 考虑将奶牛和牧草放在一起,根据鲜嫩程度排序,那么显然就可以发现一个贪心策略:每一头奶牛一定选择当前剩余的最便宜且符合条件的牧草,然后用一个set维护价格即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int id, 阅读全文
posted @ 2019-11-13 09:30 PYWBKTDA 阅读(116) 评论(0) 推荐(0)
摘要: 先考虑边的代价,容易发现每一条边都需要走两次,也就是2*边权再考虑点的代价,由于上面的结论,那么就是度数*点权然后就可以构造新的边权为2*原边权+连接点的点权,然后求最小生成树即可注意根还有一个点权,所以再加上根(也就是最小点)的点权即可 1 #include<bits/stdc++.h> 2 us 阅读全文
posted @ 2019-11-13 07:45 PYWBKTDA 阅读(160) 评论(0) 推荐(0)
摘要: 记每一个数向比他大的数合并时的代价为这个数字的代价,显然除了最大值以外,每一个数都有一个代价,那么这个代价和就是最终答案考虑最小化这个代价和,也就是让每一个数的代价最小,显然这个代价不会小于向左和右第一个比他大的数中较小的数,然后这样的方案也很好构造,这个东西用单调栈来处理即可 1 #include 阅读全文
posted @ 2019-11-13 07:24 PYWBKTDA 阅读(122) 评论(0) 推荐(0)