大科學家有乙個圖書館,所以放書的容量也隨之增加了,圖書館可以看成乙個長度為 nn
n 的序列,一開始裡面放著 nn
n 本書,每本書都記載了乙個特定元素的資訊,書中的元素各不相同。
大科學家會先進行若干次研究,最後進行一次科學實驗,這次實驗需要選取一些元素放在一起來進行。每次研究,大科學家會從圖書館中的某些位置抽出一些書來看,然後得出「如果 xx
x位置上的書對應的元素被拿來做實驗了,那麼區間 [l,r][l,r][l
,r]位置上的書對應的元素也必須拿來做實驗,否則會**」這樣的結論。
大科學家有不止 nn
n 本書(也就是說世界上有不止 nn
n 種元素),但是他自己沒時間給圖書館換書,所以他僱了乙個實習生,這個實習生會時不時地拿出一本從來沒被放入圖書館的書,然後替換掉圖書館中某個位置原來的書(所以對於大科學家得到的兩次看似一樣的研究結果,可能由於圖書館中的書被換了,它們的實質內容可能不一樣)。
每本書還記載著對應元素的非負汙染值,大科學家希望在完成一次科學實驗的前提下(不能不選任何元素),這次實驗的總汙染值最小。作為乙個旁觀者,你能看到科學家做的所有研究結果以及實習生換書的順序,然後你需要告訴大科學家,這個最小總汙染值是多少。
由於大科學家精力有限,所以它只能得出不多的實驗結論(具體參見資料範圍)。
第一行乙個正整數 nn
n,代表圖書館的容量。
接下來一行 nn
n 個數,第 ii
i 個非負整數 aia_iai
代表最開始圖書館中第 ii
i 本書所描述的元素的汙染值。
接下來一行乙個整數 mm
m,代表事件的總數。
接下來 mm
m 行,每行代表乙個事件:
若為 00
0 xx
x yy
y,代表實習生拿了一本新書替換了 xx
x 位置的書,新書對應元素的汙染值為 yyy。
若為 11
1 xx
x ll
l rr
r,代表大科學家得到了新的結果,如果 xx
x 位置的書對應的元素加入了實驗,那麼 [l,r][l,r][l
,r] 區間內的書對應的元素都必須拿來做實驗。
保證大科學家的書籍總數 (n+(n+(n
+ 新書數量 )≤105) \le 10^5)≤
105。
每個元素的汙染值 0≤(ai,y)≤1090 \le (a_i,y) \le 10^90≤
(ai
,y)≤
109。
保證 1≤x≤n1 \le x \le n1≤
x≤n,1≤l≤r≤n1 \le l \le r \le n1≤
l≤r≤
n,m≤105m \le 10^5m≤
105。
由於大科學家的精力有限,做不了太多的實驗,所以我們保證 ∑(r−l+1)≤105\sum(r-l+1) \le 10^5∑(
r−l+
1)≤1
05。輸出乙個整數,代表最小總汙染值。
一開始書架上有 55
5 本書,我們記這些元素的編號順次為 1,2,3,4,51,2,3,4,51,
2,3,
4,5,他們的汙染值分別為 1,10,100,1000,100001,10,100,1000,100001,
10,1
00,1
000,
1000
0。一共有 44
4 個事件:
大科學家發現,選了元素 11
1 就必須選元素 3,43,43,
4。大科學家發現,選了元素 33
3 就必須選元素 555。
實習生拿了一本新書,我們記這個新元素的編號為 66
6,他的汙染值為 00
0,替換掉現在書架上的第 33
3 本書,現在書架上的 55
5 本書對應元素為 1,2,6,4,51,2,6,4,51,
2,6,
4,5。
大科學家發現,選了元素 66
6(因為它在位置 33
3 上)就必須選元素 1,21,21,
2。於是在所有可能的方案中,單選乙個元素 22
2 來做實驗是總汙染值最小的,因為如果選擇元素 11
1 或元素 66
6,都存在一些繫結關係使得總汙染值不可能比 101010
更小。樣例輸入
51 10 100 1000 10000
41 1 3 4
1 3 5 5
0 3 0
1 3 1 2
樣例輸出
10
思路:看成有向圖的話不難發現答案一定在出度為0的子圖里,只是環比較難以解決,tarjan縮點演算法可以有效計算強連通分量,即縮圈成點,藍書上有介紹,強連通分量。
#include#include#include#include#include#include#include#define maxn 100000+100
typedef long long ll;
using namespace std;
const ll inf=1e15+7;
ll value[maxn];
int book[maxn];
vectorg[maxn];
stacksta;
stackcopy;
int pre[maxn];
int low_link[maxn];
int scc[maxn];
int dfs_cnt,scc_cnt;
ll result=inf;
void dfs(int now)
else
if(!scc[v])
low_link[now]=min(low_link[now],pre[v]);
} if(low_link[now]==pre[now])
if(!flag)
result=min(result,sum); }}
void find_scc(int n)
int main()
else
}find_scc(n);
printf("%lld\n",result);
return 0;
}
2018 計蒜之道 初賽第一場 A 百度無人車
i i kg。現在希望你設計一種最優的減重方案,使得最重的車輛的重量是所有減重方案中最小的。任何時候,每輛車的重量必須大於等於1 kg。並且減重方案只能減輕整數kg。輸入格式 接下來一行輸入 n 個整數,其中第 i 個整數 a i i 表示第 i 輛車的重量。保證1 n 20000,1 a 2000...
2018 計蒜之道 初賽 第一場
題解 典型的二分 1 pragma warning disable 4996 2 include3 include4 include 5 include6 include7 include8 include9 define ll long long 10using namespace std 111...
2017 計蒜之道 初賽 第一場
阿里的新遊戲 阿里九遊開放平台近日上架了一款新的益智類遊戲 成三棋。成三棋是我國非常古老的乙個雙人棋類遊戲,其棋盤如下圖所示 如果一條線段上的三個交叉點都被同一玩家的棋子佔據的話,則稱這條線段被該玩家成三。現在,小紅和小明兩人在遊戲平台上下棋,其中小紅的棋子是黑色的。請你幫小紅計算他成三的線段數。樣...