Advertisement
tien_noob

BONUS - VOI 2021 - Sqrt Decomposition

Feb 3rd, 2022
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. //Make CSP great again
  2. //You're as beautiful as the day I lost you
  3. //New year, best wishes
  4. #include <bits/stdc++.h>
  5. #define TASK "TESTCODE"
  6. #define Log2(x) 31 - __builtin_clz(x)
  7. using namespace std;
  8. const int N = 3e5, K = 1e6, M = 1e5, block = 550;
  9. int n, m, a[N + 1];
  10. long long dp[K + 1], add[K + 1], luck[M + 1], f[M + 1], res = 0;
  11. vector<int> Adj[M + 1];
  12. struct Trie
  13. {
  14.     struct node
  15.     {
  16.         int child[26];
  17.         node()
  18.         {
  19.             memset(child, -1, sizeof(child));
  20.         }
  21.     };
  22.     vector<node> Tree;
  23.     void new_node()
  24.     {
  25.         node tmp;
  26.         Tree.push_back(tmp);
  27.     }
  28.     Trie()
  29.     {
  30.         new_node();
  31.     }
  32.     int Index(string &s)
  33.     {
  34.         int id = 0;
  35.         for (char c : s)
  36.         {
  37.             int w = c - 'A';
  38.             if (Tree[id].child[w] == -1)
  39.             {
  40.                 Tree[id].child[w] = Tree.size();
  41.                 new_node();
  42.             }
  43.             id = Tree[id].child[w];
  44.         }
  45.         return id;
  46.     }
  47.     void Update(string &s, int u)
  48.     {
  49.         int id = 0;
  50.         for (char c : s)
  51.         {
  52.             int w = c - 'A';
  53.             add[id] = max(add[id], dp[u]);
  54.             id = Tree[id].child[w];
  55.         }
  56.     }
  57. } Tree;
  58. string s[N + 1];
  59. void read()
  60. {
  61.     cin >> n >> m;
  62.     for (int i = 1; i <= n; ++ i)
  63.     {
  64.         cin >> s[i] >> a[i];
  65.     }
  66.     for (int i = 1; i <= m; ++ i)
  67.     {
  68.         int u, v;
  69.         cin >> u >> v;
  70.         Adj[u].push_back(v);
  71.         Adj[v].push_back(u);
  72.     }
  73.     for (int i = 1; i <= M; ++ i)
  74.     {
  75.         sort(Adj[i].begin(), Adj[i].end(), [](const int &x, const int &y)
  76.         {
  77.             return Adj[x].size() > Adj[y].size();
  78.         });
  79.     }
  80. }
  81. long long Get(int u, long long x)
  82. {
  83.     if (Adj[u].size() <= block)
  84.     {
  85.         long long t = luck[u];
  86.         t = max(t, x);
  87.         for (int v : Adj[u])
  88.         {
  89.             if (Adj[v].size() <= block)
  90.             {
  91.                 break;
  92.             }
  93.             t = max(t, f[v]);
  94.         }
  95.         for (int v : Adj[u])
  96.         {
  97.             luck[v] = max(luck[v], t + u);
  98.         }
  99.         return t + u;
  100.     }
  101.     else
  102.     {
  103.         long long t = luck[u];
  104.         t = max(t, x);
  105.         for (int v : Adj[u])
  106.         {
  107.             if (Adj[v].size() <= block)
  108.             {
  109.                 break;
  110.             }
  111.             luck[v] = max(luck[v], t + u);
  112.         }
  113.         f[u] = max(f[u], t + u);
  114.         return t + u;
  115.     }
  116. }
  117. void solve()
  118. {
  119.     for (int i = 1; i <= n; ++ i)
  120.     {
  121.         int j = Tree.Index(s[i]);
  122.         long long t = Get(a[i], add[j]);
  123.         dp[j] = max(dp[j], t);
  124.         res = max(res, t);
  125.         Tree.Update(s[i], j);
  126.         //cerr << res << '\n';
  127.     }
  128.     cout << res;
  129. }
  130. int main()
  131. {
  132.     ios_base::sync_with_stdio(false);
  133.     cin.tie(nullptr);
  134.     if (fopen(TASK".INP", "r"))
  135.     {
  136.         freopen(TASK".INP", "r", stdin);
  137.         //freopen(TASK".out", "w", stdout);
  138.     }
  139.     int t = 1;
  140.     bool typetest = false;
  141.     if (typetest)
  142.     {
  143.         cin >> t;
  144.     }
  145.     for (int __ = 1; __ <= t; ++ __)
  146.     {
  147.         //cout << "Case " << __ << ": ";
  148.         read();
  149.         solve();
  150.     }
  151. }
  152.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement