贪心
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
-
小 A 的卡牌游戏
题目链接:小 A 的卡牌游戏考虑 “2pick” 问题,可以贪心,假设全部选a,然后按照 b - a 的差值,从大到小来选择剩下的。同理,现在变成了 “3pick” 问题,所以我们可以控制c的选或者不选,然后附带一个有关c选择个数的 dp 即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace st原创 2021-11-15 17:06:41 · 3443 阅读 · 0 评论 -
最大收益
题目链接:最大收益假设我们选择了一个集合的物品,为了使得价值最大,我们肯定是按照 R 从小到大选择。然后我们可以先按照R从小到大sort。考虑dp,dp[i][j] 前 i 个物品选择了 j 个的最大值。但是我们发现转移是有后效性的,因为不知道后面选择了多少个,但是我们从后往前dp,就知道当前的转移了。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define in原创 2021-06-28 15:23:08 · 145 阅读 · 0 评论 -
RASPORED
题目链接:RASPORED假设有两个任务,分别为:L1,T1 ; L2,T2如果第一个在前面的代价:L1 + L2 - 2 * T1 - T2反之:L1 + L2 - 2 * T2 - T1所以按照 T 的大小去维护即可。AC代码:#include<bits/stdc++.h>#define int long longusing namespace std;const int N=2e5+10;int n,m,L[N],T[N],sum[N<<2],num[N原创 2021-06-19 18:39:25 · 94 阅读 · 0 评论 -
新年的饮食方案
题目链接:新年的饮食方案显然可以贪心,按照左端点排序后,对于每一天,我们每次去取结束时间最早的即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e6+10;int n,m,res,up,now;pair<int,int> a[N];pri原创 2021-03-20 00:05:12 · 111 阅读 · 0 评论 -
最小 OR 路径
题目链接:最小 OR 路径显然我们可以得到最高位,然后根据贪心是合法的。然后根据得到的高位又可以往低位看,然后看最高的必须合法的位。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e4+10,M=2e6+10;int n,m,s,t,res,ok,a[M],b原创 2021-03-08 20:21:25 · 167 阅读 · 0 评论 -
Kisik
题目链接:Kisik显然我们最后矩形的高度一定是物品的某一个高度。然后我们可以枚举高度然后选k个最小的宽度,排序后用堆维护k个最小值即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+10;int n,k,res=1e18,sum; priority_原创 2021-03-06 13:17:22 · 191 阅读 · 0 评论 -
分组
题目链接:分组先对数组排序。贪心考虑每个组,如果这个人可以放到之前完成的某个组当中,那么一定是放之前人数最少的那个组。并且不会使得后面答案变劣。所以贪心是正确的,然后用set维护每个组即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;i原创 2021-01-23 11:38:54 · 159 阅读 · 0 评论 -
AT3913 XOR Tree
题目链接:AT3913 XOR Tree每次操作一条链显然不可做,我们尝试利用异或转化为两点间的操作。我们于是可以把边权转化为点权,对于每个点权为相邻边的异或值。然后我们可以发现每次操作一条链只有两个端点会改变。然后对于显然变成两点间的操作,显然对于相同权值的点,贪心只用一次操作即可。否则那么点权都是不一样的,直接状压dp。因为权值很小。令dp[s]为当前的点权集合为s的答案,我们可以发现如果一个集合异或为0那么才是有解的。因为每次异或两个相同的数,整个集合的异或是不会改变的。所以我们单独对集合原创 2021-01-03 10:57:59 · 181 阅读 · 0 评论 -
迷宫
题目链接:迷宫正向考虑十分麻烦,每个点都有可能会冲突。考虑逆向,每个点从根节点向下走。这样就不会冲突了。然后肯定贪心先走深度大的,对于每个点就是等待的时间+深度。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;int n,a[N],dep[N原创 2020-11-16 16:19:40 · 293 阅读 · 0 评论 -
Longest subsequence
题目链接:Longest subsequence首先可以想到对 b 串做dp。dp[i][0/1] 为匹配到第 i 位,前面是否已经字典序大于 b 串的第一个满足的在 a 串当中的位置。于是我们可以发现,如果之前已经大于了,那么直接把后面的串全部加上即可。所以用一个序列自动机预处理即可,然后枚举b串的前缀。要特判全部取出来的串都等于的情况。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/st原创 2020-11-14 13:41:34 · 259 阅读 · 0 评论 -
Codeforces - Matching Names
题目链接:Codeforces - Matching Names因为是前缀信息,所以我们可以发现,每次选LCP最长的匹配一定是最优的。于是Trie上面贪心即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;int n,t[N*8][26],i原创 2020-08-24 14:46:41 · 230 阅读 · 0 评论 -
Codeforces - Split the Tree
题目链接:Codeforces - Split the Tree预处理出每个点最多向上到的距离。然后从叶子往上贪心,如果某个点未被子树中的点覆盖,则答案加一,新开一条链。找每个点最多向上走的点,树上倍增即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5原创 2020-08-24 00:10:05 · 167 阅读 · 0 评论 -
Codeforces - Leaf Sets
题目链接:Codeforces - Leaf Sets找一个度不为1的点开始,从叶子往上贪心即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e6+10;int n,k,dp[N],res;vector<int> g[N];void df原创 2020-08-23 23:15:59 · 156 阅读 · 0 评论 -
HDU - 5638
题目链接:HDU - 5638考虑最小字典序,显然可以贪心求。对于每次的点来说,看是否可以删边使得更小的点入队。然后我们可以发现,对于拓扑排序来说,删边的实质就是使得某个点的入度减1。然后我们可以用线段树维护每个点的入度,然后每次可以取出一个最小的,入度满足小于等于k的点,看是否通过操作使其入队。维护最小字典序的队列,我们换成优先队列即可。注意细节,不要让一个点重复入队。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#incl原创 2020-08-07 22:09:48 · 206 阅读 · 0 评论 -
Codeforces - Weights Division
题目链接:Codeforces - Weights Division其实这道题是没啥思维难度的。我们考虑每条边的贡献,也就是下面的叶子数和当前边的权值。因为减少的权值只有两种,我们可以用堆来维护每次能减去的最多价值,然后判断两个费用1的和费用2的大小,然后选择最优的即可。不过细节较多。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long lo原创 2020-08-07 13:40:34 · 1616 阅读 · 3 评论 -
HDU - 6409
题目链接:HDU - 6409假设一次都不能选一对兄弟。那么我们肯定是贪心,对每个节点选最大的权值的儿子,现在可以选一对兄弟,那么我们选一个最优的次大值加上即可。最小值同理。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10,inf=0x3f3f3f3原创 2020-07-27 23:10:52 · 198 阅读 · 0 评论 -
HDU - 6586
题目链接:HDU - 6586看见字符串最小字典序,显然可以想到贪心。我们依次对每一位从小到大枚举,如果当前合法就可以放。怎么判断合法性呢?我们放这个字符之后需要保证,后面的位置可以满足放需要放的个数,以及后面的位置不能超过最多还能放的位置,以及当前枚举到的位置后面还有这个字符,以及这个字符不能超过R[i]个。所以我们可以用后缀和+序列自动机预处理。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bit原创 2020-07-27 21:33:07 · 174 阅读 · 0 评论 -
相邻的糖果
题目链接:相邻的糖果显然根据贪心,每次减去右边的值一定是最优的。然后暴力减的复杂度就是对的,因为区间是固定的,所以每个数字只会被减一次。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+10;int n,m,s,now,a[N],res;signed m原创 2020-07-26 13:16:56 · 159 阅读 · 0 评论 -
Codeforces - Packmen
题目链接:Codeforces - Packmen显然可以二分。然后从左往右扫人的合法的位置,然后让第一个合法的人过来,那么有3种情况:人在左边:直接向右走即可。人在右边:先向左然后向右,先向右后向左,取max即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const in原创 2020-07-17 23:01:16 · 208 阅读 · 0 评论 -
Codeforces - Ants in Leaves
题目链接:Codeforces - Ants in Leaves因为根节点无限制,所以我们不看根节点。然后其他点肯定是优先深度小的叶子到达,相等的就相当于某个深度增大,所以sort一遍即可,处理一下相同的深度。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=5原创 2020-07-17 13:08:48 · 169 阅读 · 0 评论 -
Codeforces - Jeremy Bearimy
题目链接:Codeforces - Jeremy Bearimy树上最大的链匹配和,就是很经典的trick,看每条边最多经过多少次即可。最小的和,我们直接看当前子树中的点个数,如果是奇数,那么必须有一个点往上匹配,否则不管。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const i原创 2020-07-16 18:22:14 · 213 阅读 · 0 评论 -
Delegation P
题目链接:Delegation P显然可以二分,然后我们从下到上贪心选择即可。如果当前子树中有奇数条路径,那么肯定用两两最小的满足的去组合,然后往父亲节点返回大的权值。否则如果有偶数条路径,那我们加一个0变成奇数条。要注意如果非根节点,有一次找不到另一个值的时候,这个值可以直接转移到父亲节点。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int原创 2020-07-14 22:21:38 · 168 阅读 · 0 评论 -
[COCI 2009] PASIJANS
题目链接:[COCI 2009] PASIJANS显然我们每次贪心用堆维护最小的。但是如果有相同的怎么选择呢?我们就要往后比较了。所以就是一个后缀排序的问题了。但是要注意,字符串4 2是大于字符串4 2 3的。所以我们在每个字符串后面增加一个极大值。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namesp原创 2020-07-04 22:00:45 · 278 阅读 · 0 评论 -
Tweetuzki 爱军训
题目链接:Tweetuzki 爱军训如果直接去做是很复杂的。我们假设全部都是第一次出队,那么我们可以发现,如果第i个改成第二次出队,那么答案增加:(n-i)*w-sum(i+1,n)然后我们从后往前找第二次出队的,我们可以发现后面是否出队和之前第二次出队的是没有影响的。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusin原创 2020-07-02 20:45:47 · 167 阅读 · 0 评论 -
River Jumping
题目链接:River Jumping显然我们可以发现如果连续的3个之中,最后一个减去第一个都小于s则无解,否则我们可以贪心能跳就跳,因为连续两个之中小于s是不影响的,因为我们特判了连续3个的情况。然后我们最后反向扫一遍第一次未跳的,如果都是满足的则输出。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namesp原创 2020-07-01 21:05:13 · 168 阅读 · 0 评论 -
LYZ-Ice Skates
题目链接:LYZ-Ice Skates显然是一个二分图匹配问题,所以我们可以想到用霍尔定理来做。但是我们不能暴力枚举左边点的所有情况,但是我们其实只需要找到左边所有情况的最小值即可。我们显然可以发现最小值一定是一个连续的区间。因为这样重叠是最多的。所以我们等价于找一个区间:(r-l+1+d)*k>=sum(l,r)在极端情况都是满足的,所以我们维护区间最大子段和即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#inc原创 2020-07-01 12:08:57 · 227 阅读 · 0 评论 -
[JXOI2017]加法
题目链接:[JXOI2017]加法显然可以二分,然后我们就可以得到每个点需要被多少个区间覆盖。然后左端点从小到大排序,然后贪心选择即可。但是有区间覆盖的次数计算,我们可以直接差分,从前往后计算前缀和,用fenwick也可以。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const原创 2020-06-28 10:59:21 · 234 阅读 · 0 评论 -
偶树的切分
题目链接:Codeforces - 偶树的切分显然贪心,能切就切。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;int n,res;vector<int> g[N];inline void add(int a,int b){g[原创 2020-06-24 23:34:27 · 136 阅读 · 0 评论 -
Codeforces - Bookshelves
题目链接:Codeforces - Bookshelves显然可以按位贪心。然后dp[i][j],前i个能否组成j组,包含当前枚举的某一位。但是要注意也要包含之前贪心出的答案。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=55;int n,k,dp[N][N原创 2020-06-21 23:01:55 · 189 阅读 · 0 评论 -
Koishi Loves Segments
题目链接:Koishi Loves Segments显然可以按照右端点贪心,如果右端点一样就让左端点大的先放。所以怎么判断能不能放呢?离散化+线段树维护区间min即可。区间min代表当前区间还能放几条。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e6+原创 2020-06-05 14:49:05 · 185 阅读 · 0 评论 -
[POI2005]SAM-Toy Cars
题目链接:[POI2005]SAM-Toy Cars显然每次,如果不在地面上,肯定直接把下一个距离最远的放上去。所以堆维护下一个最远的距离即可。但是要注意,如果当前在地面上,我们不用操作,但是我们要更新下一个的距离。由于是堆,不好更新,所以我们可以直接K++,再放一个当前的进去,或者把堆换成set、AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define in原创 2020-06-04 17:07:10 · 240 阅读 · 0 评论 -
[JSOI2007]建筑抢修
题目链接:[JSOI2007]建筑抢修我们按照结束时间,从小到大排序。然后依次枚举选当前这个,如果选上当前这个之后,超过了截止时间,那么现在就有两种决策:1.不选这一个2.把之前一个花费时间多的踢出,不做,然后做这一个,使得剩下更多的时间。显然需要决策时,先做2即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusin原创 2020-05-25 19:51:50 · 131 阅读 · 0 评论 -
跳伞求生
题目链接:跳伞求生显然可以费用流,不过复杂度太高。我们可以利用堆来快速模拟费用流的退流操作。显然,我们从小到大枚举a,把合适的房屋全部放进去,且放入的值为:c[j]-b[j],如果当前这个a加上堆中的最大值为正,我们就可以直接对其匹配,但是如果后面的一个与当前房屋匹配更优呢?也就是费用流的退流,我们直接把 -a[i] 也放进堆中即可,如果与某个值匹配,那么就代表退流了。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#inclu原创 2020-05-19 21:36:55 · 271 阅读 · 0 评论 -
百日旅行
题目链接:百日旅行做法其实挺多的,显然我们可以维护一个下凸包,然后做斜率优化dp。其次因为代价是平方的,所以一定不会连续太长,所以我们可以dp[i][0/1]去dp。每次最多往前转移1000个值。然后我们也可以贪心去做,如果我们知道当前的旅行和吃饭天数,那么显然我们旅行肯定是平均的插入到吃饭之间。然后因为这个是具有三分性的,我们可以对上面的结论三分。第二种代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bi原创 2020-05-17 10:46:37 · 193 阅读 · 0 评论 -
Cow Calisthenics G
题目链接:Cow Calisthenics G显然可以二分。然后我们从上往下dfs,然后贪心判定即可。每种情况都讨论一下,不得已断边的时候才断边。不过贪心不太好验证正确性,跟着感觉走就AC了。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=1e5+10;原创 2020-05-15 12:25:15 · 183 阅读 · 0 评论 -
[NOI2014]起床困难综合症
题目链接:[NOI2014]起床困难综合症从高位开始贪心,每个二进制位,只有两种选法,要么0要么1,。我们肯定优先看0,如果0通过一系列条件之后变成1,肯定就选0.如果1通过一系列变成1,并且满足m的限制,就直接选。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int原创 2020-05-11 12:22:35 · 249 阅读 · 0 评论 -
Bracket Sequencing
题目链接:Bracket Sequencing显然之和前缀和,和前缀和的min有关。如果前缀和大于0,且前缀和的min也大于0,直接放前面最优。如果前缀和大于0,且前缀和的min小于0,所以肯定是先放前缀和的min大的。如果都小于0,假设前缀和为a,前缀和的min为b我们对于前后两项可得:b1+a2<a1+b2 -> a1-b1<a2-b2AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include&l原创 2020-05-10 22:43:25 · 300 阅读 · 0 评论 -
HDU - 6536
题目链接:HDU - 6535显然,如果我们从后往前枚举,每次选下一个字母的时候肯定选最近的最优。用一个栈维护即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;int ...原创 2020-05-04 20:26:26 · 354 阅读 · 0 评论 -
Arrangement for Contests
题目链接:Arrangement for Contests比较显然的从左往右贪心,然后尽量不影响右边。强行加了一个线段树。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;c...原创 2020-05-03 20:20:48 · 543 阅读 · 0 评论 -
Best Subsequence
题目链接:Best Subsequence首先考虑二分答案。对于当前的mid,如果数字小于[mid/2]那么肯定是要选的,然后对于这些数字中间的数字,最多选一个。枚举一下即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long l...原创 2020-04-27 21:48:50 · 271 阅读 · 0 评论