Atcoder ARC-061】的更多相关文章

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\) 的.分析这样我们发现,选择了一个节点实际上对应子树内的所有节点的选择次数均增加,所以我们重新定义选择一个节点的价值为子树内(含自身)节点的个数,而代价则是子树内所有代价的总和…
题目传送门:ARC090E. 题意简述: 给定一张有 \(N\) 个点 \(M\) 条边的无向图.每条边有相应的边权,边权是正整数. 小 A 要从结点 \(S\) 走到结点 \(T\) ,而小 B 则相反,他要从结点 \(T\) 走到结点 \(S\) . 小 A 和小 B 走一条边需要的时间都是这条边的边权,不论方向. 问有多少种走法,使得他们俩都走了最短路,但是他们不会相遇,这里相遇指的是在点上或者在边上相遇. 答案对 \(10^9+7\) 取模. 题解: 用 Dijkstra 算法求出以结点…
觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复计算了很多东西,因为区间 \((l, r)\) 的答案与区间 \((l + 1, r)\) 的答案并不是独立的. 我们可以考虑一下扫描线的做法.用一根扫描线从右往左扫左端点,同步维护所有以 \(l\) 为左端点的区间.由于我们现已经求出了所有以 \(l + 1\) 为左端点的区间答案(这里的答案指从…
……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 #define int long long #define INF 99999999999LL int n, sum, S, T, lev[maxn]; int read() { , k = ; char c; c = getchar(); ; c = getchar(); } + c - ', c = g…