关于复杂度
查看原帖
关于复杂度
46091
uuku楼主2023/7/28 12:04

有大佬能帮忙看一下复杂度是 O(n)O(n) 的吗,怕分析错了。

#include<bits/stdc++.h>
using namespace std;

namespace FAST_IO{
	#define Get() (BUF[Pin++])
	const int LEN=1<<20;
	char BUF[LEN];
	int Pin=LEN;
	inline void flushin(){memcpy(BUF,BUF+Pin,LEN-Pin),fread(BUF+LEN-Pin,1,Pin,stdin),Pin=0;return;}
	inline char Getc(){return (Pin==LEN?(fread(BUF,1,LEN,stdin),Pin=0):0),BUF[Pin++];}
	template<typename tp=int>inline tp read(){(Pin+32>=LEN)?flushin():void();tp res=0;char f=1,ch=' ';for(;ch<'0'||ch>'9';ch=Get())if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=Get())res=(res<<3)+(res<<1)+ch-48;return res*f;}
}
using namespace FAST_IO;

const int N=1e6+10;
int n,a[N],ch[N][2],L[N],R[N],stk[N],top,mx;
long long ans;
void solve(int l,int r,int p)
{
	if(l>=r)return;
	int pl=p-1,pr=p;
	while(L[pl]>=l&&R[pr]<=r)
	{
		while(R[pr]<=r&&a[R[pr]]>a[pl])pr=R[pr];
		ans+=1ll*(pl-L[pl])*(min(r,R[pr]-1)-p+1);
		pl=L[pl];
	}
	while(R[pr]<=r&&a[R[pr]]>a[pl])pr=R[pr];
	ans+=1ll*(pl-l+1)*(min(r,R[pr]-1)-p+1);
	solve(l,p-1,ch[p][0]);
	solve(p+1,r,ch[p][1]);
	return;
}
int main()
{
	freopen("E.in","r",stdin);
//	freopen("E_.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=n;i++) if(a[i]==n) mx=i;
	top=0;
	for(int i=1;i<=n;i++)
	{
		while(top&&a[stk[top]]<a[i])top--;
		if(top&&a[ch[stk[top]][1]]<a[i])ch[stk[top]][1]=i;
		stk[++top]=i;
	}
	top=0;
	for(int i=n;i;i--)
	{
		while(top&&a[stk[top]]<a[i])top--;
		if(top&&a[ch[stk[top]][0]]<a[i])ch[stk[top]][0]=i;
		stk[++top]=i;
	}
	top=0;
	for(int i=1;i<=n;i++)
	{
		while(top&&a[stk[top]]>a[i])top--;
		L[i]=stk[top];
		stk[++top]=i;
	}
	top=0;
	for(int i=n+1;i;i--)
	{
		while(a[stk[top]]>a[i]&&top)top--;
		R[i]=stk[top];
		stk[++top]=i;
	}
	solve(1,n,mx);
	cout<<ans<<'\n';
	return 0;
}


2023/7/28 12:04
加载中...