国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【圖論經(jīng)典題目講解】CF786B - Legacy 一道線段樹(shù)優(yōu)化建圖的經(jīng)典題目

這篇具有很好參考價(jià)值的文章主要介紹了【圖論經(jīng)典題目講解】CF786B - Legacy 一道線段樹(shù)優(yōu)化建圖的經(jīng)典題目。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

C F 786 B ? L e g a c y \mathrm{CF786B - Legacy} CF786B?Legacy

D e s c r i p t i o n \mathrm{Description} Description

給定 1 1 1 n n n 個(gè)點(diǎn)的有向圖,初始沒(méi)有邊,接下來(lái)有 q q q 次操作,形式如下:

  • 1 u v w 表示從 u u u v v v 連接 1 1 1 條長(zhǎng)度為 w w w 的有向邊
  • 2 u l r w 表示從 u u u i i i i ∈ [ l , r ] i\in [l,r] i[l,r])連接 1 1 1 條長(zhǎng)度為 w w w 的有向邊
  • 3 u l r w 表示從 i i i i ∈ [ l , r ] i\in [l,r] i[l,r])向 u u u 連接 1 1 1 條長(zhǎng)度為 w w w 的有向邊

輸出從 S S S 點(diǎn)到 i i i 點(diǎn)( i ∈ [ 1 , n ] i\in [1,n] i[1,n])的最短路長(zhǎng)度。

S o l u t i o n \mathrm{Solution} Solution

觀察可知,最多會(huì)建立 1 0 5 × 1 0 5 = 1 0 10 10^5\times 10^5 = 10^{10} 105×105=1010 條邊,故必定超時(shí)。

此時(shí),需要使用 線段樹(shù)優(yōu)化建圖,這里展開(kāi)簡(jiǎn)單說(shuō)一下:

對(duì)于 1 1 1 棵存儲(chǔ)點(diǎn)為 1 ~ 4 1\sim 4 14 的線段樹(shù),形式如下:

【圖論經(jīng)典題目講解】CF786B - Legacy 一道線段樹(shù)優(yōu)化建圖的經(jīng)典題目,圖論經(jīng)典,圖論,c++,算法

如果當(dāng)前為 2 2 2 操作,且為 1 ~ 3 1\sim 3 13 每個(gè)點(diǎn)連向 4 4 4,權(quán)值為 10 10 10,操作如下所示:

【圖論經(jīng)典題目講解】CF786B - Legacy 一道線段樹(shù)優(yōu)化建圖的經(jīng)典題目,圖論經(jīng)典,圖論,c++,算法

即,將區(qū)間 1 ~ 2 1\sim 2 12 3 ~ 3 3\sim 3 33 連向 4 4 4 即可,不過(guò)此時(shí)發(fā)現(xiàn),圖中為有向圖,而現(xiàn)在是無(wú)向圖所以我們要對(duì)于圖中的每一條邊標(biāo)記方向和權(quán)值(這里線段樹(shù)就是一張圖,葉子節(jié)點(diǎn)就是我們的 1 ~ n 1\sim n 1n 節(jié)點(diǎn))

【圖論經(jīng)典題目講解】CF786B - Legacy 一道線段樹(shù)優(yōu)化建圖的經(jīng)典題目,圖論經(jīng)典,圖論,c++,算法

其中,為何線段樹(shù)上的邊方向都為向父親節(jié)點(diǎn)?那是因?yàn)? 1 1 1 2 2 2 號(hào)點(diǎn)只有這樣才能順著邊走到 4 4 4 號(hào)節(jié)點(diǎn),對(duì)于為何權(quán)值設(shè)為 0 0 0,因?yàn)檫@是 1 1 1 條虛邊(不存在的),不能對(duì)最短路做出任何貢獻(xiàn)。

不過(guò),上文是區(qū)間連節(jié)點(diǎn),當(dāng)是節(jié)點(diǎn)連區(qū)間的時(shí)候(操作 3 3 3)邊都是正好反著的,所以再建 1 1 1 棵線段樹(shù)即可(不過(guò)沒(méi)必要真的去再建 1 1 1 棵,具體見(jiàn)代碼)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-830504.html

C o d e Code Code

#include <bits/stdc++.h>
#define int long long

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int SIZE = 4e6 + 10, SIZE2 = 1e6 + 10;

int N, Q, S;
int h[SIZE2], e[SIZE], ne[SIZE], w[SIZE], idx;
int Id[2], Dist[SIZE2], Vis[SIZE2];
struct Segment
{
	int l, r;
	int L, R;
}Tree[SIZE2 << 2];

void add(int a, int b, int c)
{
	e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}

