7月14日 AtCoder Grand Contest 026 题目链接:https://agc026.contest.atcoder.jp/
Codeforces Round #495
7月7日 Codeforces Round #495 题目链接:http://codeforces.com/contest/1004
POJ3694 Network [边双联通分量]
问题描述:
给定一张含有n个节点m条边的无向图。然后执行q次操作,每次向图中添加一条边,并询问无向图中“桥”的数量。
输入:
有多组数据,每组数据以n (n<=100000) m (m<=200000)开始 然后m行,每行两个数a, b表示ab之间存在一条无向边 然后一个整数q,表示q次操作 接下来q行,每行两个数a, b表示在ab之间加一条无向边 输入以两个0结束
输出:
对于每组数据每个操作,输出操作之后无向图中桥的数量。
思路:
题目也很明确的说到了是要求桥的数量,所以算法一定和边双联通分量有关。
首先是缩点,然后剩下来一棵树,我们可以发现这棵树上的每一条边都属于原无向图中的桥。然后考虑加边操作,每一次操作都使得a, b(边的两个端点)树上路径的边不再是桥了,所以我们就可以将答案减去这些不再是桥的边。
然后考虑如何实现。求树上两点路径依然使用lca,只是这次的lca不是基于倍增,而是基于并查集。我们可以将那些不再是桥的边用并查集将它们压缩,使得下次计算答案时不会访问它们,同时也保证了时间复杂度。
代码:
1 | #include <cstdio> |
Codeforces Round #494 解题报告
7月9日 Codeforces Round #494 题目链接:http://codeforces.com/contest/1003
A - Polycarp’s Pockets & B - Binary String Constructing
比较水,不说了。
C - Intense Heat
思路: 比较好的一题。这题用到了一点分数规划的思想。
首先二分答案,设二分的值为$mid$,然后将原序列全部减去$mid$,如果长度大于k的最大子序和大于等于0,则符合要求。有长度限制的最大子序和也是一个比较重要的模型,利用DP的思想进行维护。
代码:
1 | #include <bits/stdc++.h> |
D - Coins and Queries
思路: 这道题比较水。。。
因为硬币面值都是2的整数幂,所以存面值的log2就可以了。然后对于每一个询问,利用类似于二进制分解的操作,看能不能由硬币凑出来。
代码:
1 | #include <bits/stdc++.h> |
E - Tree Constructing
思路: 构造题。。码力是真的不够,菜死了QWQ。。。
首先满足直径的条件,先构造一个长度为d的链。然后再满足其它条件,对于链上的每一个点进行拓展,在这个点上尽可能多的放子节点。如果还有节点放不下,就是无解啦。。 代码:
1 | #include <bits/stdc++.h> |
F - Abbreviation
思路: 超级好的一题。。结合了字符串和DP。
设第i个和第j个字符串后有$f[i][j]$个连续字符串相等。然后f数组可以预处理出来。然后比较暴力的枚举起始字符串i和长度j。将这段进行压缩,然后对于每个i和j枚举出有多少个串能够这样压缩,用这个更新答案。
总结一下,其实也不能说是DP。只是利用了一下预处理优化了一下暴力。
代码:
1 | #include <bits/stdc++.h> |
POJ1201 Intervals [差分约束]
问题描述:
给定n个闭合的整数区间$[ai,bi]$和n个整数$c1,…,cn$。你需要求出集合$Z$最小的元素数量,使集合$Z$对于每一个区间$[ai,bi]$中都有$c$个整数。
输入:
第一行$n (n<=50000)$,表示有n个区间 接下来n行,每行包含$ai, bi, ci$三个整数,其中$0 <= ai <= bi <= 50000$
输出:
输出集合$Z$可能的最小元素数量。
思路:
首先这题有一种贪心的做法,以前用过这种做法,所以我们重点在差分约束上。
这是一道比较基础的差分约束。同样建边是重点,对于每个区间,$bi$之前元素个数$-ai$之前元素个数要$>=ci$,所以我们在$ai,bi$间连一条长度为$ci$的单向边。同样,由于每个点上最多只能放零或一个元素,所以要从每个点$i$向前一个点$i-1$连一条长度为-1的边,从$i$向$i+1$连一条长度为0的边。
建完图以后,由于是求最小值,按照套路用SPFA跑一遍最长路。由于题目保证了有解,所以不需要加特判,输出dis[maxn]就好。
代码:
1 | #include <cstdio> |