//Beaver's Calculator(分层排序)
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
typedef long long LL;
#define rep(i,a,b) for(int i=(a);i<=(b);(i++))
#define MAX 5005
struct science
{
int no;
LL val[MAX];
int pos,coun;
}sci[5001];
struct answer
{
int num;
LL v;
}ans[MAX*4],temp[MAX*4];
void merg(int x,int y)
{
int m=(x+y)/2;
int l=x;
int r=m+1;
int i=x;
while(l<=m&&r<=y)
{
if(ans[l].v<=ans[r].v) temp[i].num=ans[l].num,temp[i++].v=ans[l].v,l++;
else temp[i].num=ans[r].num,temp[i++].v=ans[r].v,r++;
}
while(l<=m) temp[i].num=ans[l].num,temp[i++].v=ans[l].v,l++;
while(r<=y) temp[i].num=ans[r].num,temp[i++].v=ans[r].v,r++;
for(int p=x;p<=y;p++) ans[p]=temp[p];
}
void mergsort(int a,int b)//归并排序函数,传入的是数组的下标
{
if(a<b)
{
int mid=(a+b)/2;
mergsort(a,mid);//先拆分,后归并
mergsort(mid+1,b);
merg(a,b);//归并函数
}
}
int main()
{
int n;
cin>>n;
int tol=0;
int left,right,bad=0,sum;
left=right=1;
int k,a,x,y,m;
rep(i,1,n)
{
sum=0;
cin>>k>>a>>x>>y>>m;
tol+=k;
sci[i].val[1]=a;
sci[i].no=i;
sci[i].pos=1;
sci[i].coun=k;
rep(j,2,k)
{
sci[i].val[j]=(sci[i].val[j-1]*x+y)%m;
if(sci[i].val[j]<sci[i].val[j-1]) sum++;
}
bad=max(bad,sum);
}
cout<<bad<<endl;
if(tol<=200000)
{
while(right<=tol)//只有当所有问题解决完才结束循环
{
rep(i,1,n)//外循环,搜索科学家
{
rep(j,sci[i].pos,sci[i].coun)//内循环,搜索每个科学家的每个问题
{
if(sci[i].val[j]<sci[i].val[j-1]&&j!=sci[i].pos)//当碰到坏对时,标记pos,并退出这个科学家
{
sci[i].pos=j;
break;
}
ans[right].num=sci[i].no;//把科学家的问题放入
ans[right].v=sci[i].val[j];
right++;
if(j==sci[i].coun) sci[i].pos=sci[i].coun+1;
}
}
mergsort(left,right-1);//每出现一个坏对,进行一次排序,实现了分层排序,保证了相对顺序不变
left=right;//光标移到下一层
}
rep(q,1,tol) cout<<ans[q].v<<" "<<ans[q].num<<endl;
}
return 0;
}
/*
2
2 1 1 1 10
2 3 1 1 10
*/
Beaver‘s Calculator(分层排序)
最新推荐文章于 2021-12-27 18:59:02 发布