int Build(int l, int r, int Sd, int k)
{
	if (l == r)
	{
		Tree[l] = {l, l};
		return l;
	}
	int P = ++ Id[k];
	Tree[P] = {l, r};

	int mid = l + r >> 1;
	Tree[P].L = Build(l, mid, Sd, k), Tree[P].R = Build(mid + 1, r, Sd, k);

	if (!Sd) add(Tree[P].L, P, 0), add(Tree[P].R, P, 0);
	else add(P, Tree[P].L, 0), add(P, Tree[P].R, 0);

	return P;
}

void Add(int u, int l, int r, int p, int w, int Sd)
{
	if (Tree[u].l >= l && Tree[u].r <= r)
	{
		if (!Sd) add(u, p, w);
		else add(p, u, w);
		return;
	}

	int mid = Tree[u].l + Tree[u].r >> 1;
	if (mid >= l) Add(Tree[u].L, l, r, p, w, Sd);
	if (mid < r) Add(Tree[u].R, l, r, p, w, Sd);
}

void Dijkstra(int S)
{
	memset(Dist, 0x3f, sizeof Dist);
	memset(Vis, 0, sizeof Vis);
	priority_queue<PII, vector<PII>, greater<PII>> Heap;
	Heap.push({0, S}), Dist[S] = 0;

	while (Heap.size())
	{
		auto Tmp = Heap.top();
		Heap.pop();

		int u = Tmp.second;
		if (Vis[u]) continue;
		Vis[u] = 1;

		for (int i = h[u]; ~i; i = ne[i])
		{
			int j = e[i];
			if (Dist[j] > Dist[u] + w[i])
			{
				Dist[j] = Dist[u] + w[i];
				Heap.push({Dist[j], j});
			}
		}
	}
}

signed main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	memset(h, -1, sizeof h);

	cin >> N >> Q >> S;

	if (N == 1)
	{
		cout << 0 << endl;
		return 0;
	}

	Id[0] = N;
	Build(1, N, 0, 0);
	Id[1] = Id[0];
	Build(1, N, 1, 1);

	while (Q --)
	{
		int Op, v, u, l, r, w;
		cin >> Op >> u;

		if (Op == 1)
		{
			cin >> v >> w;
			add(u, v, w);
		}
		else if (Op == 2)
		{
			cin >> l >> r >> w;
			Add(Id[0] + 1, l, r, u, w, 1);
		}
		else
		{
			cin >> l >> r >> w;
			Add(N + 1, l, r, u, w, 0);
		}
	}

	Dijkstra(S);

	for (int i = 1; i <= N; i ++)
		if (Dist[i] >= 1e18) cout << -1 << " ";
		else cout << Dist[i] << " ";

	return 0;
}

