60分代码求调!
查看原帖
60分代码求调!
1032391
封禁用户楼主2025/1/23 23:00

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define deap(i,a,b) for(int i=a;i>=b;i--)
#define in(a) a=read()
const int N = 1e5+5;
const int inf = INT_MAX;
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
void fast() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
}
int sta1[N],sta2[N],top1,top2,l[N],r[N],ls[N],rs[N];

signed main() {
	//fast();
	int n;
	in(n);
	int *a=new int[n+1];
	rep(i,1,n)in(a[i]);
	int ans=0,sum;
	rep(i,1,n){
		while(top1&&a[sta1[top1]]<a[i])r[sta1[top1--]]=i-1;
		while(top2&&a[sta2[top2]]>a[i])rs[sta2[top2--]]=i-1;
		sta1[++top1]=sta2[++top2]=i;
	}                               
	while(top1)r[sta1[top1--]]=n;
	while(top2)rs[sta2[top2--]]=n;
	deap(i,n,1){
		while(top1&&a[sta1[top1]]<=a[i])l[sta1[top1--]]=i+1;
		while(top2&&a[sta2[top2]]>=a[i])ls[sta2[top2--]]=i+1;
		sta1[++top1]=sta2[++top2]=i;
	}
	while(top1)l[sta1[top1--]]=1;
	while(top2)ls[sta2[top2--]]=1;
	rep(i,1,n){
        ans=ans+a[i]*(i-l[i]+1)*(r[i]-i+1);
        ans=ans-a[i]*(i-ls[i]+1)*(rs[i]-i+1);
    }
	cout<<ans;
	delete[]a; 
	return 0;
}
2025/1/23 23:00
加载中...