社区讨论

站外题求助

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjicrvi
此快照首次捕获于
2025/11/04 03:03
4 个月前
此快照最后确认于
2025/11/04 03:03
4 个月前
查看原帖
CPP
#include <iostream>
#include <vector>
#include <stack>
#define int long long
using namespace std;
int t,n,a[200001];
signed main(){
    cin>>t;
    while (t--){
        cin>>n;
        stack<int>s;
        int sum=0;
        for (int i=1;i<=n;i++){
            cin>>a[i];
        }
        for (int i=1;i<=n;i++){
            if (s.size()==0){
                s.push(a[i]);
            }else if(s.top()<a[i]){
                int k=a[i];
                while (s.size()>=2){
                    int r=s.top();
                    s.pop();
                    if (s.top()<a[i]){
                        sum+=a[i]-s.top();
                        s.pop();
                        s.push(s.top()+1);
                    }else{
                        s.push(r);
                        break;
                    }
                }
                if (!s.empty())k-=s.top();
                sum+=k;
                s.pop();
                s.push(a[i]+1);
            }else if(s.top()==a[i]){
                s.pop();
                s.push(a[i]+1);
                while (s.size()>=2){
                    int k=s.top(),g;
                    s.pop();
                    g=s.top();
                    s.pop();
                    if (k==g){
                        s.push(k+1);
                    }else{
                        s.push(g);
                        s.push(k);
                        break;
                    }
                }
            }else if(s.top()>a[i]){
                s.push(a[i]);
            }
        }
        vector<int>p;
        stack<int>w;
        while (!s.empty()){
            cout<<s.top()<<' ';
            p.push_back(s.top());
            s.pop();
        }
        cout<<endl;
        cout<<sum<<endl;
        for (int i=0;i<p.size();i++){
            if (w.size()==0){
                w.push(p[i]);
            }else if(w.top()<p[i]){
                int k=p[i]-w.top();
                sum+=k;
                w.pop();
                w.push(p[i]+1);
            }else if(w.top()==p[i]){
                w.pop();
                w.push(p[i]+1);
                while (w.size()>=2){
                    int k=w.top(),g;
                    w.pop();
                    g=w.top();
                    w.pop();
                    if (k==g){
                        w.push(k+1);
                    }else{
                        w.push(g);
                        w.push(k);
                        break;
                    }
                }
            }
        }
        cout<<sum<<endl;
    }
}
0分 结果错了还RE
调了一上午了 为什么错?

回复

0 条回复,欢迎继续交流。

正在加载回复...