10.24 test1 T3

在这里插入图片描述

思路

在这里插入图片描述在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define p MOD
using namespace std;

int read()
{
	char ch=' ';
	int f=1;int x=0;
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
	    x=x*10+ch-'0';ch=getchar();
	}
	return x*f;
}
const int N=1e5+100;
const int MOD=998244353;
int a[N];
int ans=0;
int mn[N],mx[N],s1[N],s2[N],s3[N];
void work(int l,int r)
{
	if(l==r)
	{
		ans=(ans+1ll*a[l]*a[l]%p)%p;
		return ;
	}
	int mid=(l+r) >> 1;
	mn[mid]=a[mid];mx[mid]=a[mid];
	for(int i=mid-1;i>=l;i--)
	{
		mn[i]=min(mn[i+1],a[i]);
		mx[i]=max(mx[i+1],a[i]);
	}
	mn[mid+1]=a[mid+1];mx[mid+1]=a[mid+1];
	for(int i=mid+2;i<=r;i++)
	{
		mn[i]=min(mn[i-1],a[i]);
		mx[i]=max(mx[i-1],a[i]);
	}
	cout<<l<<' '<<r<<endl;
	for(int i=l;i<=r;i++)
	{
		cout<<mn[i]<<' ';
	}
	cout<<endl;
	s1[mid]=0;s2[mid]=0;s3[mid]=0;
	for(int i=mid+1;i<=r;i++)
	{
		s1[i]=(s1[i-1]+mn[i])%p;
		s2[i]=(s2[i-1]+mx[i])%p;
		s3[i]=(s3[i-1]+1ll*mn[i]*mx[i]%p)%p;
	}
	int p1=mid+1,p2=mid+1;
	for(int i=mid;i>=l;i--)
	{
		while(p1<=r&&mn[p1]>a[i]) p1++;
		while(p2<=r&&mx[p2]<a[i]) p2++;
		if(p1<p2)
		{
			ans=(ans+1ll* mn[i] * mx[i] %p *( p1 -mid -1)%p)%p;
			ans = (ans + 1LL * mx[i] * (s1[p2 - 1] - s1[p1 - 1] + p) % p) % p;
            ans = (ans + (s3[r] - s3[p2 - 1] + p) % p) % p;
        } else
        {
            ans = (ans + 1LL * mn[i] * mx[i] % p * (p2 - mid - 1) % p) % p;
            ans = (ans + 1LL * mn[i] * (s2[p1 - 1] - s2[p2 - 1] + p) % p) % p;
            ans = (ans + (s3[r] - s3[p1 - 1] + p) % p) % p;
        }
	}

	work(l,mid);
	work(mid+1,r);
}
int main()
{
	int n;
	n=read();
	int i;
	for(i=1;i<=n;i++)
	{
		a[i]=read();
	}
	work(1,n); 
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42110318/article/details/83421415