Problem 遗产 题目大意 给出一个带权有向图,有三种操作: 1.u->v添加一条权值为w的边 2.区间[l,r]->v添加权值为w的边 3.v->区间[l,r]添加权值为w的边 求st点到每个点的最短路 Solution 首先我们思考到,若是每次对于l,r区间内的每一个点都执行一次加边操作,不仅耗时还耗空间. 那么我们要想到一个办法去优化它.一看到lr区间,我们就会想到线段树对吧. 没错啦这题就是用线段树去优化它. 首先我们建一棵线段树,然后很容易想到,我们只需要把这一棵线段树当做…
线段树优化连边 要求点 \(x\) 向区间 \([L, R]\) 连边, 一次的复杂度上限为 \(O(n)\) 然后弄成线段树的结构 先父子连边边权为 \(0\) 这样连边就只需要连父亲就可以等效于连了区间内每个点 空间复杂度为线段树大小, 一次区间连边时间复杂度为 \(O(\log n)\) 这是连入边, 连出边的话反向建线段树内边即可 CF786B Legacy 默认情况下他不能用这把枪开启任何传送门.在网络上有q个售卖这些传送枪的使用方案.每一次你想要实施这个方案时你都可以购买它,但是每次…
线段树优化$\rm dijkstra$ 线段树每个节点维护$[l,r]$中$dist$最小的点,删除则把该点$dist$赋值为$+\infty$,然后更新该点影响到的线段树上的其他节点即可. 可以得到“更新该节点影响到的线段树上的其他节点”部分的代码:(线段树数组$\rm st[]$) void pushup(int x) { st[x] = dist[st[x << ]] < dist[st[x << | ]] ? st[x << ] : st[x <&l…
CodeForces 786B Rick和他的同事们做出了一种新的带放射性的婴儿食品(???根据图片和原文的确如此...),与此同时很多坏人正追赶着他们.因此Rick想在坏人们捉到他之前把他的遗产留给Morty. 在宇宙中一共有n个星球标号为1到n.Rick现在身处于标号为s的星球(地球)但是他不知道Morty在哪里.众所周知,Rick有一个传送枪,他用这把枪可以制造出一个从他所在的星球通往其他星球(也包括自己所在的星球)的单行道路.但是由于他还在用免费版,因此这把枪的使用是有限制的. 默认情况…
题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\): t==2,由\(u\)向\([l,r]\)中任意一些点连边,每次花费\(w\): t==3,由\([l,r]\)中任意一些点向u连边,每次花费\(w\). 最后求使给定的\(s\)到达点\(i(1\leq i\leq n)\)的最小花费. \(Solution\) 花费看成每条边的边权,全都连…
题目描述 N个点,M条边的有向图,求点1到点N的最短路(保证存在). 1<=N<=1000000,1<=M<=10000000 输入格式 第一行两个整数N.M,表示点数和边数.  第二行六个整数T.rxa.rxc.rya.ryc.rp.  前T条边采用如下方式生成:  1.初始化x=y=z=0.  2.重复以下过程T次:  x=(x*rxa+rxc)%rp;  y=(y*rya+ryc)%rp;  a=min(x%n+1,y%n+1);  b=max(y%n+1,y%n+1); …
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 200005; inline void read(int &num) { char ch; int flag=1; while(!isdigit(ch=getchar()))if(ch=='-')flag=-flag; for(num=ch-'0';isdigit(ch=getchar());num=num*10…
B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优化建图. 这个题目我一开始也没想到,不知道怎么用线段树优化,然后看了一下题解,豁然开朗. 首先建两棵线段树,有点类似拆点,然后其中一颗从下往上建图A,一颗从上往下建图B. 从上往下建图的每一个叶子节点连着从上往下建图的每一个叶子节点. 权值都是0 p==1 那就直接是B 的叶子节点连着A 的叶子节点…
题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路.Seter保证不会有一个国家与自己之间有道路. Seter好不容易建好了所有道路,他现在在位于P号的首都.Seter想知道P号国家到任意一个国家最少需要经过几条道路.当然,Se…
这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不过注意为了提高效率,在区间与区间之间建边的时候建了两个虚点. 题目 G. 神圣的 F2 连接着我们 #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include…