输入包含两行。第一行一个正整数 ,表示数组的长度。第二行 个正整数 ,表示数组 。
输出一行一个正整数表示答案。
3 1 2 3
6
可以选择:这六个区间。
5 1 3 2 2 5
10
#include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; vector<int> a(n + 2); for(int i = 1; i <= n; i++) { cin >> a[i]; } a[n + 1] = 1e18; vector<int> p(n + 1), s(n + 2); for(int i = 1; i <= n; i++) { if(a[i] >= a[i - 1]) { p[i] = p[i - 1] + 1; } else { p[i] = 1; } } for(int i = n; i; i--) { if(a[i] <= a[i + 1]) { s[i] = s[i + 1] + 1; } else { s[i] = 1; } } int ans = 0; for(int i = 1; i <= n; i++) { int x = a[i - 1]; if(p[i - 1] < i - 1) break; int l = i, r = n + 1; while(l < r) { int mid = l + r >> 1; if(s[mid] == (n - mid + 1) && x <= a[mid]) r = mid; else l = mid + 1; } ans += n - l + 1; ans += l > i; } cout << ans << endl; } signed main () { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); int _ = 1; while(_ -- ) { solve(); } return 0; }
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
#include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; vector<int> a(n + 2); for(int i = 1; i <= n; i++) { cin >> a[i]; } a[n + 1] = 1e18; vector<int> p(n + 1), s(n + 2); for(int i = 1; i <= n; i++) { if(a[i] >= a[i - 1]) { p[i] = p[i - 1] + 1; } else { p[i] = 1; } } for(int i = n; i; i--) { if(a[i] <= a[i + 1]) { s[i] = s[i + 1] + 1; } else { s[i] = 1; } } int ans = 0; for(int i = 1; i <= n; i++) { int x = a[i - 1]; if(p[i - 1] < i - 1) break; int l = i, r = n + 1; while(l < r) { int mid = l + r >> 1; if(s[mid] == (n - mid + 1) && x <= a[mid]) r = mid; else l = mid + 1; } ans += n - l + 1; ans += l > i; } cout << ans << endl; } signed main () { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); int _ = 1; while(_ -- ) { solve(); } return 0; }