Advertisement
Guest User

Untitled

a guest
Jan 14th, 2016
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4.  
  5. std::vector<std::pair<int, int> > g[1007];
  6. int number_begin[1007], number_end[1007], sizea[1007];
  7.  
  8. struct Otrezok
  9. {
  10.     int l, r, size;
  11.    
  12.     Otrezok()
  13.     {
  14.         l = r = size = 0;
  15.     }
  16.    
  17.     Otrezok(int _l, int _r, int _size)
  18.     {
  19.         l = _l;
  20.         r = _r;
  21.         size = _size;
  22.     }
  23. };
  24.  
  25. int d[1007];
  26.  
  27. void Dfs(int x)
  28. {
  29.     int to, len;
  30.     for(size_t i = 0; i < g[x].size(); i++)
  31.     {
  32.         to = g[x][i].first;
  33.         len = g[x][i].second;
  34.        
  35.         if(d[to] < d[x] + len)
  36.         {
  37.             d[to] = d[x] + len;
  38.             Dfs(to);
  39.         }
  40.     }
  41. }
  42.  
  43. int main()
  44. {
  45.     std::ifstream fin("input.txt");
  46.     std::ofstream fout("output.txt");
  47.    
  48.     int n, x;
  49.     fin >> n;
  50.    
  51.     for(int i = 1; i <= n; i++)
  52.     {
  53.         fin >> x;
  54.         if(number_begin[x] == 0)
  55.             number_begin[x] = i;
  56.         else
  57.             number_end[x] = i;
  58.         sizea[x]++;
  59.     }
  60.    
  61.     std::vector<Otrezok> otr;
  62.     int li, lj, ri, rj;
  63.    
  64.     for(int a = 1; a <= 100; a++)
  65.     {
  66.         if(number_begin[a] == 0) continue;
  67.         li = number_begin[a];
  68.         ri = number_end[a];
  69.         if(ri == 0) ri = li;
  70.         otr.push_back(Otrezok(li, ri, sizea[a]));
  71.     }
  72.    
  73.     for(size_t i = 0; i < otr.size(); i++)
  74.     {
  75.         li = otr[i].l;
  76.         ri = otr[i].r;
  77.         g[0].push_back(std::make_pair((int)i + 1, otr[i].size));
  78.         for(size_t j = 0; j < otr.size(); j++)
  79.         {
  80.             lj = otr[j].l;
  81.             rj = otr[j].r;
  82.            
  83.             if(ri < lj)
  84.             {
  85.                 g[(int)i + 1].push_back(std::make_pair((int)j + 1, otr[j].size));
  86.             }
  87.         }
  88.     }
  89.    
  90.     Dfs(0);
  91.    
  92.     int num = (int)otr.size(), ans = 0;
  93.    
  94.     for(int i = 1; i <= num; i++) ans = std::max(ans, d[i]);
  95.    
  96.     fout << ans << std::endl;
  97.    
  98.     fin.close();
  99.     fout.close();
  100.    
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement