hznuoj2798 线段树+最短路
http://acm.hznu.edu.cn/OJ/problem.php?id=2798
1 #include<algorithm> 2 #include<cstdio> 3 #include<iostream> 4 #include<queue> 5 #include<vector> 6 #include<map> 7 #include<stack> 8 #include<string> 9 #include<cmath> 10 #include<sstream> 11 #include<cstring> 12 #include<set> 13 using namespace std; 14 typedef long long int ll; 15 typedef unsigned long long int ull; 16 inline int rd() { 17 int X = 0, w = 0;char ch = 0;while (!isdigit(ch)) { w |= ch == '-';ch = getchar(); } 18 while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();return w ? -X : X; 19 } 20 inline ll lrd() { 21 ll X = 0, w = 0;char ch = 0;while (!isdigit(ch)) { w |= ch == '-';ch = getchar(); } 22 while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();return w ? -X : X; 23 } 24 #define bug puts("DEBUG*******************************") 25 #define in(a) int n = rd() 26 #define pi acos(-1) 27 #define pb push_back 28 #define rep(i,a,n) for(int i=a;i<=n;++i) 29 #define per(i,a,n) for(int i=a;i>=n;--i) 30 #define sld(n) scanf("%lld",&n) 31 #define sldd(n,m) scanf("%lld %lld",&n,&m) 32 #define pd(n) printf("%d\n",n) 33 #define pld(n) printf("%lld\n",n) 34 #define mem(a,b) memset(a,b,sizeof a) 35 #define Case(T) int T=rd();while (T--) 36 #pragma comment(linker, "/STACK:102400000,102400000") 37 const double eps = 1e-8; 38 const int inf = 0x3f3f3f3f; 39 const ll INF = 0x3f3f3f3f3f3f3f3f; 40 const int MOD = 1e5 + 7; 41 const int maxn = 5e4+10; 42 bool vis[maxn<<2]; 43 ll dis[maxn<<2]; 44 int tot; 45 int rt1[maxn << 2], rt2[maxn << 2]; 46 struct edge { 47 int from, to; 48 ll w; 49 edge() {} 50 edge(int from, int to, ll w) :from(from), to(to), w(w) {} 51 }; 52 vector<edge>e[maxn<<2]; 53 struct node { 54 int id; 55 ll n_dis; 56 node() {} 57 node(int id, ll n_dis) :id(id), n_dis(n_dis) {} 58 bool operator<(const node& a)const { return n_dis > a.n_dis; } 59 }; 60 void build(int rt, int l, int r, int op) { 61 if (!op)rt1[rt] = ++tot; 62 else rt2[rt] = ++tot; 63 rep(i, l, r) { 64 if (!op)e[tot].pb({ tot,i,0 }); 65 else e[i].pb({ i,tot,0 }); 66 } 67 if (l == r)return; 68 int mid = l + r >> 1; 69 build(rt << 1, l, mid, op); 70 build(rt << 1|1, mid+1, r, op); 71 } 72 void update(int rt, int l, int r, int u, int L, int R, ll w, int op) { 73 if (L <= l && R >= r) { 74 if (op==2) { 75 e[rt2[rt]].pb({ rt2[rt],u,w }); 76 } 77 else { 78 e[u].pb({ u,rt1[rt],w }); 79 } 80 return; 81 } 82 int mid = l + r >> 1; 83 if (L <= mid) update(rt << 1, l, mid, u, L, R, w, op); 84 if (R > mid) update(rt << 1 | 1, mid + 1, r, u, L, R, w, op); 85 } 86 void dij(int s) { 87 for (int i = 1;i < maxn;i++)dis[i] = INF, vis[i] = false; 88 dis[s] = 0; 89 priority_queue<node>Q; 90 Q.push(node{ s,dis[s] }); 91 while (!Q.empty()) { 92 node u = Q.top(); 93 Q.pop(); 94 if (vis[u.id])continue; 95 vis[u.id] = true; 96 int len = e[u.id].size(); 97 for (int i = 0;i < len;i++) { 98 edge y = e[u.id][i]; 99 if (vis[y.to])continue; 100 if (dis[y.to] > y.w + u.n_dis) { 101 dis[y.to] = y.w + u.n_dis; 102 Q.push({ y.to,dis[y.to] }); 103 } 104 } 105 } 106 } 107 int main() { 108 int n = rd(), m = rd(); 109 while (m--) { 110 int u = rd(), v = rd(); 111 ll w = rd(); 112 e[u].pb({ u,v,w }); 113 } 114 tot = n; 115 build(1, 1, n, 0); 116 build(1, 1, n, 1); 117 int q = rd(); 118 while (q--) { 119 int op = rd(); 120 if (op == 1) { 121 int u = rd(), l = rd(), r = rd(); 122 ll w = lrd(); 123 update(1, 1, n, u, l, r, w, op); 124 } 125 else { 126 int l = rd(), r = rd(), u = rd(); 127 ll w = lrd(); 128 update(1, 1, n, u, l, r, w, op); 129 } 130 } 131 dij(1); 132 rep(i, 1, n) { 133 if (dis[i] == INF)puts("-1"); 134 else pld(dis[i]); 135 } 136 }