常州模擬賽d5t1 journalist

2022-05-01 10:18:05 字數 1587 閱讀 4259

分析:出題人喪心病狂卡spfa......只能用dijkstar+堆優化.

主要的難點是字典序的處理上,乙個想法是在做最短路的時候處理,邊鬆弛邊記錄,比個大小記錄最佳答案.具體的思路大概和最短路計數差不多,當遇到d[u] + w[i] == d[v]是,說明到d[v]有兩條最短路了,更新一下答案。

但是這樣效率太低了,每一次鬆弛都要更新一次,能不能一次性更新完呢?可以的.我們在跑完最短路後把滿足d[u] + w[i] == d[v]的點v加入u的鄰接表中,排個序,然後dfs一遍就好了.

#include #include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

long

long inf =1e15;

struct

node

;bool

operator

int n, m,b[200010],head[200010],to[400010],nextt[400010],tot = 1,w[400010],vis[200010

];int u[400010], v[400010], z[400010],ans[200010

];long

long d[200010

];vector

a[200010

];void add(int x, int y, int

z)void

dijkstar()}}

}bool cmp(int x, int

y)void dfs(int depth, int

x)

for (int i = 0; i < a[x].size(); i++)

dfs(depth + 1

, a[x][i]);

}int

main()

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

d[i] =inf;

dijkstar();

printf(

"%lld\n

", d[n]);

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

if (d[u[i]] + z[i] ==d[v[i]])

a[u[i]].push_back(v[i]);

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

sort(a[i].begin(), a[i].end(), cmp);

memset(vis,

0, sizeof

(vis));

dfs(

1, 1

);

return0;

}

常州模擬賽d8t2 繪畫

分析 考慮記錄每個座標上每個顏色出現了幾次,並由此算出每個顏色 在這個座標上的貢獻。答案肯定是原圖的答案扣去矩形的答案,再加 上那個矩形同種顏色的貢獻,這裡的答案指的是 dis.我們先要記錄每個顏色在各個位置出現的次數,因為每一次都是區間操作嘛,所以我們用二維差分可以很好地維護,字首和求出出現的次數...

常州模擬賽d7t2 陣列

hjz 的陣列初始時有 n 個元素。他可以把乙個位置上的數加上或減去乙個固定的 數 x。一天 ljz 和 hzy 來 hjz 家玩。ljz 突發奇想,提出了乙個問題 如何在給定的 操作步數內最小化陣列所有元素的乘積呢?hjz 百思不得其解,但是他想博得 hzy 的好感,就把這個問題交給你啦 由於最小...

常州模擬賽d2t3 小X的佛光

平日裡最喜歡做的事就是蒸發學水。題目描述 小 x 所在的城市 x 城是乙個含有 n 個節點的無向圖,同時,由於 x 國是一 個發展中國家,為了節約城市建設的經費,x 國首相在建造 x 城時只建造 n 1 條邊,使得城市的各個地點能夠相互到達。小 x 計畫蒸發 q 天的學水,每一天會有一名學水從 a ...