The5threic1-1

D2 - Soln

Aug 25th, 2024
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | Source Code | 0 0
  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. using namespace std;
  4. #ifdef  ONLINE_JUDGE
  5.     #define eprintf(...) 42
  6. #else
  7.         #define eprintf(...) {fprintf(stderr, __VA_ARGS__);fflush(stderr);}
  8. #endif
  9. clock_t startTime;
  10. double getCurrentTime()
  11. {
  12.     return (double)(clock() - startTime) / CLOCKS_PER_SEC;
  13. }
  14. const int N = 200007;
  15. vector<long long> dp(N, -1);
  16. set<int> gph, waste;
  17. vector<int> g[N];
  18. long long dfs(int node)
  19. {
  20.     if(dp[node]!=-1)
  21.     {
  22.         return dp[node];
  23.     }
  24.     long long res = node;
  25.     for(auto stuff : g[node])
  26.     {
  27.         res = max(res, dfs(stuff));
  28.     }
  29.     return dp[node]=res;       
  30. }
  31. int solve()
  32. {
  33.     long long n, m;
  34.     cin>>n>>m;
  35.     for(int i=0; i<n; i++)
  36.     {
  37.         int sz;
  38.         cin>>sz;
  39.         vector<long long> guy(sz);
  40.         for(int j=0; j<sz; j++)
  41.         {
  42.             cin>>guy[j];   
  43.         }  
  44.         sort(guy.begin(), guy.end());
  45.         long long nxt = 0, edg = -1;
  46.         for(int j=0; j<sz; j++)
  47.         {
  48.             if(guy[j]>nxt)
  49.             {
  50.                 if(edg==-1)
  51.                 {
  52.                     edg = nxt;
  53.                     nxt++;
  54.                     j--;
  55.                     continue;
  56.                 }
  57.                 else
  58.                 {
  59.                     break;
  60.                 }
  61.             }
  62.             if(guy[j]==nxt)
  63.             {
  64.                 nxt++;
  65.             }          
  66.         }
  67.         if(edg==-1)
  68.         {
  69.             edg = nxt; nxt++;
  70.         }
  71.         g[edg].push_back(nxt);
  72.         gph.insert(edg); gph.insert(nxt);
  73.         waste.insert(edg); 
  74.     }
  75.     long long base = *prev(waste.end());
  76.     long long ans = 0;
  77.     for(auto node : waste)
  78.     {
  79.         //cout<<"yo "<<" "<<node<<endl;
  80.         if(g[node].size()>1)
  81.         {
  82.             base = max(base, dfs(node));
  83.         }
  84.     }
  85.     for(auto node : waste)
  86.     {
  87.         if(dfs(node)>base && node<base && node<=m)
  88.         {
  89.             ans += dfs(node) - base;
  90.             continue;
  91.         }
  92.         if(dfs(node)>node && node>=base && node<=m)
  93.         {
  94.             ans += dfs(node) - node;   
  95.         }  
  96.     }
  97.     long long shit = min(base-1, m);
  98.     cout<<ans + (shit+1)*base + (m*(m+1))/2 - (shit*(shit+1))/2<<endl;
  99.     for(auto stuff : gph)
  100.     {
  101.         g[stuff].clear();
  102.         dp[stuff] = -1;
  103.     }
  104.     waste.clear(); gph.clear();
  105.     return 0;
  106. }
  107. int main()
  108. {
  109.     ios::sync_with_stdio(false);
  110.     cin.tie(0);
  111.     int t;
  112.     cin>>t;
  113.     startTime = clock();
  114.     while(t--)
  115.     {
  116.         solve();
  117.     }
  118.     eprintf("time = %.5lf\n", getCurrentTime());
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment