把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end
上一页 1 ··· 35 36 37 38 39 40 41 42 43 ··· 45 下一页
摘要: 题面传送门 按照题意模拟即可,把每个点的子树节点数遍历出来,然后与$n-f_x$取绝对值即可。 代码实现: #include<cstdio> #include<cstring> #define abs(x)((x)>0?(x):-(x)) using namespace std; int n,m,k 阅读全文
posted @ 2020-07-08 22:00 275307894a 阅读(39) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 这道题看上去是裸的最短路。 但是众所周知,$USACO$经常卡$spfa$。 所以不能用$spfa$ 又因为堆优化$dj$只能跑正权边。 所以发现一下题目的特殊性质: 事实上,由于最近恐怖主义太嚣张,为了社会和谐,出台 了一些政策保证:如果有一条航线可以从 $A_i$到 \(B_i\) 阅读全文
posted @ 2020-07-08 21:58 275307894a 阅读(48) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 其实$n$可以开到$1e18$ 显然可以倍增$floyd$ 直接把矩阵乘法的乘改成加单位矩阵也改一下变成$a_{i,j}=\min\limits_{b_{i,k}+c_{k,j}}$即可。 然后就是矩阵快速幂板子。 时间复杂度$O(m3logn)$ 注意离散 代码实现: #include 阅读全文
posted @ 2020-07-07 22:00 275307894a 阅读(42) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 这道题两种解法。 第一种直接跑分层图最短路(或者叫二维$spfa$)即可,时间复杂度$O(nm)$。不过如果特殊数据会被卡到$O(nm^2)$(好像还没有直接跑$ISAP$快) 第二种二分+最短路 我们肯定把一条路径中前$k$大的点拿来免费,把第$k+1$的点拿来支付。易得这种贪心是正确 阅读全文
posted @ 2020-07-07 21:55 275307894a 阅读(44) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 直接树剖即可。用线段树维护两端点。合并时分类讨论一下要不要减即可。 注意,最后要把左边的左右端点翻转,可以画个图理解一下。 最后两个点在一条重链上时放在哪一边要反过来。 代码实现: #include<cstdio> #include<cstring> using namespace st 阅读全文
posted @ 2020-07-07 21:48 275307894a 阅读(49) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 稍微看一下就可以得出结论:一个人获得的硬币数就是以这个点为根子树内所有节点的深度和。 那么树形$dp$就可以直接处理。 \(f_x=(\sum\limits_{(u,x)∈E}{f_u}+siz_u)+1\) 代码实现: #include<cstdio> #include<cstring 阅读全文
posted @ 2020-07-05 22:18 275307894a 阅读(64) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 一眼$dp$ 但是题目中说价格没有单调性,所以要先预处理出后缀$min$ 然后枚举断点即可。 代码实现: #include<cstdio> #include<algorithm> #include<cstring> #define min(a,b) ((a)<(b)?(a):(b)) u 阅读全文
posted @ 2020-07-05 22:13 275307894a 阅读(40) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 显然,前面查询很少,可以直接差分。 后面前缀和即可。 代码实现: #include<cstdio> using namespace std; int n,m,k,x,y,z,maxn,minn,mod,fin,ans,tot; char _s; long long a[80039],q[ 阅读全文
posted @ 2020-07-05 22:12 275307894a 阅读(32) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 感觉这道题比$Ynoi$还卡常。 显然可以直接开$26$个线段树暴力做,复杂度$O(26nlogn)$ 但是这样拿不了几分。 但我们注意到这是权值树。而且所有的权值树的权值之和等于$n$,而我们开了$25n$的空间。所以势必有很大的空间与时间浪费。所以在当前点没有权值时就不必查找,当前点 阅读全文
posted @ 2020-07-04 22:21 275307894a 阅读(64) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 很好的一道构造题。 显然答案就是$0$或者$2$ 因为不存在两行或两列差值大于$1$的。 那么沿着对角线依次左移即可,用一个循环队列实现。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,k,x, 阅读全文
posted @ 2020-07-04 22:15 275307894a 阅读(30) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 把第一类客人转换一下,就是哪个多吃哪个。 第二类客人就是哪个少吃哪个。 很容易发现第二类客人最多能满足$min(a,b)$个,那么剩下的看第一类客人能否满足即可。 代码实现: #include<cstdio> #define max(a,b) ((a)>(b)?(a):(b)) #def 阅读全文
posted @ 2020-07-04 22:13 275307894a 阅读(35) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 又是一道分类讨论的题目。 如果$r>n$,那么其实$k=r$与$k>r$的任何值是一样的,所以可以忽略。而$k=r$又只有一个答案,那么答案就是$\frac{(n-1)n}{2}+1$ 反之,答案就是一个普通等差数列$\frac{(r-1)r}{2}$ 代码实现: #include<cs 阅读全文
posted @ 2020-07-04 22:10 275307894a 阅读(41) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 显然是可以分类讨论的。 如果$n$是奇数,那么我们可以让$1$与$n-1$,$2$与$n-2$组成一对,剩下$n$一对,这样可以组成$\frac{n+1}{2}$对。 如果n是偶数,那么我们可以让$1$与$n$,$2$与$n-1$组成一队。那么可以组成$\frac{2}$ 代码实现: # 阅读全文
posted @ 2020-07-04 22:06 275307894a 阅读(38) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 显然不可以最长路。 司机肯定喜欢走长的路径,所以先把最大生成树跑出来。 然后再最大生成树上跑倍增不就好了? 代码实现: #include<cstdio> #include<cstring> #include<algorithm> #define min(a,b) ((a)<(b)?(a) 阅读全文
posted @ 2020-07-04 21:53 275307894a 阅读(26) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 显然可以四分树。 就是在线段树上加两个维度即可。 注意边界值。 代码实现: #include<cstdio> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int n,m,k,x,y,z,sx,sy,sz,f[160000 阅读全文
posted @ 2020-07-02 13:46 275307894a 阅读(51) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 代码难度稍大,思路其实不难。 题目求最大最小,那么就是二分。 那么怎么验证呢。 首先预处理出所有航线的时间,然后跑出大于$mid$的航线,在树上差分。 只有每一条航线都经过的路径才可能满足要求,所以先找出这样的路径。 对于每一条边,我们都把权值放在下面的节点上,这样的话就可以直接跑一遍验 阅读全文
posted @ 2020-06-30 22:04 275307894a 阅读(38) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 树剖裸题,感觉难度虚高。 当两个部落开战时,我们就把下面那个点的权值设为$1$,休战则设为$0$即可。 这样有一个好处就是查询时如果有$1$可以直接跳出。 其他基本操作。 代码实现: #include<cstdio> #include<cstring> using namespace s 阅读全文
posted @ 2020-06-30 21:56 275307894a 阅读(58) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 很裸的一道题。感觉难度虚高。 可以先把这棵树的欧拉序跑出来,然后每次询问是根节点到当前点的权值,那么树状数组随便维护一下就好了。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,k,x,y,ans 阅读全文
posted @ 2020-06-30 21:53 275307894a 阅读(38) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 因为只有一次贸易,所以可以枚举中转点。 从点$1$出发跑最小值$SPFA$,从点$n$出发跑最大值$SPFA$,这个贪心应该都懂。 然后枚举中转点,注意跑不到的点不能枚举。 代码实现: #include<cstdio> #include<cstring> #include<queue> 阅读全文
posted @ 2020-06-30 21:51 275307894a 阅读(27) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 普通树剖,注意线段树标记下推清零时左右儿子的懒标记要清零 代码实现; #include<cstdio> #include<cstring> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; int n,m,k,son[1000 阅读全文
posted @ 2020-06-28 16:37 275307894a 阅读(64) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 感觉评分虚高。 其实和$NOI2015$的软件包管理器差不多,题解 正常操作,直接区间覆盖即可。 一不小心拿了个次优解 代码实现: #include<cstdio> #include<cstring> using namespace std; int d[500039],idea,siz 阅读全文
posted @ 2020-06-27 21:59 275307894a 阅读(51) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 $spoj$卡语言太恶心所以来洛谷上交了。 正常树剖不解释但是有些地方可以写法优化。 比如线段树只要一个数组就够了。 代码实现: #include<cstdio> #include<cstring> #define max(a,b) ((a)>(b)?(a):(b)) using nam 阅读全文
posted @ 2020-06-27 21:55 275307894a 阅读(53) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 第一次一遍过国集紫题。好激动。 一看就是树剖,只不过操作有点多。 把每条边的权值放在儿子节点即可。 对于取相反数放懒标记即可。 其他是树剖正常操作。 代码实现: #include<cstdio> #include<cstring> #define max(a,b) ((a)>(b)?(a 阅读全文
posted @ 2020-06-27 21:50 275307894a 阅读(38) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 这里可以把边权转化成点权,即把边的值放在儿子节点上,这样能确保唯一性。 而这样的话$lca$就不能算了,可以通过$id+1$处理掉。 树状数组维护即可。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n 阅读全文
posted @ 2020-06-26 21:42 275307894a 阅读(50) 评论(0) 推荐(0) 编辑
摘要: 题面传送门 一眼看上去就是树剖裸题。 线段树无所不能,连异或都可以维护。直接树剖即可。 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,k,idea,son[100039],siz[100039],d[100 阅读全文
posted @ 2020-06-26 21:40 275307894a 阅读(52) 评论(0) 推荐(0) 编辑
上一页 1 ··· 35 36 37 38 39 40 41 42 43 ··· 45 下一页
浏览器标题切换
浏览器标题切换end