摘要:
题意:无向图,边带权,问从1到n最少经过的结点数量,以及在此基础上经过的边权字典序最小的路径。 以1为源点bfs,每次把边权按从小到大的顺序进行遍历,边权相等的后继结点需要作为一个整体进行后续的bfs,这样能保证每个结点第一次被访问时的路径都是字典序最小的最短路径。 1 #include<bits/ 阅读全文
摘要:
题目链接 n个人按编号顺序站成一排,有两种约束: 1.A,B之间距离不超过c 2.A,B之间距离至少为c 差分约束模板题,注意最长距离模型要用最短路去解 对于第1类约束有d[B]-d[A]<=c,由A->B建立一条权值为c的边对于第2类约束有d[B]-d[A]>=c,取反得d[A]-d[B]<=-c 阅读全文
摘要:
题目链接 可以将左半部分区间划分为[1,b1],[b1+1,b2],[b2+1,b3]...若干个小段,每一段都可以和右半部分对称位置上的做交换。 根据Burnside引理,等价类的个数等于所有置换不动点个数的平均值。又根据Polya定理,置换f不动点的个数等于$A^{m(f)}$,A为颜色数,m( 阅读全文
摘要:
题目大意:n个点和m条限制(n,m<=4e5),每条限制可以规定两个点: 1)都是白色2)都是黑色3)一白一黑 问最多有多少个黑点,如果不能满足所有限制条件则输出impossible。 这是去年在训练赛上打过的一道题,因为比较经典所以决定fuxi一下。当时我很早就写出来了,然而wa了很多发最后才过的 阅读全文
摘要:
题意是有一张无向连通图,边带权,每走过一条边需要消耗一定的电量。有k个关键点可以充满电,问从一个关键点走到另一个关键点,需要的电池容量至少是多少。 首先可以分析一下极端情况: 1.k=2:问题转化成求两点间最短路 2.k=n:问题转化成求最小生成树 所以要把两者综合起来考虑。 首先对所有关键点求一个 阅读全文
摘要:
我最开始接触k短路时用的是A*算法,后来我从某位大佬那里得知A*算法的复杂度不稳定,可能会退化成平方级别的(比如,所有结点首尾相连成环) (注:A*算法不会降低时间复杂度!不用A*算法,用一个普通的优先队列照样可以做,复杂度是一样的,就是A*在一般情况下更快而已) 于是学了下用可持久化可并堆维护数据 阅读全文
摘要:
题目链接 18年沈阳网赛的题,一直想补但一直鸽着,终于还是补上了 一棵树,点带权,支持两种操作: 1.深度d上的权值加上x 2.询问子树u下的权值和 对每个深度按结点数量分类,结点数小于$sqrt(n)$的为1类,其余的为2类 对于1类深度,修改时暴力修改每个结点的值,查询时用树状数组 对于2类深度 阅读全文
摘要:
题目链接 二维平面RMQ问题,单点修改,区间询问最大最小值 树套树或者四叉树均可做 树套树版本: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=500+10,mod=1e9 阅读全文
摘要:
题目链接 一开始的想法是让物品按数量从小到大或者从大到小贪心,然而怎么想都不对,最后发现应该按价格贪 首先求出最终的物品数量序列(扫一遍即可) 然后把所有物品按价格从大到小排序,每次选价格最大的去匹配尽量小的数量(必须大于等于原来的数量),用multiset实现即可 1 #include<bits/ 阅读全文
摘要:
题目链接 先dp求出以每个红色区域右下角为中心的能成为logo的最大半径 然后二维RMQ预处理,之后可O(1)询问任意子矩形中的最大值 最后对于每个询问二分最大logo的半径mid,这样问题就转化成判定是否存在半径大于等于mid的logo,在(x1+mid-1,y1+mid-1,x2-mid,y2- 阅读全文