bzoj 3671: [Noi2014]随机数生成器

来源:互联网 发布:福建人 知乎 编辑:程序博客网 时间:2024/05/17 20:32

Description

Input

第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子。第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M 的排列来填入她 N 行 M 列的棋盘,并且小H在初始的 N×M 次交换操作后,又进行了 Q 次额外的交换操作。接下来 Q 行,第 i 行包含两个整数 u_i,v_i,表示第 i 次额外交换操作将交换 T_(u_i )和 T_(v_i ) 的值。

Output

输出一行,包含 N+M-1 个由空格隔开的正整数,表示可以得到的字典序最小的路径序列。

 

Sample Input

1 3 5 1 71
3 4 3
1 7
9 9
4 9



Sample Output


1 2 6 8 9 12

HINT


本题的空间限制是 256 MB,请务必保证提交的代码运行时所使用的总内存空间不超过此限制。


一个32位整数(例如C/C++中的int和Pascal中的Longint)为4字节,因而如果在程序中声明一个长度为 1024×1024 的32位整型变量的数组,将会占用 4 MB 的内存空间。





 


2≤N,M≤5000


0Q50000


0a300


0≤b,c≤108


0≤x0<d≤108


1≤ui,vi≤N×M




这题因为要求是字典序最小= =所以就可以贪心。一位位取看能不能取到。

取的时候把取的这个数左下右上标记成不可取就行了。

这里放心大单地O(NM)标记。因为每个只会被标记一次所以均摊也就是这个复杂度

【记得找到已经标记过的就直接break】

然后就可以过了

其实还有个难点是数组开不下,要重复利用。标号转换什么的自己推推就好了


#include<cstdio>#include<string>#include<cstring>using namespace std;int x[25000001];int t[5001][5001];int ans[100001];int main(){     long long a,b,c,d;     scanf("%lld%lld%lld%lld%lld",&x[0],&a,&b,&c,&d);     int n,m,q;     scanf("%d%d%d",&n,&m,&q);     int i,j;     int nt=n*m;     for(i=1;i<=nt;i++)          x[i]=(a*x[i-1]*x[i-1]+b*x[i-1]+c)%d;     for(i=1;i<=n;i++)          for(j=1;j<=m;j++)               t[i][j]=(i-1)*m+j;     int x1,x2;     for(i=1;i<=n;i++)     {          for(j=1;j<=m;j++)          {             int loc=x[(i-1)*m+j]%((i-1)*m+j)+1;             x1=(loc-1)/m+1;               x2=loc-(x1-1)*m;               int tx=t[i][j];               t[i][j]=t[x1][x2];               t[x1][x2]=tx;          }     }     int xx1,yy1,xx2,yy2;     for(i=1;i<=q;i++)     {          scanf("%d%d",&x1,&x2);          xx1=(x1-1)/m+1;          yy1=x1-(xx1-1)*m;          xx2=(x2-1)/m+1;          yy2=x2-(xx2-1)*m;          int tx=t[xx1][yy1];          t[xx1][yy1]=t[xx2][yy2];          t[xx2][yy2]=tx;     }     for(i=1;i<=n;i++)          for(j=1;j<=m;j++)               x[t[i][j]]=(i-1)*m+j;     memset(t,0,sizeof(t));     int xx=0,yy=0;     int p=0;     int ii,jj;     int ss,tt;     for(i=1;i<=nt;i++)     {          xx=(x[i]-1)/m+1;          yy=x[i]-(xx-1)*m;          if(t[xx][yy]!=0)               continue;          p++;          ans[p]=i;          if(p==n+m-1)               break;          ss=1;          tt=yy-1;          for(ii=xx+1;ii<=n;ii++)          {               if(t[ii][tt]!=0)                    break;               for(jj=tt;jj>=ss;jj--)               {                    if(t[ii][jj]!=0)                    {                         ss=jj+1;                         break;                    }                    t[ii][jj]=1;               }               if(ss>tt)                    break;          }          ss=yy+1;          tt=m;          for(ii=xx-1;ii>=1;ii--)          {               if(t[ii][ss]!=0)                    break;               for(jj=ss;jj<=tt;jj++)               {                    if(t[ii][jj]!=0)                    {                         tt=jj-1;                         break;                    }                    t[ii][jj]=1;               }               if(ss>tt)                    break;          }     }     for(i=1;i<=p-1;i++)          printf("%d ",ans[i]);     printf("%d\n",ans[i]);     return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑ip地址受限怎么办 百度云资源打不开怎么办 百度网盘看文件字太小怎么办 密码输入三次错误怎么办 notes邮箱满了怎么办 小米8买不到怎么办 小米付款不发货怎么办 小米金融还款中怎么办 股票遇到闪崩怎么办 微信插件没有怎么办 excel打印太小怎么办 工地临时人员死亡怎么办 哺乳期乳腺增生疼怎么办 哺乳期有乳腺增生怎么办 哺乳期得了乳腺增生怎么办 中等教育认证花名册丢失怎么办 哺乳期囊性结节怎么办 乳腺增生堵奶怎么办 月子期乳房增生怎么办 母乳期乳腺增生怎么办 上市公司破产了股票怎么办 iptv错误码30022怎么办 电信iptv不清晰怎么办 电信iptv卡顿怎么办 pr滚动字幕闪烁怎么办 电视车表盘看不清怎么办 图片字看不清楚怎么办 字太潦草看不清怎么办 微信图片看不清怎么办 小车上坡没动力怎么办 上海牌照拍到了怎么办 杭州车牌摇不到怎么办 孩子不上进家长怎么办 孩子读书蠢以后怎么办 上海银行储蓄卡怎么办 分数不够读高中怎么办 iso11.4耗电快怎么办 支票存根联丢失怎么办 注册公司没有办公室怎么办 收款条一方有怎么办 员工收款跑了怎么办