题目传送门:ARC090E. 题意简述: 给定一张有 \(N\) 个点 \(M\) 条边的无向图.每条边有相应的边权,边权是正整数. 小 A 要从结点 \(S\) 走到结点 \(T\) ,而小 B 则相反,他要从结点 \(T\) 走到结点 \(S\) . 小 A 和小 B 走一条边需要的时间都是这条边的边权,不论方向. 问有多少种走法,使得他们俩都走了最短路,但是他们不会相遇,这里相遇指的是在点上或者在边上相遇. 答案对 \(10^9+7\) 取模. 题解: 用 Dijkstra 算法求出以结点…
Description 题库链接 给出一张 \(N\) 个节点, \(M\) 条边的无向图,给出起点 \(S\) 和终点 \(T\) .询问两个人分别从 \(S\) 和 \(T\) 出发,走最短路不相遇的方案数. \(1 \leq N \leq 100,000,1 \leq M \leq 200,000\) Solution 记最短路长度为 \(D\) ,从 \(S\) 出发走过的路程为 \(d_1\) ,从 \(T\) 出发的走过的路程为 \(d_2\) .值得注意的是走最短路相遇只会出现两种…
自己做出来固然开心,但是越发感觉到自己写题的确是很慢很慢了……往往有很多的细节反反复复的考虑才能确定,还要加油呀~ 这道题目的突破口在于正难则反.直接求有多少不相交的不好求,我们转而求出所有相交的.我们先预处理出由 \(S\) 到 \(T\) 的最短路图(跑一边Dijkstra,所有的最短路径构成的图),显然可以顺便处理出 \(T\) 到 \(S\) 的.然后这个图是一个拓扑图,满足的性质就是从 \(S\) 点出发的任意一条路径终点均为 \(T\) 且为二者之间的最短路.拓扑图dp对于每个点我们…
Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) <=  7\) 的情况下,右端点的最大限度为 \(\frac{10^8}{8} + 10^7\) .这个范围并不大,可以直接用 two-pointer 处理出来. 那么这部分的数据和后面的数据有什么不同呢? 当 \(f(l) > 7\) 的时候,\(f(r) - f(l) <= 1\).那么…
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_c 平面上有一个R×C的网格,格点上可能写有数字1~N,每个数字出现两次.现在用一条曲线将一对相同的数字连接,对于数字1~N.试判断是否存在一种连接方式,使得曲线不越过矩形网格边界,且曲线之间不相交? 若平面网格为无限大,则使得曲线之间不相交的连接方式一定存在.因此,在一个R×C的网格上,优先考虑边界上的点对,再考虑不全在边界上的点对.将两次均处于边界上的数字的集合记为S. 由于曲线不越过网格边界…
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_b 本题是一个图论问题——Manhattan距离最小生成树(MST). 在一个平面网格上有n个格点,第i个格点的坐标是(xi,yi),构造一条连接点(a,b)和点(c,d)的边的代价是min{|a-c|,|b-d|}.对给定的n个格点构造连通图,使得总代价最小. 这是一个最小生成树(MST)问题.最“简单”的方法是,由n个结点构造一个无向完全图Kn,之后用Prim算法生成MST.这个程序的时间复杂…
传送门:http://arc082.contest.atcoder.jp/tasks/arc082_c 本题是一个平面几何问题. 在平面直角坐标系中有一个n元点集U={Ai(xi,yi)|1≤i≤n}.考虑以U的子集S中的点为顶点围成的凸多边形P,若这个凸多边形P内(含边界)的点数为k,则这个子集S的权值为f(S)=2k-|S|.求所有子集S的权值之和$\sum_{S\subseteq U}f(S)$(对998,244,353取余). 定义一个点集上的凸包运算H:G→S.即:平面上的一个点集G,…
C - Together 传送门:http://arc082.contest.atcoder.jp/tasks/arc082_a 本题是一个数学问题. 有一个长度为n的自然数列a[1..n],对于每一个a[i],有三种操作: ①inc a[i]: ②dec a[i]: ③do nothing. 之后,选择一个自然数x,统计数列中等于x的元素的数目num(x),最大化答案. 考虑x有以下三种来源: ①x:=inc a[i],while a[i]==x-1: ②x:=dec a[i],while a…
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: 为什么加椅子?我们可以在最左边或最右边一直加直到人人都有座位. 首先这道题目抽象成二分图很简单,然后我们可以只要求解出人与座位的最大匹配是多少,总人数减去即可,但跑二分图最大匹配显然会超时,我们就可以往霍尔定理方面想. 然后你还需要知道一个霍尔定理推论:假设某个人的集合为\(X\),这个集合所对应的…
首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次数为 \(x\),表示节点实际上被选择的次数是父亲被选择的次数 \(+x\).显然,这个 \(x\) 是小于等于 \(D\) 的.分析这样我们发现,选择了一个节点实际上对应子树内的所有节点的选择次数均增加,所以我们重新定义选择一个节点的价值为子树内(含自身)节点的个数,而代价则是子树内所有代价的总和…