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 }

 

 
posted @ 2020-08-10 13:05  programmer_w  阅读(1)  评论(0)    收藏  举报