Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.72 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pub push_back
  4. #define ll long long
  5. #define mp make_pair
  6. #define all(a) a.begin(), a.end()
  7. #define x first
  8. #define y second
  9.  
  10. const int INF = (int)1e9 + 7;
  11. const ll LINF = (ll)4e18 + 7;
  12.  
  13. using namespace std;
  14.  
  15. struct reb{
  16.     int to, c, num;
  17.     reb() {}
  18.     reb(int x1, int y1, int c1){
  19.         to = x1;
  20.         c = y1;
  21.         num = c1;
  22.     }
  23. };
  24.  
  25. const int dd = 1000007;
  26.  
  27. int n, m;
  28. vector<reb> g[dd];
  29. vector<reb> gr[dd];
  30. vector<int> g2[dd];
  31. int d[2][dd];
  32. ll dp[dd];
  33. set<pair<int, int> > se;
  34.  
  35. void relax1(int v){
  36.     for (auto to : g[v]){
  37.         if (d[0][to.to] > d[0][v] + to.c){
  38.             se.erase(mp(d[0][to.to], to.to));
  39.             d[0][to.to] = d[0][v] + to.c;
  40.             se.insert(mp(d[0][to.to], to.to));
  41.         }
  42.     }
  43. }
  44.  
  45. void dij1(){
  46.     for (int i = 0; i < n; i++) d[0][i] = INF;
  47.     d[0][0] = 0;
  48.     se.insert(mp(d[0][0], 0));
  49.     while(se.size()){
  50.         auto now = *se.begin();
  51.         se.erase(se.begin());
  52.         relax1(now.y);
  53.     }
  54. }
  55.  
  56. void relax2(int v){
  57.     for (auto to : gr[v]){
  58.         if (d[1][to.to] > d[1][v] + to.c){
  59.             se.erase(mp(d[1][to.to], to.to));
  60.             d[1][to.to] = d[1][v] + to.c;
  61.             se.insert(mp(d[1][to.to], to.to));
  62.         }
  63.     }
  64. }
  65.  
  66. void dij2(){
  67.     for (int i = 0; i < n; i++) d[1][i] = INF;
  68.     d[1][n - 1] = 0;
  69.     se.insert(mp(0, n - 1));
  70.     while(se.size()){
  71.         auto now = *se.begin();
  72.         se.erase(se.begin());
  73.         relax2(now.y);
  74.     }
  75. }
  76.  
  77. vector<pair<pair<int, int>, int> > re[dd];
  78. int kk = 0;
  79. vector<pair<int, int> > q[dd];
  80. vector<int> por;
  81. bool was[dd];
  82. vector<pair<int, int> > ha[dd];
  83. vector<pair<double, pair<ll, ll> > > t[dd];
  84.  
  85. void dfs(int v){
  86.     was[v] = 1;
  87.     for (int to : g2[v])
  88.         if (!was[to]) dfs(to);
  89.     por.pub(v);
  90. }
  91.  
  92. double per(pair<ll, ll> t, pair<ll, ll> s){
  93.     return (double)(s.y - t.y) / (double)(t.x - s.x);
  94. }
  95.  
  96. const bool is_testing = 1;
  97. int main(){
  98.     srand('W' + 'I' + 'N');
  99.     if (is_testing){
  100.         freopen("trains.in", "r", stdin);
  101.         freopen("trains.out", "w", stdout);
  102.     } else {
  103.  
  104.     }
  105.     scanf("%d %d", &n, &m);
  106.     for (int i = 0; i < m; i++){
  107.         int sz;
  108.         scanf("%d", &sz);
  109.         int last;
  110.         scanf("%d", &last); last--;
  111.         for (int j = 0; j < sz; j++){
  112.             int vv, tt;
  113.             scanf("%d %d", &tt, &vv);
  114.             vv--;
  115.             g[last].pub(reb(vv, tt, i));
  116.             gr[vv].pub(reb(last, tt, i));
  117.             re[i].pub(mp(mp(last, vv), tt));
  118.             last = vv;
  119.         }
  120.     }
  121.     dij1(); dij2();
  122.     for (int i = 0; i < m; i++){
  123.         bool f = 0;
  124.         for (int j = (int)re[i].size() - 1; j >= 0; j--){
  125.             int a = re[i][j].x.x, b = re[i][j].x.y, c = re[i][j].y;
  126.             if (d[0][a] + c + d[1][b] == d[0][n - 1]){
  127.                 if (!f){
  128.                     kk++;
  129.                     q[kk].pub(mp(b, c));
  130.                 }
  131.                 f = 1;
  132.                 q[kk].pub(mp(a, c));
  133.             } else f = 0;
  134.         }
  135.     }
  136.     for (int i = 1; i <= kk; i++){
  137.         reverse(all(q[i]));
  138.         for (int j = (int)q[i].size() - 1; j >= 1; j--)
  139.             q[i][j].y = q[i][j - 1].y;
  140.         q[i][0].y = 0;
  141.         for (int j = 1; j < q[i].size(); j++)
  142.             q[i][j].y += q[i][j - 1].y;
  143.         for (int j = 1; j < q[i].size(); j++)
  144.             g2[q[i][j - 1].x].pub(q[i][j].x);
  145.         for (int j = 0; j < q[i].size(); j++)
  146.             ha[q[i][j].x].pub(mp(i, j));
  147.     }
  148.     dfs(0);
  149.     for (int i = 0; i < n; i++) dp[i] = -LINF;
  150.     dp[n - 1] = 0;
  151.     for (int v : por){
  152.         for (pair<int, int> x : ha[v]){
  153.             if (t[x.x].size() > 0){
  154.                 int l = -1, r = t[x.x].size();
  155.                 while(l + 1 < r){
  156.                     int m = (l + r) >> 1;
  157.                     if (t[x.x][m].x > q[x.x][x.y].y)
  158.                         r = m;
  159.                     else
  160.                         l = m;
  161.                 }
  162.                 ll b = t[x.x][l].y.y;
  163.                 ll k = t[x.x][l].y.x;
  164.                 dp[v] = max(dp[v], b + (ll)k * q[x.x][x.y].y + (ll)q[x.x][x.y].y * q[x.x][x.y].y);
  165.             }
  166.         }
  167.         for (pair<int, int> x : ha[v]){
  168.             ll b = dp[v] + (ll)q[x.x][x.y].y * q[x.x][x.y].y, k = (ll)-2 * q[x.x][x.y].y;
  169.             while(t[x.x].size()){
  170.                 double xx = per(mp(k, b), t[x.x].back().y);
  171.                 if (xx <= t[x.x].back().x) t[x.x].pop_back();
  172.                 else {
  173.                     t[x.x].push_back(mp(xx, mp(k, b)));
  174.                     break;
  175.                 }
  176.             }
  177.             if (t[x.x].size() == 0)
  178.                 t[x.x].pub(mp(0, mp(k, b)));
  179.  
  180.         }
  181.     }
  182.     cout << d[0][n - 1] << ' ' << dp[0];
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement