QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#568818#9313. Make Maxzy_syRE 0ms0kbC++142.7kb2024-09-16 18:41:312024-09-16 18:41:32

Judging History

你现在查看的是最新测评结果

  • [2024-09-18 15:56:24]
  • hack成功,自动添加数据
  • (/hack/836)
  • [2024-09-16 18:41:32]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-09-16 18:41:31]
  • 提交

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

output:


result: