Beaver‘s Calculator(分层排序)

//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

*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值