QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#566857 | #9313. Make Max | mardog666 | WA | 29ms | 5140kb | C++17 | 2.0kb | 2024-09-16 02:30:16 | 2024-09-16 02:30:17 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
typedef pair<int,int> PII;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int _=1;
cin>>_;
while(_--)
{
int n;
cin>>n;
int a[N];
for(int i=0;i<n;i++) cin>>a[i];
stack<PII> st;//单调栈找到最大操作数
st.push({a[0],0});//第一个先入栈
int ans=0;//存储答案
for(int i=1;i<n;i++)
{
if(st.top().first>a[i])//如果下一个比前一个要小,则入栈,因为不需要改变。例如第一个数为3 第二个数为1,第一个数不会随着第二个数改变
{
PII t;
t.first=a[i];
t.second=i;
st.push(t);//入栈
}
else if(st.top().first<a[i])//如果下一个比前一个要大,则要开始判断
{
PII t;
bool f=1;//判断到什么时候截止,例如 4 3 5,前面两个最终都会变成5,不会只有第二个数在变
while(!st.empty()&&f)//循环更新
{
f=0;
if(st.top().first<a[i])//看看是否还需要继续更新
{
f=1;//进来了说明还会继续更新,所以f变为1
t=st.top();
st.pop();
ans+=i-t.second;//直接用下标相减,因为会隔开。例如4 3 5.下标为0 1 2 则会有2次改变全变成5
}
}
if(st.size())
{
if(st.top().first==a[i])continue;//如果处理到不能再处理时最后一个数恰好为a[i],则继续循环
}
st.push({a[i],t.second});//如果不是,则最后一个a[i]入栈。为什么不能直接插入i而是t.second,因为如果这个a[i]不是最大的数字
//接上,则他最后会有t.second个数需要变成下一个更大的数
}
}
while(st.size()>1)
{
PII t=st.top();
st.pop();
cout<<t.second<<endl;
ans+=n-t.second;//因为50行已经处理过了,所以直接用n-t.second。比如9 4 3 5,5的second就是 1,4-1就是最后需要变成9的个数
}
cout<<ans<<endl;
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 5140kb
input:
4 2 1 2 2 2 2 7 1 1 1 2 2 2 2 3 1 2 3
output:
1 0 3 3
result:
ok 4 number(s): "1 0 3 3"
Test #2:
score: -100
Wrong Answer
time: 29ms
memory: 5136kb
input:
2 198018 875421126 585870339 471894633 383529988 625397685 944061047 704695631 105113224 459022561 760848605 980735314 847376362 980571959 329939331 644635272 326439858 752879510 837384394 175179068 182094523 397239381 1199016 185143405 279638454 252374970 822030887 860312140 137248166 993229443 164...
output:
198017 198016 198014 197984 194015 188522 162516 154292 84090 4084978 190745 190744 190474 189995 175173 163715 102304 37702 35767 4130372
result:
wrong answer 1st numbers differ - expected: '4084978', found: '198017'