俞鼎力大牛:堆得可持久化
直接上**?
#include#define eps 1e-8using
namespace
std;
int head[10005],cnt=-1,v[10005],rt[10005],mark[1000005],ans,fa[10005
];int
n,m,tot;
double se,dis[10100
];priority_queue
double,int > >q;//
這裡注意,是double ,int
struct
heaptr[30000010
];struct
nodee[
10000010
];void add(int
from,int to,double
w)int merge(int x,int
y)void
dijkstra()}}
}}//
djk跑一遍從終點反向往回走的最短路樹
void dfs(int
from
) }
}}//
標記一下最短路樹上有哪些邊
int newnode(double w,int
to)int
main()
dijkstra();
memset(v,
0,sizeof
v); dfs(n);
for(int i=0;i<=cnt;i+=2
) }
//把不在最短路樹上的路徑加入堆;
//權值是"走不在最短路樹上的邊的路徑長度與最短路的路徑長度的差值"
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
//把在最短路樹上的路徑加入堆
if(dis[1]-se1],ans++; //
走最短路的情況
if(rt[1])q.push(make_pair(-tr[rt[1]].w,rt[1]));//
假如rt[1]沒有說明從n根本到不了1
while(!q.empty())//
把左兒子和右兒子加入優先佇列,因為是小根堆 ,所以這樣加肯定是從小到大的;
if(rt[tr[from].to])q.push(make_pair(cur-tr[rt[tr[from].to]].w,rt[tr[from].to])); //
加to對應的新的堆的路徑;
} printf(
"%d\n
",ans);
}
洛谷P3919 模板 可持久化陣列
題目大意 有兩個操作,1 在第x次操作後的版本上修改乙個值,2 查詢在第x次操作後的版本上的乙個節點的值 即 你需要維護這樣的乙個長度為n的陣列,支援如下幾種操作 1.在某個歷史版本上修改某乙個位置上的值 2.訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一樣的...
洛谷P3835 模板 可持久化平衡樹
本題為題目 普通平衡樹 的可持久化加強版。資料已經經過強化 插入x數 刪除x數 若有多個相同的數,因只刪除乙個,如果沒有請忽略該操作 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數,如不存在輸出 21...
洛谷 P3835 模板 可持久化平衡樹
可持久化平衡樹 可持久化 treap 1.插入 x 2.刪除 x 3.查詢 x 的排名 4.查詢排名為 x 的數 5.求 x 的前驅 6.求 x 的後繼 每次操作都基於某一歷史版本,同時生成乙個新的版本 include include include define maxn 500010 using...