题意及思路 这个题加深了我对主席树的理解,是个好题.每次更新某个点的距离时,是以之前对这个点的插入操作形成的线段树为基础,在O(logn)的时间中造出了一颗新的线段树,相比直接创建n颗线段树更省时间.比较的时候二分比较,为了加快比较给每个点设置一个hash值. 代码: #include <bits/stdc++.h> using namespace std; const unsigned long long P = 13331; const int mod = 1000000007; cons…
[Codeforces 464E] The Classic Problem(可持久化线段树) 题面 给出一个带权无向图,每条边的边权是\(2^{x_i}(x_i<10^5)\),求s到t的最短路\(\mathrm{mod} \ 10^9+7\)的值 分析 显然边权存不下,由于取模会影响大小关系,不能直接取模然后跑dijkstra 考虑用可持久化线段树维护每个点到起点的距离(二进制表示),即维护一个01序列,[1,n]从低位到高位存储. 修改的时候我们要把第i位+1,如果第i位是0,直接取反就可以…
题目链接 题意:给出一张 \(n\) 个点 \(m\) 条边的无向图,第 \(i\) 条边连接 \(u_i,v_i\),边权为 \(2^{w_i}\),求 \(s\) 到 \(t\) 的最短路. \(1 \leq n,m \leq 10^5\),\(1 \leq w_i \leq 10^5\) 神仙题,不愧是 Div.1 E,不看题解根本写不出来. 我们肯定要用 dijkstra 跑最短路对吧.不过最短路需要两个基本操作,加法和比较大小,如果手写高精度这两个操作时间复杂度都是 \(10^5\)…
题意描述 有一个\(n\)点\(m\)边的无向图,第\(i\)条边的边权是\(2^{a_i}\).求点\(s\)到点\(t\)的最短路长度(对\(10^9 + 7\)取模). 题解 思路很简单--用主席树维护每个点的\(dis\).因为每次更新某个点\(v\)的\(dis_v\)的时候,新的\(dis_v\)都是某个点\(u\)的\(dis_u + 2^{w_{u, v}}\),相当于在原先\(u\)对应的主席树基础上修改,得到新的一棵主席树,作为\(v\)对应的主席树. 主席树(线段树)维护二…
题目大意 给定一张$n$个点, $m$条边的无向图,求$S$ 到$T$的最短路,其中边权都是$2^k$的形式$n,m,k<=10^5$,结果对$10^9+7$取模 题解 大佬好厉害 跑一边dijstra大家应该都想的到 但问题是维护最短路的距离怎么实现 我太菜了除了python啥都想不到 我们可以把距离拆成每一位,因为每一次只会加上一个数,直接开主席树维护就好了 时间复杂度什么的……感性理解一下就好了 比较大小直接二分哈希 //minamoto #include<bits/stdc++.h&g…
E. The Classic Problem http://codeforces.com/problemset/problem/464/E 题意:给你一张无向带权图,求S-T的最短路,并输出路径.边权为2^xi.xi≤105,n≤105,m≤105. 想法:边权太大了,可以用数组按二进制存下来.带高精度跑太费事了. 观察一下,这里距离的更新:c=(a,b),用dis[a]更新dis[b] ①dis[b][c]=0,直接赋为1.只有一个数字改变. ②dis[b][c]=1,需要进位.考虑极端情况数…
补一补之前听课时候的题. 考虑使用dij算法求最短路,因为边权存不下,所以考虑用主席树维护二进制位,因为每一次都只会在一个位置进行修改,所以可以暴力进位,这样均摊复杂度是对的. <算法导论>给了证明:对于一个有$k$位的二进制计数器,假设每一次都从第0位$+1$,那么我们发现执行$n$次加法之后,发现第零位会变$\left \lfloor \frac{n}{1} \right \rfloor$次,第一位会变$\left \lfloor \frac{n}{2} \right \rfloor$次.…
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给出节点数为$n$的树 有$q$次询问,输出$a$节点到$b$节点路程中,经过的边的中位数 数据范围: $1\leq n \leq 100000$ $1\leq q \leq 100000$ 分析: 建一颗主席树,不同的是,节点的根继承的是父节点的根 再用$lca$求出公共祖先$tree[a]+tree[b]-2*tree[lca(a,b)]$ ac代码: #include<bits/s…
数据范围:$n≤5000$,$a,l,r≤10^9$,$b,w,p≤2\times 10^5$. 我们考虑一种暴力的最小割做法: 首先令$sum=\sum\limits_{i=1}^{n} b_i+w_i$ 我们建一个图: $S->i$,边权为$w_i$ $i->T$,边权为$b_i$ $i->i'$,边权为$p_i$ $j->i'$,边权为$∞$,(这里的i和j需要满足题目中的i,j限制) 然后我们对这个图跑一遍最小割,将$sum$减去这个值输出就是答案了. 这么建图总共需要$2…
题意: 给出一棵树,每条边有一个容量. 有若干次询问:\(S \, T \, K \, A \, B\),求路径\(S \to T\)的最大流量. 有两种方法可以增大流量: 花费\(A\)可以新修一条管道,管道可以连接任意两个点,两个点之间可以有任意条管道连接,新修的管道容量为\(1\) 花费\(B\)可以使某条管道(包括新修的管道)的容量增加\(1\) 求在不超过预算\(K\)的情况下的最大流量. 分析: 注意到流量最大只有\(10^4\),所以我们可以直接在值域上建一棵主席树. 主席树区间维…