到了這里,關(guān)于【圖論經(jīng)典題目講解】CF786B - Legacy 一道線段樹(shù)優(yōu)化建圖的經(jīng)典題目的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • CF786題解

    CF786題解

    我不會(huì)告訴你鏈接在圖片里 給出一個(gè)大小為 (n) 的環(huán),點(diǎn)順時(shí)針從 (1to n) 編號(hào),兩個(gè)人(設(shè)為 (0,1) )輪流移動(dòng)其中的一個(gè)棋子。 對(duì)于第 (opt) 人,他能夠?qū)⑦@個(gè)棋子順時(shí)針移動(dòng) (xin S_{opt}) ( (S_{opt}) 是提前給出的)個(gè)步數(shù),當(dāng)某個(gè)人將棋子挪到 (1) 時(shí)這個(gè)人獲勝。

    2024年02月05日
    瀏覽(19)
  • 【*2200線段樹(shù)Pushup】CF1567 E

    【*2200線段樹(shù)Pushup】CF1567 E

    Problem - E - Codeforces 題意: 思路: 維護(hù)這些信息即可 ? ?Code:

    2024年02月16日
    瀏覽(18)
  • 【枚舉區(qū)間+線段樹(shù)】CF Ehu 152 E

    【枚舉區(qū)間+線段樹(shù)】CF Ehu 152 E

    Problem - E - Codeforces 題意: 思路: 感覺(jué)是個(gè)套路題 對(duì)區(qū)間計(jì)數(shù),按照CF慣用套路,枚舉其中一個(gè)端點(diǎn),對(duì)另一個(gè)端點(diǎn)計(jì)數(shù) 對(duì)于這道題,枚舉右端點(diǎn),對(duì)左端點(diǎn)計(jì)數(shù) Code: ?

    2024年02月10日
    瀏覽(14)
  • 貪心找性質(zhì)+dp表示+矩陣表示+線段樹(shù)維護(hù):CF573D

    貪心找性質(zhì)+dp表示+矩陣表示+線段樹(shù)維護(hù):CF573D

    比較套路的題目 首先肯定貪心一波,兩個(gè)都排序后盡量相連。我一開(kāi)始猜最多跨1,但其實(shí)最多跨2,考慮3個(gè)人的情況: 我們發(fā)現(xiàn)第3個(gè)人沒(méi)了,所以可以出現(xiàn)跨2的情況 然后直接上dp,由 i ? 1 , i ? 2 , i ? 3 i-1,i-2,i-3 i ? 1 , i ? 2 , i ? 3 轉(zhuǎn)移過(guò)來(lái)。 然后這顯然可以拿矩陣表

    2024年02月07日
    瀏覽(23)
  • 【*1900 圖論】CF1328 E

    【*1900 圖論】CF1328 E

    Problem - E - Codeforces 題意: 思路: 注意到題目的性質(zhì):滿足條件的路徑個(gè)數(shù)是極少的,因?yàn)槊總€(gè)點(diǎn)離路徑的距離 =1 先考慮一條鏈,那么直接就選最深那個(gè)點(diǎn)作為端點(diǎn)即可 為什么,因?yàn)槲覀冃枰闅v所有點(diǎn)的父親 推廣到樹(shù),也是要遍歷所有點(diǎn)的父親 為什么要加枚舉的tag,因?yàn)?/p>

    2024年02月15日
    瀏覽(19)
  • 【簡(jiǎn)單圖論】CF1833 E

    【簡(jiǎn)單圖論】CF1833 E

    Problem - E - Codeforces 題意: ? ?思路: 顯然,最大值就是什么邊都不連的連通塊個(gè)數(shù),最小值就是能連的都連上 那就是,如果一個(gè)連通塊存在度為1的點(diǎn),就把它當(dāng)作接口連接 Code:

    2024年02月16日
    瀏覽(15)
  • 【*1900 圖論+枚舉思想】CF1328 E

    【*1900 圖論+枚舉思想】CF1328 E

    Problem - E - Codeforces 題意: 思路: 注意到題目的性質(zhì):滿足條件的路徑個(gè)數(shù)是極少的,因?yàn)槊總€(gè)點(diǎn)離路徑的距離 =1 先考慮一條鏈,那么直接就選最深那個(gè)點(diǎn)作為端點(diǎn)即可 為什么,因?yàn)槲覀冃枰闅v所有點(diǎn)的父親 推廣到樹(shù),也是要遍歷所有點(diǎn)的父親 為什么要加枚舉的tag,因?yàn)?/p>

    2024年02月14日
    瀏覽(16)
  • 【簡(jiǎn)單圖論】CF898 div4 H

    【簡(jiǎn)單圖論】CF898 div4 H

    Problem - H - Codeforces 題意: 思路: 手玩一下樣例就能發(fā)現(xiàn)簡(jiǎn)單結(jié)論: v 離它所在的樹(shù)枝的根的距離 m 離這個(gè)根的距離時(shí)是 YES 否則就是NO 實(shí)現(xiàn)就很簡(jiǎn)單,先去樹(shù)上找環(huán),然后找出這個(gè)根,分別給a 和 b BFS一遍,得出兩個(gè)dis數(shù)組,比較一下即可 對(duì)于只有的環(huán)情況 和 m = v 的情況需

    2024年02月07日
    瀏覽(19)
  • 每天一道leetcode:542. 01 矩陣(圖論&中等&廣度優(yōu)先遍歷)

    每天一道leetcode:542. 01 矩陣(圖論&中等&廣度優(yōu)先遍歷)

    給定一個(gè)由 0 和 1 組成的矩陣 mat ,請(qǐng)輸出一個(gè)大小相同的矩陣,其中每一個(gè)格子是 mat 中對(duì)應(yīng)位置元素到最近的 0 的距離。 兩個(gè)相鄰元素間的距離為 1 。 m == mat.length n == mat[i].length 1 = m, n = 104 1 = m * n = 104 mat[i][j] is either 0 or 1. mat 中至少有一個(gè) 0 找到距離當(dāng)前位置最近的0,有

    2024年02月11日
    瀏覽(17)
  • 每天一道leetcode:127. 單詞接龍(圖論&困難&建圖&廣度優(yōu)先遍歷)

    每天一道leetcode:127. 單詞接龍(圖論&困難&建圖&廣度優(yōu)先遍歷)

    字典 wordList 中從單詞 beginWord 和 endWord 的 轉(zhuǎn)換序列 是一個(gè)按下述規(guī)格形成的序列 beginWord - s1 - s2 - ... - sk : 每一對(duì)相鄰的單詞只差一個(gè)字母。 對(duì)于 1 = i = k 時(shí),每個(gè) si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。 sk == endWord 給你兩個(gè)單詞 beginWord 和 endWord 和一個(gè)字典

    2024年02月12日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包