传送门 题意咕咕咕 思路: 先把所有可以列车通的缩成一个点,然后用新图建立kruskalkruskalkruskal重构树. 这样就可以倒着贪心模拟了. 代码: #include<bits/stdc++.h> #define ri register int #define int long long #define fi first #define se second using namespace std; const int rlen=1<<18|1; inline char…
---题面--- 题解: 这题想法简单,,,写起来真的是失智,找了几个小时的错误结果是inf没开到LL范围.... 首先我们需要找到任意两点之间能够携带黄金的上限值,因为是在经过的道路权值中取min,我们要使得这个min值最大,就应该要在最大生成树上寻找正确的边.求出最大生成树后我们需要在上面倍增寻找权值最小的边,这条边的权值即为携带黄金的上限值. 于是你可以写最大生成树也可以写kruskal重构树,这里我写的是kruskal重构树,这样以来,因为kruskal重构树的性质,我们只需要寻找对应2…
题目描述 mzry1992 在打完吊针出院之后,买了辆新摩托车,开始了在周边城市的黄金运送生意.在mzry1992 生活的地方,城市之间是用双向高速公路连接的.另外,每条高速公路有一个载重上限,即在不考虑驾驶员和摩托车重量的情况下,如果所载货物的量超过某个值,则不能驶上该条高速公路.今年,mzry1992 一共收到了来自n 个不同城市的n 份定订单,每个订单要求卖出上限为一定量的黄金,或是要求买入上限为一定量的黄金.由于订单并不是同时发来的,为了维护生意上的名声,mzry1992 不得不按照订单…
求出最大生成树,则两点间的最大容量为树上两点间的边权的最小值. 设$lim[i]$表示第$i$个订单的城市允许携带的黄金上限,则 $lim[i]=\min(lim[i+1],a[i]和a[i+1]点间最大容量)+\max(0,-b[a[i]])$ 然后依次模拟即可,时间复杂度$O(m\log n)$. #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; const int N…
传送门 题意: 一个人数数,规则如下: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串,列出该字符串的所有连续子串对应的B进制数的值. 对所有列出的数求和. 结果用10 进制表示,对20130427取模. 思路: 我不知道为什么要从低位开始向高位处理2333333手动毒瘤 然后肝了好久幸好没有推错不然就自闭了 不过需要多预处理一点东西. 假设现在计算[1,a][1,a][1,a]的答案,aaa一个表示BBB进制数的数组 ssi:ss_i:s…
传送门 题意: 现在有一个nnn个小写字母组成的字符串sss. 然后给你nnn个数aia_iai​,aia_iai​表示以sis_isi​为中心的最长回文串串长. 再给你n−1n-1n−1个数bib_ibi​,bib_ibi​表示以si,si+1s_i,s_{i+1}si​,si+1​中间空隙为中心的最长回文串串长. 问你满足条件的所有sss串中字典序最小的那个. 思路: 可以根据aia_iai​和bib_ibi​逆模拟manachermanachermanacher的过程贪心构造这个sss.…
倍增什么的最慢了,常数太大了 我们可以上树剖啊 但是如果用树剖来查询树上两点之间的最小边权的话,可能只能在上一棵线段树? 那也太\(naive\)了,尽管倍增常数大,但是还是比两个\(log\)快的 那干脆重构树算了 我们直接建出\(kruskal\)重构树,之后我们可以在重构树上直接用树剖来查询\(lca\),\(lca\)的点权就是最小边的边权 这就是我最优解的原因了 之后发现自己的思路非常清奇,那就干脆再写一下思路吧 可能是我太傻了,并没有发现可以直接贪心,所以搞出来一种非常难写的方法 我…
LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不了,不管了....现在不想改. 容易想到按高度Kruskal重构树+预处理到点1的距离dis. 建一棵最大生成树,如果随便建的话,如果非树边能走,整棵树都能走答案当然是0...:如果有些树边不能走,那么可走范围被限制在了某个连通块. 然而被限制在某个连通块和图(还要暴力,难道树分块?)没什么区别,所…
Kruskal 重构树 [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树 kruskal是一个性质优秀的算法 加入的边是越来越劣的 科学家们借这个特点尝试搞一点事情. kruskal求最小生成树的过程,如果把加入的一个边新建一个节点的话,并且把k1,k2的father设为新点的话,会得到一个2*n大小的树 实际上已经非常明白地表示kruskal这个过程了.这个树叫kruskal重构树 每个点的权值定义为所代表的边的权值.叶子节点权值最优. 由于贪心,所以树上所有点,…
读题,只经过困难值小于等于x的路径,容易想到用Kruskal重构树:又要查询第k高的山峰,我们选择用主席树求解. 先做一棵重构树,跑一遍dfs,重构树中每一个非叶子节点对应一段区间,我们开range[x][0/1]数组来履行此职责,表示该节点维护的最左(最右)的叶子节点.每跑到一个叶子节点就把他插入主席树中.然后就是基本操作了,倍增找到我们想要的点,用该点的range来在主席树中查询即可. 按题目的困难值要求,显然重构树是个大根堆,用v数组存困难值. 下面的两个代码,一个是参考代码,注释很详细,…