蒟蒻的分块,能过样例&&0pts,求调
查看原帖
蒟蒻的分块,能过样例&&0pts,求调
1153677
Treap_Kongzs楼主2024/7/14 00:38
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
//const unsigned long long mod=18446744073709551616;

int arr[maxn];
int block=0;
int tot=0;
int l[maxn];
int r[maxn];
int belong[maxn];
int cpy[maxn];

int arr1[maxn];
int block1=0;
int tot1=0;
int l1[maxn];
int r1[maxn];
int belong1[maxn];
int cpy1[maxn];

void init(int n)
{
	block=(int)sqrt(n);
	tot=n/block;
	if(n%block!=0)tot++;
	for(int i=1;i<=tot;i++)
	{
		l[i]=(i-1)*block+1;
		r[i]=i*block;
	}
	r[tot]=n;
	for(int i=1;i<=n;i++)
	{
		belong[i]=(i-1)/block+1;
	}
	for(int i=1;i<=tot;i++)
	{
		sort(cpy+l[i],cpy+r[i]+1);
	}
	block1=(int)sqrt(n);
	tot1=n/block;
	if(n%block1!=0)tot1++;
	for(int i=1;i<=tot1;i++)
	{
		l[i]=(i-1)*block1+1;
		r[i]=i*block1;
	}
	r[tot1]=n;
	for(int i=1;i<=n;i++)
	{
		belong1[i]=(i-1)/block1+1;
	}
	for(int i=1;i<=tot1;i++)
	{
		sort(cpy1+l1[i],cpy1+r1[i]+1);
	}
}

unsigned long long query(int x,int y)
{
	if(belong[x]==belong[y])
	{
		int maxx=0;
		int maxx1=0;
		for(int i=x;i<=y;i++)
		{
			if(arr[i]>maxx)maxx=arr[i];
		}
		for(int i=x;i<=y;i++)
		{
			if(arr1[i]>maxx1)maxx1=arr1[i];
		}
		return maxx*maxx1;
	}
	int maxx=0;
	int maxx1=0;
	for(int i=x;i<=r[belong[x]];i++)
	{
		if(arr[i]>maxx)maxx=arr[i];
	}
	for(int i=l[belong[y]];i<=y;i++)
	{
		if(arr[i]>maxx)maxx=arr[i];
	}
	for(int i=belong[x]+1;i<=belong[y]-1;i++)
	{
		int ll=l[i],rr=r[i],mid=0;
		while(ll<=rr)
		{
			mid=(ll+rr)/2;
			if(cpy[mid]>=maxx)
			{
				rr=mid-1;
			}
			else
			{
				ll=mid+1;
			}
		}
	}
	for(int i=x;i<=r1[belong1[x]];i++)
	{
		if(arr1[i]>maxx1)maxx1=arr1[i];
	}
	for(int i=l1[belong1[y]];i<=y;i++)
	{
		if(arr1[i]>maxx1)maxx1=arr1[i];
	}
	for(int i=belong1[x]+1;i<=belong1[y]-1;i++)
	{
		int ll=l1[i],rr=r1[i],mid=0;
		while(ll<=rr)
		{
			mid=(ll+rr)/2;
			if(cpy1[mid]>=maxx1)
			{
				rr=mid-1;
			}
			else
			{
				ll=mid+1;
			}
		}
	}
	return maxx*maxx1;
}

int main()
{
	int t=0,n=0,q=0;
	cin>>t>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>arr[i];
	}
	memcpy(cpy,arr,sizeof(arr));
	for(int i=1;i<=n;i++)
	{
		cin>>arr1[i];
	}
	memcpy(cpy1,arr1,sizeof(arr1));
	init(n);
	cin>>q;
	int ll=0,rr=0;
	unsigned long long ans=0;
	for(int i=1;i<=q;i++)
	{
		cin>>ll>>rr;
		for(int j=ll;j<=rr;j++)
		{
			for(int k=j;k<=rr;k++)
			{
				ans+=query(i,j);
			}
		}
	}
	cout<<ans;
	return 0;
}
2024/7/14 00:38
加载中...