Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 21st, 2010 | Syntax: C++ | Size: 1.56 KB | Hits: 47 | Expires: Never
Copy text to clipboard
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cmath>
  5. #include <cstdlib>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <string>
  9. #include <list>
  10. #include <deque>
  11. #include <map>
  12. #include <set>
  13. #include <queue>
  14. #include <stack>
  15. #include <utility>
  16. #include <sstream>
  17. #include <cstring>
  18. using namespace std;
  19.  
  20. #define FALL(ii,vv) for (int (ii)=0; (ii)<(vv).size();(ii)++)
  21. #define REP(i,b) for(int (i)=(0);(i)<(b);(i)++)
  22. #define FUP(i,a,b) for(int (i)=(a); (i)<=(b); (i)++)
  23. #define ALL(a) a.begin(), a.end()
  24. #define PB push_back
  25. #define MP make_pair
  26.  
  27. typedef vector<int> vi;
  28. typedef long long ll;
  29.  
  30. int n,t[1000010];
  31. pair<int,int> kol[1000010];
  32.  
  33. set<int> s;
  34. map<int,int> M;
  35.  
  36. void dodaj(int a){ s.insert(a); }
  37.  
  38. void update(int a){
  39.         if (s.size()==0){
  40.                 M[1<<30]++;
  41.                 return ;
  42.         }
  43.         set<int>::iterator it;
  44.         //maxx
  45.         int gora;
  46.         it = s.upper_bound(a);
  47.         if (it == s.end()) it=s.begin();
  48.         gora = (*it);
  49.         M[gora]++;
  50. }
  51.  
  52. long long f(long long n){
  53.         n+=min(2,int(s.size()));
  54.         printf("F %lld\n",n);
  55.         return (ll)n*(n-1)/2-(s.size()>=2?1:0);
  56. }
  57.  
  58. int main(){
  59.         s.clear();
  60.         scanf("%d",&n);
  61.         REP(i,n) scanf("%d",&t[i]);
  62.        
  63.         REP(i,n){ kol[i].first = t[i]; kol[i].second = i; }
  64.         sort(kol,kol+n);
  65.         reverse(kol,kol+n);
  66.        
  67.         kol[n].first = -1;
  68.         int i=0,j=0;
  69.        
  70.         long long res = 0;
  71.         while(i<n){
  72.                 M.clear();
  73.                 while(kol[i].first==kol[j].first) update(kol[i++].second);
  74.                 for(map<int,int>::iterator it = M.begin(); it!=M.end(); it++)
  75.                         res += f(it->second);
  76.                 while(i!=j) dodaj(kol[j++].second);
  77.         }
  78.         printf("%lld\n",res);
  79.         return 0;
  80. }