Advertisement
K_Y_M_bl_C

Untitled

Feb 17th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.22 KB | None | 0 0
  1. const int Q = (int)6e5 + 7;
  2.  
  3. int n, m, cur;
  4. pll cl[Q];
  5. int was[MAXN];
  6. int col[MAXN];
  7. vector < pair <pii, ll> > e;
  8. map <pii, ll> q;
  9. map <pii, bool> us;
  10. vi rg[MAXN], gs[MAXN];
  11. vpll g[MAXN], p[MAXN];
  12. vi order;
  13. vll dpmnup, dpmxup, dpmndn, dpmxdn;
  14.  
  15. void dfs1(int u)
  16. {
  17.     was[u] = 1;
  18.     for (auto to : gs[u])
  19.     {
  20.         if (!was[to])
  21.             dfs1(to);
  22.     }
  23.     order.inb(u);
  24. }
  25.  
  26. void dfs2(int u)
  27. {
  28.     col[u] = cur;
  29.     for (auto to : rg[u])
  30.     {
  31.         if (col[to] == cur)
  32.         {
  33.             cl[cur].X = min(cl[cur].X, q[mk(to, u)]);
  34.             cl[cur].Y = max(cl[cur].Y, q[mk(to, u)]);
  35.         }
  36.         if (!col[to])
  37.             dfs2(to);
  38.     }
  39. }
  40.  
  41. void calcmnup(int u)
  42. {
  43.     if (cl[u].X >= 0 && cl[u].X <= 1000000000)
  44.         dpmnup[u] = cl[u].X;
  45.     else
  46.         dpmnup[u] = INF;
  47.     was[u] = 1;
  48.     for (auto to : g[u])
  49.     {
  50.         if (!was[to.X])
  51.             calcmnup(to.X);
  52.         dpmnup[u] = min(dpmnup[u], dpmnup[to.X]);
  53.         dpmnup[u] = min(dpmnup[u], to.Y);
  54.     }
  55. }
  56.  
  57. void calcmxup(int u)
  58. {
  59.     if (cl[u].Y >= 0 && cl[u].Y <= 1000000000)
  60.         dpmxup[u] = cl[u].Y;
  61.     else
  62.         dpmxup[u] = -INF;
  63.     was[u] = 1;
  64.     for (auto to : g[u])
  65.     {
  66.         if (!was[to.X])
  67.             calcmxup(to.X);
  68.         dpmxup[u] = max(dpmxup[u], dpmxup[to.X]);
  69.         dpmxup[u] = max(dpmxup[u], to.Y);
  70.     }
  71. }
  72.  
  73. void calcmndn(int u)
  74. {
  75.     if (cl[u].X >= 0 && cl[u].X <= 1000000000)
  76.         dpmndn[u] = cl[u].X;
  77.     else
  78.         dpmndn[u] = INF;
  79.     was[u] = 1;
  80.     for (auto to : p[u])
  81.     {
  82.         if (!was[to.X])
  83.             calcmndn(to.X);
  84.         dpmndn[u] = min(dpmndn[u], dpmndn[to.X]);
  85.         dpmndn[u] = min(dpmndn[u], to.Y);
  86.     }
  87. }
  88.  
  89. void calcmxdn(int u)
  90. {
  91.     if (cl[u].Y >= 0 && cl[u].Y <= 1000000000)
  92.         dpmxdn[u] = cl[u].Y;
  93.     else
  94.         dpmxdn[u] = -INF;
  95.     was[u] = 1;
  96.     for (auto to : p[u])
  97.     {
  98.         if (!was[to.X])
  99.             calcmxdn(to.X);
  100.         dpmxdn[u] = max(dpmxdn[u], dpmxdn[to.X]);
  101.         dpmxdn[u] = max(dpmxdn[u], to.Y);
  102.     }
  103. }
  104.  
  105. int solve()
  106. {
  107.     scanf("%d %d", &n, &m);
  108.     dpmnup.resize(MAXN);
  109.     dpmxup.resize(MAXN);
  110.     dpmndn.resize(MAXN);
  111.     dpmxdn.resize(MAXN);
  112.     fill(cl, cl + MAXN, mk(INF, -INF));
  113.     forn(i, m)
  114.     {
  115.         int x, y;
  116.         ll c;
  117.         scanf("%d %d %lld", &x, &y, &c);
  118.         --x, --y;
  119.         rg[y].inb(x);
  120.         q[mk(x, y)] = c;
  121.         gs[x].inb(y);
  122.         e.inb(mk(mk(x, y), c));
  123.     }
  124.     forn(i, n)
  125.     {
  126.         if (!was[i])
  127.             dfs1(i);
  128.     }
  129.     forn(i, order.size())
  130.     {
  131.         if (!col[order[n - i - 1]])
  132.         {
  133.             ++cur;
  134.             dfs2(order[n - i - 1]);
  135.         }
  136.     }
  137.     forn(i, m)
  138.     {
  139.         int a = e[i].X.X;
  140.         int b = e[i].X.Y;
  141.         ll cst = e[i].Y;
  142.         g[a].inb(mk(b, cst));
  143.         p[b].inb(mk(a, cst));
  144.     }
  145.     ll ans = 0;
  146.     for (int i = 1; i <= cur; ++i)
  147.     {
  148.         if (cl[i].Y != -INF && cl[i].X != INF)
  149.             ans = max(ans, (ll)cl[i].Y - cl[i].X);
  150.     }
  151.     memset(was, 0, sizeof(was));
  152.     for1(i, cur)
  153.     {
  154.         if (!was[i])
  155.             calcmndn(i);
  156.     }
  157.     memset(was, 0, sizeof(was));
  158.     for1(i, cur)
  159.     {
  160.         if (!was[i])
  161.             calcmxdn(i);
  162.     }
  163.     memset(was, 0, sizeof(was));
  164.     for1(i, cur)
  165.     {
  166.         if (!was[i])
  167.             calcmnup(i);
  168.     }
  169.     memset(was, 0, sizeof(was));
  170.     for1(i, cur)
  171.     {
  172.         if (!was[i])
  173.             calcmxup(i);
  174.     }
  175.     for (int i = 1; i <= cur; ++i)
  176.     {
  177.         ll mnup = dpmnup[i];
  178.         ll mxup = dpmxup[i];
  179.         ll mndn = dpmndn[i];
  180.         ll mxdn = dpmxdn[i];
  181.         if (mnup <= 1000000000 && mnup >= 0 && mxdn >= 0 && mxdn <= 1000000000)
  182.             ans = max(ans, (ll)mxdn - mnup);
  183.         if (mndn <= 1000000000 && mndn >= 0 && mxup >= 0 && mxup <= 1000000000)
  184.             ans = max(ans, (ll)mxup - mndn);
  185.     }
  186.     cout << ans;
  187.     return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement