萌新刚学oi Wa 18 19 两个点求助
  • 板块P5012 水の数列
  • 楼主g1ove
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/6/21 13:19
  • 上次更新2023/11/3 13:26:26
查看原帖
萌新刚学oi Wa 18 19 两个点求助
638537
g1ove楼主2023/6/21 13:19
#include<bits/stdc++.h>
#define ld double
#define ll long long
#define MAXN 1500005
using namespace std;
ll n,m;
ll a[MAXN],sum,cnt,s[MAXN],id[MAXN],w[MAXN];
ll A,b,x,y,last;
struct node{
	ll id;
	ll v;
}tr[4*MAXN];
int fa[MAXN];
vector<int> q[MAXN];
bool operator > (node a,node b)
{
	if(a.v==-1) return 0;
	if(b.v==-1) return 1;
	if(a.v*b.id!=b.v*a.id) return a.v*b.id>b.v*a.id;
	return a.id>b.id;
}
int find(int x)
{
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void p(int x,int y)
{
	x=find(x),y=find(y);
	if(x==y) return ;
	fa[x]=y;
	cnt-=s[x]*s[x]+s[y]*s[y];
	s[y]+=s[x];
	cnt+=s[y]*s[y];
}
void build(int l,int r,int x)
{
	if(l==r)
	{
		tr[x].id=id[l];
		tr[x].v=w[l];
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,x*2);
	build(mid+1,r,x*2+1);
	if(tr[x*2]>tr[x*2+1])	tr[x]=tr[x*2];
	else tr[x]=tr[x*2+1];
}
node query(int l,int r,int L,int R,int x)
{
	if(l>R||r<L) return (node){1,-1e9};
	if(l>=L&&r<=R) return tr[x];
	int mid=(l+r)/2;
	node t1=query(l,mid,L,R,x*2),t2=query(mid+1,r,L,R,x*2+1);
	if(t1.v==-1e9) return t2;
	if(t2.v==-1e9) return t1; 
	if(t1>t2) return t1;
	return t2;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]),fa[i]=i,s[i]=1,q[a[i]].push_back(i),w[i]=-1;
	a[0]=a[n+1]=1e9;
	for(int i=1;i<=1e6;i++)
	{
		for(int j=0;j<q[i].size();j++)
		{
			cnt++;
			int pos=q[i][j],p1=0,p2=0;
			if(a[pos]>=a[pos-1]) p1=1;
			if(a[pos]>=a[pos+1]) p2=1;
			if(!p1&&!p2) sum++;
			if(p1&&p2) 
			{
				sum--,p(pos,pos-1),p(pos,pos+1);
				continue;
			}
			if(p1)
				p(pos,pos-1);
			if(p2) 
				p(pos,pos+1);
		}
		if(cnt*id[sum]>=w[sum]*i) w[sum]=cnt,id[sum]=i;
	}
	build(1,n,1);
	while(m--)
	{
		scanf("%lld%lld%lld%lld",&A,&b,&x,&y);
		A=(A%n+n)%n,b=(b%n+n)%n,x=(x%n+n)%n,y=(y%n+n)%n;
		int l=(A*last%n+x-1+n)%n+1,
		r=(b*last%n+y-1+n)%n+1;
		if(l>r) swap(l,r);
		
		node ans=query(1,n,l,r,1);
		if(ans.v==-1) printf("-1 -1\n");
		else printf("%lld %lld\n",ans.v,ans.id);
		printf("%d %d %lld\n",l,r,last);
		if(ans.v==-1) last=1%n;
		else last=ans.v%n*ans.id%n;
	}
	return 0;
}
2023/6/21 13:19
加载中...