![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
贪心
Love_xyh
这个作者很懒,什么都没留下…
展开
-
CF1029E Tree with Small Distances
记根节点的深度为1。对于深度>3且当前深度最大的若干点来说,想要使得它们与根节点距离不超过2,只有两个选择:1.向它们连边;2.向它们的父节点连边。显然是向父节点连边优秀,因为向父节点连边,可以消掉最深节点的兄弟节点和祖父节点;而向最深节点连边,则只能消掉最深节点本身和父节点。所以我们把不符合要求的点放入堆中,不断取出堆中深度最大的节点,向该节点的父节点连边,并消除能消除的点(即与父节点相邻的点),同时记录总次数即可。#include <bits/stdc++.h>using n原创 2020-10-09 23:29:07 · 101 阅读 · 0 评论 -
CF566A Matching Names
将字符串的信息放到trie树以后,贪心地合并深度最深的姓名和笔名。若某深度中有一些姓名和笔名剩余,那么就将剩余的部分上传至深度减一的节点中去,企图与深度减一的姓名和笔名进行合并。#include <bits/stdc++.h>#define ll long longusing namespace std;const int N=8e5+5;int n;ll ans;int tot,ch[N][26];vector<int>cnt[N][2];string s;st原创 2020-10-06 21:21:30 · 777 阅读 · 1 评论 -
CF1399E2 Weights Division (hard version)
与E1的不同在于对不同的边进行操作的花费数,有1和2两种。如果按照E1的类似方法做,貌似挺麻烦的,要用好几个堆来维护。先来考虑一下最后的答案是怎么产生的。很明显,是对操作一次花费为1的边进行了a次操作,对操作一次花费为2的边进行了b次操作。而a和b我们都不知道。不过可以肯定的是这a次一定是要对每次操作减去的贡献最多的边进行,b次也是如此。然后我们可以想到,把进行一次操作花费为1的边和花费为2的边分成两部分。我们枚举一次花费为1的边要操作几次,然后对于一次操作花费为2的边操作几次,二分得到答案。一眼看原创 2020-09-06 18:08:07 · 190 阅读 · 0 评论 -
CF1399E1 Weights Division (easy version)
我们先处理出每一条边会对花费产生几次贡献。然后把每一条边按照:进行一次操作减去的花费,从大到小放出大根堆中。不断取出堆中最大,减去变小的贡献,然后重新放入贡献变小后的这个元素。直至符合条件。#include <bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+5; int T,n,s,u,v,w,ans,sum;int size[N];int cnt,head[N];struct edge原创 2020-09-06 17:51:44 · 132 阅读 · 0 评论 -
CF842C Ilya And The Tree
贪心思想考虑:对于长度大于1的链来说,都要删掉一个节点,这样会更优。我们发现对于每一个节点,不同的gcd最多存在log200000个,所以记录vis[u][pd][now]表示:遍历完1到u节点,是否有一个点已经删掉,当前gcd为now的状态是否出现过。记忆化搜索。#include <bits/stdc++.h>using namespace std;const int N=2e5+5;int n,u,v; int ans[N],a[N];map<int,bool>vi原创 2020-08-31 02:52:00 · 118 阅读 · 0 评论 -
洛谷 P1987 摇钱树
思考:有很多同学问为什么最后要在1-k中扫一遍,他们认为,f[j]表示的是选j棵树的最大值,那么既然增产值不会为负,就算为0,f[k]也一定是并列最优的。但是这样做的话,实际上对拍n=10的数据15秒就被卡了。由于f[j]的转移过程,是倒序转移的,这个相信大家都懂为什么要倒序转移,所以f[k]并不一定是最大值啊。好像说了这话没说一样…#include <bits/stdc++.h&g...原创 2020-03-18 13:10:17 · 199 阅读 · 1 评论 -
CF269B Greenhouse Effect
简化题意:给出一个序列,每次可以移动一个数到任意一个位置,问最少多少次能使得序列非降。一开始看了洛谷是黄题以后写了这个傻逼代码:#include <bits/stdc++.h>using namespace std;const int N=5e3+5;int n,m,ans;int a[N],minn[N];double x;int main(){ scanf("%d...原创 2020-03-09 01:59:52 · 186 阅读 · 0 评论 -
洛谷 P4597 序列sequence
此题的强化版#include <bits/stdc++.h>#define int long longusing namespace std;int n,x,ans;priority_queue<int>q;/*题解们都说:考虑当前的数x和之前的最大数y(默认x<y,因为如果x>=y已经满足非降了)为了让它非降,我们要做区间[x,y]里找到一个数...原创 2020-03-09 01:59:03 · 313 阅读 · 2 评论 -
洛谷 P1484 种树
用双向链表维护可反悔贪心。当堆顶<0后直接break。#include <bits/stdc++.h>#define int long longusing namespace std;const int N=5e5+5;int n,m,ans;int a[N],l[N],r[N];bool vis[N];struct node{ int id,v; in...原创 2020-02-20 13:34:13 · 88 阅读 · 0 评论 -
BZOJ 2708 木偶
#include <bits/stdc++.h>using namespace std;const int N=55;int n;int a[N],f[N];inline bool pd(int l,int r,int x){ if (l+x-1>=r-x+1 || abs(a[l+x-1]-a[r-x+1])<=1) return false; //如...原创 2019-11-01 14:53:28 · 133 阅读 · 0 评论 -
CF1296F Berland Beauty
利用贪心的思想进行构造,然后检验。注意到在一棵树中,一个节点最多只有一个根节点,所以可以把边权转化为点权来存储:一个点与它父节点之间的边的权值,存储在它的身上即可。5000的数据就是用来暴力跳lca的。#include <bits/stdc++.h>using namespace std;const int N=5e3+5;int n,u[N],v[N],m,now;in...原创 2020-02-10 23:59:35 · 183 阅读 · 0 评论 -
BZOJ 1110: [POI2007]砝码Odw
看了题解,发现是用进制转换来做。这种题不看题解谁会想到用进制转换这种冷门东西???知道是进制转换就很容易了,就变成了一道贪心+模拟题。首先,进制是a[1],a[2],a[3],…a[n],然后将所有容器体积都加入,可以得到一个(会变的)进制数:xxxxxxx…xxxxx。考虑到只需要求有几个砝码能够被装下,而不用求利用率,所以是道贪心,从小到大进行放置显然优秀。于是我们就从小到大放置砝码,这...原创 2020-01-20 23:59:24 · 139 阅读 · 0 评论 -
LOJ #10008. 「一本通 1.1 练习 4」家庭作业
智力大冲浪的数据加强版,n^2算法要被卡。我们发现,原来的暴力代码最暴力的是这一段: for (register int j=num[i].pos; j>=1; --j) if (!f[j]) { f[j]=true,ans+=num[i].w; break; }那么对于一个个往前找,直到找到一个空格子的这个步骤,能不能把它变成找1次就找到呢?显然是不行的…但是l...原创 2020-01-14 12:42:31 · 379 阅读 · 0 评论