ybt高效高階3 4 4 恆星的亮度

2022-07-05 22:51:14 字數 2184 閱讀 2486

有一些恆星,每個恆星有亮度。

給出一些恆星亮度的相對關係,詢問這些恆星亮度總和至少有多大。

恆星最暗的亮度是 \(1\)。數值越大越亮。

關係有兩個亮度相等,乙個比另乙個亮或暗,乙個不比另乙個亮或暗。

首先,有乙個小坑,就是不大於其實是小於等於,不小於是大於等於,不要搞反了。

那我們會想到如果 \(a\) 亮度小於 \(b\),那 \(b\) 的亮度可以是 \(a+1\),如果是小於等於,那就是 \(a\)。

如果有多個這樣的條件,為了使都滿足,我們要取亮度最大的。

那如果相同,那就相同咯。

因為你考慮可以從乙個地方推出來全部。

但是還有大於和大於等於啊,那你如果要直接弄的話,就不能確定一開始的點的亮度了。

那我們考慮把它轉化成小於和小於等於。

如果 \(a\) 大於 \(b\),那其實等價於 \(b\) 小於 \(a\)。

如果 \(a\) 大於等於 \(b\),那其實等價於 \(b\) 小於等於 \(a\)。

那接著的問題就是如何確定一開始的初始點。

然後你就會發現它有環。

那讓有環變成無環。。。

tarjan 縮點!

怎麼縮呢,我們考慮把 \(a\) 小於或小於等於 \(b\) 連一條從 \(a\) 到 \(b\) 的有向邊。然後縮在一起的就是亮度相同的。

然後你會想到如果乙個環中有一條邊是由小於構成的,那就出問題了。(因為你又要求亮度相同,然後你這個地方由不能讓亮度相同,那就出矛盾了)

那你就把邊分成兩類,可以參與縮點的和不可以參與的。

然後你也正常縮點(不然變成不了 dag),然後建縮點後的圖的時候如果一條邊是不能參與縮點的,但是它的兩邊在縮點後屬於同乙個的話,就說明矛盾,就無解了。

然後你就會發現 dag 的起始點可能不止乙個,但是問題不大,就都設為亮度是 \(1\) 不久好了嗎。

然後就會想到用拓撲序 dp,然後你在轉移的時候判斷一下你轉移的邊的型別,如果是小於的就是原來的 \(+1\),否則就是原來的。

(因為你要總和最小)

(我一開始直接無腦加一,就只有 \(70\) 分)

然後就可以了,具體實現可以看看**。

#include#include#include#include#define ll long long

using namespace std;

struct node e[1000001], e_[1000001];

ll ans;

int le_[100001], kk_;

int n, m, le[100001], kk, in[100001];

int op, x, y, dfn[100001], tmp, tot, ru[100001];

int low[100001], sta[100001], num[100001], dis[100001];

queue q;

void add(int x, int y, int cc) ; le[x] = kk;

}void add_(int x, int y, int cc) ; le_[x] = kk_;

}void tarjan(int now)

else if (!in[e[i].to]) low[now] = min(low[now], low[e[i].to]);

if (dfn[now] == low[now])

sta[0]--; }}

int main()

if (op == 2)

if (op == 3)

if (op == 4)

if (op == 5) }

for (int i = 1; i <= n; i++)//縮點

if (!dfn[i]) tarjan(i);

for (int i = 1; i <= n; i++)

for (int j = le[i]; j; j = e[j].nxt)

if (in[i] != in[e[j].to])

else if (e[j].cc)

for (int i = 1; i <= tot; i++)

if (!ru[i]) q.push(i), dis[i] = 1;

while (!q.empty())

} }printf("%lld", ans);

return 0;

}

ybt高效高階1 5 1 走迷宮

在乙個 n n 的地圖中,一些地方可以走一些不可以走。問你從乙個地方走到另乙個地方的最小步數。就是直接 bfs 搞過去。跑圖,跑到要的點就輸出退出。include include using namespace std int n,a 1001 1001 sx,sy,tx,ty,ans,now,no...

ybt高效高階2 4 1 字首統計

有一堆字串,然後每次有乙個詢問,問乙個有多少個字串是乙個給出的字串的字首。這道題可以看出用 trie 樹 甚至有點模板 就建樹就普通的建。至於詢問,其實我們可以按著長度推 trie 數的位置,每次長度都是乙個字首。然後答案加上就可以。當然,我們在詢問的時候已經不用再重新建樹,遇到沒有這個分支的就可以...

ybt高效高階3 2 2 新的開始

有乙個圖,要你讓所有點所在的連通塊都至少有乙個標記點。兩個點相連有乙個規定的費用,把乙個點標記也有費用。要費用最小,輸出最小費用。這道題看到判斷連通,我們就想到並查集。然後最小,就想到最小生成樹。但是它不一定只選乙個點標記,而且如果標記了不止乙個點,整個圖就可以不是整個連通的。那怎麼辦呢?那我們想想...