算法竞赛每日一题
GreyKa
这个作者很懒,什么都没留下…
展开
-
牛客多校第九场 Eyjafjalla 树上问题 倍增 dfs序上建点权可持久化线段树
序这一场是我们学校出的,结果出的非常残暴,第二题就比较复杂。第一题是个签到,我去写了,让队友去看了第二题。第一题签了半个多小时终于一次a了,然后去问队友第二题。听懂题意以后,我说了句:诶,我感觉这个题是不是可以用可持久化。队友:???如果熟悉可持久化数据结构,这题其实就是一个sb题,不过我们三个都没怎么接触过可持久化,所以一次AC还是挺激动的。题意给你一棵树,每个点都有一个点权,而且父亲的点权大于他任意儿子的点权。让你从一个点开始走,要求只能走到点权在 l,r 范围内的点,问你能走到一共多少个点。有原创 2021-08-21 09:20:34 · 181 阅读 · 0 评论 -
2020-2021年度第二届全国大学生算法设计与编程挑战赛 F题 大水题 线段树
每日一题 牛客基础 第六场 动态最小生成树 最小生成树 线段树如题所示,这是一道大水题,因为写过的线段树实在是太少了,所以来水一篇如题所示,这是一道大水题,因为写过的线段树实在是太少了,所以来水一篇思路还是挺简单的。首先开一棵线段树记录电影的总和,问题是怎么去掉包含x的所有区间的值。那其实我只需要再开一棵线段树,每次遇到一个区间的时候,记录一下删去其中一个元素的时候需要减去的值,即是整个区间的长度乘以对这个区间的值。最后用第一棵线段数1到n的总和减去第二棵线段树x的值就是答案了。上代码#inclu原创 2021-06-07 10:53:53 · 321 阅读 · 0 评论 -
每日一题 牛客基础 第六场 动态最小生成树 最小生成树 线段树
每日一题 牛客基础 第六场 动态最小生成树 最小生成树 线段树好妙的一题啊,自己是不太能想出来的,其中有几个点。第一个是,区间查询,那应该想到线段树,线段树的每个区间里面存这个区间的边能构成的最小生成树,当然不一定是一颗完整联通的树。然后就是区间合并的问题了,怎么把两个子区间合并成一个大区间呢,其实就是把两个子区间各自存下来的边放在一起,再跑一遍最小生成树,把边存下来。在合并的时候有个技巧,因为两个子区间存下来的边都是从小到大排好序的,那大区间把这些边加进来的时候可以用归并排序的方式,设两个指针,每原创 2021-02-25 11:39:47 · 294 阅读 · 0 评论 -
每日一题 P3092 [USACO13NOV]No Change G 状态压缩+二分
每日一题 P3092 [USACO13NOV]No Change G 状态压缩+二分这是一道和 [P3694 邦邦的大合唱站队] 非常相似的蓝色题目,前面一题刚开始不太会做,看了题解开导思路,这道题自己独立做出来了。dp[i]的下标i代表已经用了的硬币,值代表买到的最后一样东西。转移方程就是枚举比i中少一个1的状态转移到i状态,在那个状态的值往后二分搜出当前硬币能往后买到的最后面的物品编号,然后取最大值。当当前的状态可以买到所有物品后,更新答案ans。ans就是没有取的硬币的和。#include &l原创 2021-02-19 13:45:25 · 362 阅读 · 0 评论 -
每日一题 P1220 关路灯 区间dp
每日一题 P1220 关路灯 区间dp一道蓝题,上手给他秒了,不过我的做法不是正解,正解是三维dp,我写了个四维的。不管了,AC就行。dp[i][j][k][l]代表i到j区间内到时间点k的时候站在左端或者右端的消耗的最小值(只考虑i到j这段区间内的消耗)。#include <bits/stdc++.h>#define int long long#define endl "\n"#define MAXN 1005using namespace std;int n,c;int d原创 2021-02-18 13:02:46 · 160 阅读 · 0 评论 -
每日一题 P2656 采蘑菇 强连通缩点 树形dp
每日一题 P2656 采蘑菇 强连通缩点 树形dp蓝题,思路不算很难,题意可知强连通块上每条边的值都可一压榨干净,其他边最多走一次。因此先缩点,连通块内所有边的值先算出来,然后再重新构图,这时候是个无环图,跑一边动态规划输出最大值即可。#include <bits/stdc++.h>#define int long long#define endl "\n"#define MAXN 1000005using namespace std;struct EDGE{ int t原创 2021-02-18 10:48:38 · 195 阅读 · 0 评论 -
每日一题 P2585 [ZJOI2006]三色二叉树 树形dp
每日一题 P2585 [ZJOI2006]三色二叉树 树形dp思路挺简单的一道蓝色题目,枚举当前点的颜色与儿子颜色做转移其实可以直接在字符串上dfs,但是怕麻烦出错还是把他先按照常规建成了我熟悉的图 代码如下#include <bits/stdc++.h>#define int long long#define endl "\n"#define MAXN 1000005using namespace std;struct EDGE{ int to,next;} edg原创 2021-02-18 00:41:48 · 132 阅读 · 1 评论 -
每日一题 P1273 有线电视网 树上分组背包
每日一题 P1273 有线电视网 树上分组背包蓝色题,挣扎了一下写出来了dp[i][j]表示i节点选择j个用户的收益最大值最后求一下根节点收益不小于0的最大用户数量即可#include <bits/stdc++.h>#define MAXN 600005#define int long long#define endl "\n"using namespace std;struct EDGE{ int to,next,w;}edge[MAXN];int head[M原创 2021-02-17 22:29:12 · 113 阅读 · 0 评论 -
每日一题 P2680 [NOIP2015 提高组] 运输计划 LCA 树上差分 二分答案
每日一题 P2680 [NOIP2015 提高组] 运输计划 LCA 树上差分 二分答案紫题不愧是紫题,有一定难度。想到了二分答案但是没想清楚check函数怎么写。学到一点:用树上差分可以O(N)找出树上一些链的公共边,这样就比较好check了。代码写的比较垃圾,常数巨大。#include <bits/stdc++.h>#define MAXN 600005using namespace std;struct EDGE{ int to,next,w;} edge[MAXN]原创 2021-02-15 16:55:55 · 118 阅读 · 0 评论 -
每日一题 P6869 [COCI2019-2020#5] Putovanje 树上差分
P6869 [COCI2019-2020#5] Putovanje 树上差分树上差分的模板题,写的时候第二遍dfs写错了,wa了好多好多次5555#include <bits/stdc++.h>#define MAXN 500005#define int long longusing namespace std;struct EDGE{ int to,next,c1,c2;} edge[MAXN];int head[MAXN],ptr;void add_edge(in原创 2021-02-15 15:06:28 · 424 阅读 · 0 评论 -
每日一题 P3128 [USACO15DEC]Max Flow P LCA倍增 lazy离线处理做法
每日一题 P3128 [USACO15DEC]Max Flow P LCA倍增 lazy离线处理又是一道树上倍增的绿题,思路依旧很简单。常规的求倍增lca就不说了,主要是每条路径上面所有的点的值都需要+1。倍增每次网上跳一段距离,这边我们借用lazy tag的思想,每次lca向上跳的时候把跳的那一段做一个标记,最后询问的时候统一下放到每个点,更新的方式和预处理倍增差不多,只不过反过来进行操作了,具体见代码。这样就可以在nlogn的时间内得到答案。#include <bits/stdc++.h&g原创 2021-02-15 12:26:46 · 190 阅读 · 0 评论 -
每日一题 POJ 2486 树形dp 树上背包
POJ 2486 树形dp 树上背包代码并不难写,关键是要想清楚。树形dp的第一个比较完整写完的题,是比较经典的题,来纪念一下。一开始没想清楚是因为对背包问题的滚动数组优化的理解不够,自然在树上的问题也没思考清楚。同时因为每个case过后忘记清零,导致re了一发,以后需要注意。//AC代码 耗时188MS#include <iostream>#include<cstring>#define MAXN 205using namespace std;struct EDG原创 2021-02-13 20:03:33 · 186 阅读 · 0 评论 -
每日一题 P1967 [NOIP2013 提高组] 货车运输 最大生成树 LCA倍增
每日一题 P1967 [NOIP2013 提高组] 货车运输 最大生成树 LCA倍增这道题虽然是蓝色题,但是其实不难想,代码量有点大。debug了很久,还是wa,最后发现又是小错误。先用DSU+Kruskal跑最大生成树,然后用LCA倍增的方式,处理出一个点网上2^i步的点和这两个点之间所有边的最小值,然后就可以很方便的改改倍增的板子来求解了。对板子的熟悉程度不够,导致了一些小bug,最后是对着别人代码看找出来的问题。#include <bits/stdc++.h>#define MA原创 2021-02-14 19:58:55 · 171 阅读 · 0 评论 -
每日一题 P1351 [NOIP2014 提高组] 联合权值 树上问题
P1351 [NOIP2014 提高组] 联合权值 树上问题 每天都得做做水题拿点ac才有动力写下去。看到这题是绿题,马上上手给他秒了,不过因为写错一个变量还wa了一发。思路很简单,每个点能构成联合权值的,只有他的兄弟和他的爷爷。因此只要跑一遍dfs就可以计算出来。数组的含义 :son一个节点的儿子的和 smax 一个节点的儿子的最大值。因为算联合权值的时候两个节点(a,b)互换一下位置(b,a)也应该算在答案内,所以最后ans我们需要给他*2。#include <iostream>原创 2021-02-14 17:27:43 · 215 阅读 · 0 评论