Subject to the effect
slightly.
analysis
Because duplicate values, the contribution of each point not identified, we need the help of monotonous stack, the stack can be found away from the monotony because the current peaks nearest big mountain.
See in particular left a book of God.
code show as below
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 5 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i) 6 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i) 7 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i) 8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i) 9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i) 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i) 12 13 #define pr(x) cout << #x << " = " << x << " " 14 #define prln(x) cout << #x << " = " << x << endl 15 16 #define LOWBIT(x) ((x)&(-x)) 17 18 #define ALL(x) x.begin(),x.end() 19 #define INS(x) inserter(x,x.begin()) 20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end()) 21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c 22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower); 23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper); 24 25 #define ms0(a) memset(a,0,sizeof(a)) 26 #define msI(a) memset(a,0x3f,sizeof(a)) 27 #define msM(a) memset(a,-1,sizeof(a)) 28 29 #define MP make_pair 30 #define PB push_back 31 #define ft first 32 #define sd second 33 34 template<typename T1, typename T2> 35 istream &operator>>(istream &in, pair<T1, T2> &p) { 36 in >> p.first >> p.second; 37 return in; 38 } 39 40 template<typename T> 41 istream &operator>>(istream &in, vector<T> &v) { 42 for (auto &x: v) 43 in >> x; 44 return in; 45 } 46 47 template<typename T> 48 ostream &operator<<(ostream &out, vector<T> &v) { 49 Rep(i, v.size()) out << v[i] << " \n"[i == v.size()]; 50 return out; 51 } 52 53 template<typename T1, typename T2> 54 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) { 55 out << "[" << p.first << ", " << p.second << "]" << "\n"; 56 return out; 57 } 58 59 inline int gc(){ 60 static const int BUF = 1e7; 61 static char buf[BUF], *bg = buf + BUF, *ed = bg; 62 63 if(bg == ed) fread(bg = buf, 1, BUF, stdin); 64 return *bg++; 65 } 66 67 inline int ri(){ 68 int x = 0, f = 1, c = gc(); 69 for(; c<48||c>57; f = c=='-'?-1:f, c=gc()); 70 for(; c>47&&c<58; x = x*10 + c - 48, c=gc()); 71 return x*f; 72 } 73 74 template<class T> 75 inline String toString (T x) { 76 ostringstream Sout; 77 Sout << x; 78 return sout.str (); 79 } 80 81 inline int toInt ( string s) { 82 int in; 83 istringstream son (s); 84 son >> in; 85 return to; 86 } 87 88 // min <= AIM <= max 89 template <typename T> 90 inline bool BETWEEN(const T aim, const T min, const T max) { 91 return min <= aim && aim <= max; 92 } 93 94 typedef long long LL; 95 typedef unsigned long long uLL; 96 typedef vector< int > VI; 97 typedef vector< bool > VB; 98 typedef vector< char > VC; 99 typedef vector< double > VD; 100 typedef vector< string > VS; 101 typedef vector< LL > VL; 102 typedef vector< VI > VVI; 103 typedef vector< VB > VVB; 104 typedef vector< VS > VVS; 105 typedef vector< VL > VVL; 106 typedef vector< VVI > VVVI; 107 typedef vector< VVL > VVVL; 108 typedef pair< int, int > PII; 109 typedef pair< LL, LL > PLL; 110 typedef pair< int, string > PIS; 111 typedef pair< string, int > PSI; 112 typedef pair< string, string > PSS; 113 typedef pair< double, double > PDD; 114 typedef vector< PII > VPII; 115 typedef vector< PLL > VPLL; 116 typedef vector< VPII > VVPII; 117 typedef vector< VPLL > VVPLL; 118 typedef vector< VS > VVS; 119 typedef map< int, int > MII; 120 typedef unordered_map< int, int > uMII; 121 typedef map< LL, LL > MLL; 122 typedef map< string, int > MSI; 123 typedef map< int, string > MIS; 124 typedef set< int > SI; 125 typedef stack< int > SKI; 126 typedef deque< int > DQI; 127 typedef queue< int > QI; 128 typedef priority_queue< int > PQIMax; 129 typedef priority_queue< int, VI, greater< int > > PQIMin; 130 const double EPS = 1e-8; 131 const LL inf = 0x7fffffff; 132 const LL infLL = 0x7fffffffffffffffLL; 133 const LL mod = 1e9 + 7; 134 const int maxN = 1e6 + 7; 135 const LL ONE = 1; 136 const LL evenBits = 0xaaaaaaaaaaaaaaaa; 137 const LL oddBits = 0x5555555555555555; 138 139 struct Record { 140 int value, times; 141 142 Record(int v) { 143 value = v; 144 times = 1; 145 } 146 }; 147 148 int N, arr[maxN]; 149 int maxH = -inf, S; // the highest peak (more than one) and the height position of 150 Stack <the Record> SK; // monotone stack 151 LL ANS; 152 153 int main () { 154 // The freopen ( "MyOutput.txt", "W", stdout); 155 // The freopen ( "input.txt", "R & lt", stdin); 156 // the INIT (); 157 Scanf ( " % D " , & N); 158 the Rep (I, N) { 159 Scanf ( " % D " , & ARR [I]); 160. IF (maxH < arr[i]) { 161 maxH =ARR [I]; 162 S = I; 163 } 164 is } 165 sk.push (the Record (ARR [S])); // the maximum value of as the left boundary 166 167 is the For (I, . 1 , N - . 1 ) { 168 int ID = (I + S)% N; 169 170. the while (. sk.top () value < ARR [ID]) { 171 is int tmp = sk.top () Times;. sk.pop (); 172 173 ANS = + (tmp - . 1 ) * tmp / 2 + 2 * tmp; 174 } 175 if(sk.top().value == arr[id]) ++sk.top().times; 176 else sk.push(Record(arr[id])); 177 } 178 while(!sk.empty()) { 179 int tmp = sk.top().times; sk.pop(); 180 181 ans += (tmp - 1) * tmp / 2; // 内部产生山峰对 182 183 if(sk.size() == 1 && sk.top().times == 1) ans += tmp; 184 else if(sk.size() != 0) ans += 2 * tmp; 185 } 186 187 printf("%d\n", ans); 188 return 0; 189 }