玄学求助
  • 板块P5012 水の数列
  • 楼主AAA404
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/7/17 17:01
  • 上次更新2023/11/3 09:18:20
查看原帖
玄学求助
723198
AAA404楼主2023/7/17 17:01

这是一个诡异的帖子

楼主评测前后十几次,除了RE和MLE之外,WA全在39行,而且都报错太短

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
int n,T,Log[N],st[N][20];
ll lastans;
struct node{
	int id,num;
}a[N];
struct R{
	ll sco;int x;
}res[N];
struct Ren{
	int size,point;
}renge[N];
inline bool cmp(node a,node b)
{
	return a.num<b.num;
}
inline int qwq(double a,double b)
{
	if(fabs(a-b)<1e-8)return 0;
	if(a>b)return 1;
	return -1;
}
inline void RMQ()
{
	Log[1]=0;
	for(int i=2;i<=N;i++)Log[i]=Log[i>>1]+1;
	for(int i=1;i<=n;i++)st[i][0]=i;
	for(int j=1;j<=Log[n];j++)
	{
		for(int i=1;i+(1<<j)-1<=n;i++)
		{
			int tmp=qwq(1.0*res[st[i][j-1]].sco/res[st[i][j-1]].x,1.0*res[st[i+(1<<(j-1))][j-1]].sco/res[st[i+(1<<(j-1))][j-1]].x);
			if(tmp==1)st[i][j]=st[i][j-1];
			else if(tmp==0)
			{
				if(res[st[i][j-1]].x>res[st[i+(1<<(j-1))][j-1]].x)st[i][j]=st[i][j-1];
				else st[i][j]=st[i+(1<<(j-1))][j-1];
			}
			else st[i][j]=st[i+(1<<(j-1))][j-1];
		}
	}
	return;
}
inline R query(int x,int y)
{
	int l=Log[y-x+1];
	int tmp=qwq(1.0*res[st[x][l]].sco/res[st[x][l]].x,1.0*res[st[y-(1<<l)+1][l]].sco/res[st[y-(1<<l)+1][l]].x);
	if(tmp==1)return res[st[x][l]];
	if(tmp==0)
	{
		if(res[st[x][l]].x>res[st[y-(1<<l)+1][l]].x)return res[st[x][l]];
		else return res[st[y-(1<<l)+1][l]];
	}
	else return res[st[y-(1<<l)+1][l]];
}
signed main()
{
 //	freopen(".in","r",stdin);
 //	freopen(".out","w",stdout);
 	ios::sync_with_stdio(0);
 	cin.tie(0);cout.tie(0);
 	cin>>n>>T;
 	for(int i=1;i<=n;i++)res[i]={-1,1};
 	for(int i=1;i<=n;i++)
 	{
 		cin>>a[i].num;
 		a[i].id=i;
	}
	sort(a+1,a+n+1,cmp);
	ll sco=0,cnt=0;
	for(int i=1;i<=n;i++)
	{
		int x=a[i].num,id=a[i].id;
		renge[id]={1,id};
		sco++;
		cnt++;
		if(renge[id-1].size!=0)
		{
			sco+=2ll*renge[id].size*renge[id-1].size;
			cnt--;
			int t=renge[id].size;
			renge[id].size+=renge[id-1].size;
			renge[id].point=renge[id-1].point;
			renge[renge[id-1].point].size+=t;
			renge[renge[id-1].point].point=id;
		}
		if(renge[id+1].size!=0)
		{
			sco+=2ll*renge[id].size*renge[id+1].size;
			cnt--;
			int t1=renge[renge[id+1].point].size,t2=renge[id+1].point;
			renge[renge[id+1].point].size+=renge[id].size;
			renge[renge[id+1].point].point=renge[id].point;
			renge[renge[id].point].size+=t1;
			renge[renge[id].point].point=t2;
		}
		if(i!=n&&a[i].num==a[i+1].num)continue;
		if(qwq(1.0*res[cnt].sco/res[cnt].x,1.0*sco/x)<=0)res[cnt]={sco,x};
	}
	RMQ();
	while(T--)
	{
		int a,b,x,y;
		cin>>a>>b>>x>>y;
		int l=((__int128)a*lastans+x-1)%n+1;
		int r=((__int128)b*lastans+y-1)%n+1;
		if(l>r)swap(l,r);
		R tmp=query(l,r);
		if(tmp.sco<0)
		{
			cout<<"-1 -1"<<endl;
			cout<<l<<" "<<r<<" "<<lastans%n<<endl;
			lastans=1;
			continue;
		}
		cout<<tmp.sco<<" "<<tmp.x<<endl;
		cout<<l<<" "<<r<<" "<<lastans%n<<endl;
		lastans=tmp.sco*tmp.x;
	}
 	return 0;
}
2023/7/17 17:01
加载中...