QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#568818 | #9313. Make Max | zy_sy | RE | 0ms | 0kb | C++14 | 2.7kb | 2024-09-16 18:41:31 | 2024-09-16 18:41:32 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
vector<int> Right(200002);
vector<int> Left(200002);
stack<int> s;
//快速读取算法
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); }
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T;
T = read();
while(T--){
int size;cin>>size;
vector<int> nums(size);
for(int i = 1;i<=size;i++){
nums[i] = read();
}
//计算每个点右侧第一个大于等于该点的点的位置
for(int i = 1;i<=size;i++){
//栈内未储存地址时向内补充地址
//当前数比栈内地址处的数小的时候,储存当前数地址
if(s.empty()||nums[i]<nums[s.top()]){
s.push(i);
}else{
//当当前数比栈内地址处数大时,记录地址,弹出栈内地址,知道当前数比栈内地址处数小或栈空时
while(!s.empty()&&nums[i]>=nums[s.top()]){
Right[s.top()] = i;
s.pop();
}
//储存当前数地址
s.push(i);
}
}
//最大的数无法弹出,将比最大数大的数的地址记录为一个无意义的地址
while(!s.empty()){
Right[s.top()] = size+1;
s.pop();
}
//重复上述过程储存左端地址
for(int i = size;i>0;i--){
//栈内未储存地址时向内补充地址
//当前数比栈内地址处的数小的时候,储存当前数地址
if(s.empty()||nums[i]<nums[s.top()]){
s.push(i);
}else{
//当当前数比栈内地址处数大时,记录地址,弹出栈内地址,知道当前数比栈内地址处数小或栈空时
while(!s.empty()&&nums[i]>=nums[s.top()]){
Left[s.top()] = i;
s.pop();
}
//储存当前数地址
s.push(i);
}
}
//最大的数无法弹出,将比最大数大的数的地址记录为一个无意义的地址
while(!s.empty()){
Left[s.top()] = 0;
s.pop();
}
long long ans = 0;
for(int i = 1;i<=size;i++){
if(Left[i]!=0||nums[Left[i]]!=nums[i]){
ans+=Right[i]-Left[i]-2;
}else{
ans+=Right[i]-i-1;
}
}
cout<<ans<<endl;
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Runtime Error
input:
4 2 1 2 2 2 2 7 1 1 1 2 2 2 2 3 1 2 3