Bad Hair Day
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#define x first
#define y second
using namespace std;
typedef long long ll;
const int N=1e6+10;
int b[N],a[N];
int l[N],r[N];
//int s[N],topp;
int main() {
int n;
cin>>n;
stack<ll>s;
ll res=0;
for(int i=0; i<n; i++)cin>>a[i];//存数据
for(int i=n-1; i>=0; i--) {//倒着找第一个大于自己的值的下标,
while(s.size()&&a[i]>a[s.top()])s.pop();
if(s.size())//找到存进数组
b[i]=s.top();
else b[i]=n;//没有比自己大的数,就让下标为n,便于最后计算
s.push(i);
}
// int f=0;
// for(int i=n-2; i>=0; i--) {
// if(b[i]==0) {
// b[i]=n;
// break;
// }
// }
// for(int i=0; i<n; i++)cout<<b[i]<<" ";
// cout<<"\n\n\n";
for(int i=0; i<n-1; i++) {//累加下标差即为答案
res=res+b[i]-i-1;
//cout<<res<<" ";
}
cout<<res<<endl;
return 0;
}
累加也可以找一次加一次
上面的麻烦了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#define x first
#define y second
using namespace std;
typedef long long ll;
const int N=1e6+10;
int b[N],a[N];
int l[N],r[N];
//int s[N],topp;
int main() {
int n;
cin>>n;
stack<ll>s;
ll res=0;
for(int i=0; i<n; i++)cin>>a[i];
for(int i=n-1; i>=0; i--) {
while(s.size()&&a[i]>a[s.top()])s.pop();
if(s.size())
b[i]=s.top();
else b[i]=n;
res+=b[i]-i-1;
s.push(i);
}
// int f=0;
// for(int i=n-2; i>=0; i--) {
// if(b[i]==0) {
// b[i]=n;
// break;
// }
// }
// for(int i=0; i<n; i++)cout<<b[i]<<" ";
// cout<<"\n\n\n";
// for(int i=0; i<n-1; i++) {
//
// res=res+b[i]-i-1;
//
// //cout<<res<<" ";
// }
cout<<res<<endl;
return 0;
}
那么你又想找右边第一个大于自己的值的话,只需稍微修改即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#define x first
#define y second
using namespace std;
typedef long long ll;
const int N=1e6+10;
int b[N],a[N];
int l[N],r[N];
//int s[N],topp;
int main() {
int n;
cin>>n;
stack<ll>s;
ll res=0;
for(int i=0; i<n; i++)cin>>a[i];
for(int i=n-1; i>=0; i--) {
while(s.size()&&a[i]>=s.top())s.pop();
if(s.size())
b[i]=s.top();
else b[i]=0;//右边没有,用零标记
//res+=b[i]-i-1;
s.push(a[i]);
}
// int f=0;
// for(int i=n-2; i>=0; i--) {
// if(b[i]==0) {
// b[i]=n;
// break;
// }
// }
// for(int i=0; i<n; i++)cout<<b[i]<<" ";
// cout<<"\n\n\n";
for(int i=0; i<n; i++) {
//res=res+b[i]-i-1;
cout<<b[i]<<" ";
}
// cout<<res<<endl;
return 0;
}