Advertisement
mateuspl

URI_1472

Jun 30th, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.     while (1)
  9.     {
  10.         int N;
  11.         cin >> N;
  12.  
  13.         if (cin.eof())
  14.             break;
  15.  
  16.         /*
  17.          *  Armazena a distância de cada ponto a uma origem.
  18.          *  O primeiro elemento é em relação ao ponto na origem (0).
  19.          *  Os elementos seguintes guardam a distância total desses
  20.          *      pontos à origem.
  21.          *  Por exemplo:
  22.          *      -- o input é representado por ">>"
  23.          *      -- o estado da array edges é representado por "{",
  24.          *          seguido dos elementos, e um "}" no fim.
  25.          *      { 0 }
  26.          *      >> 4
  27.          *      { 0 4 }
  28.          *      >> 2
  29.          *      { 0 4 6 } // 6, pois é a distância total do ponto à origem
  30.          *      >> 4
  31.          *      { 0 4 6 10 }
  32.          *      ...
  33.          */
  34.         int edges[N];
  35.  
  36.         /*
  37.          * Comprimento da circunferência
  38.          * Guarda também a distância até o último ponto informado no input
  39.          */
  40.         int totalLen = 0;
  41.  
  42.         /*
  43.          *  Guarda o mesmo que o array edges.
  44.          *  Serve para verificar se à determinada distância existe um ponto.
  45.          */
  46.         set<int> edgesSet;
  47.  
  48.         // Primeiro ponto está na origem
  49.         edges[0] = 0;
  50.  
  51.         int len;
  52.  
  53.         /*
  54.          *  O for vai de 1 a (N - 1).
  55.          *  A última entrada geraria um ponto na origem, que já existe
  56.          *      e tem uma distância igual a 0 (o primeiro adicionado).
  57.          */
  58.         for (int i = 1; i < N; i++)
  59.         {
  60.             cin >> len;
  61.             totalLen += len;
  62.            
  63.             edges[i] = totalLen;
  64.             edgesSet.insert(totalLen);
  65.         }
  66.  
  67.         // Última contagem conclui o comprimento total da circunferência
  68.         cin >> len;
  69.         totalLen += len;
  70.  
  71.         // O arco feito por cada lado do triângulo deve ser então:
  72.         int arc = totalLen / 3;
  73.         int count = 0;
  74.  
  75.         /*
  76.          *  Esse FOR verifica todos os pontos dentro do comprimento do
  77.          *      primeiro arco que começa na origem.
  78.          *  Para cada ponto, se houver um ponto a uma distância do arco
  79.          *      encontrada (arc) e houver um ponto a uma distância 2*arc,
  80.          *      teremos um triângulo.
  81.          */
  82.         for (int i = 0; edges[i] <= arc; i++)
  83.         {
  84.             if (edgesSet.find(edges[i] + arc) != edgesSet.end() &&
  85.                 edgesSet.find(edges[i] + arc + arc) != edgesSet.end())
  86.             {
  87.                 count++;
  88.             }
  89.         }
  90.  
  91.         cout << count << endl;
  92.     }
  93.  
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement