#6. 【NOI2014】随机数生成器

来源:互联网 发布:淘宝货品上架 编辑:程序博客网 时间:2024/05/17 09:16

http://uoj.ac/problem/6

这个卡内存真是差评


因为按题目随机完了之后 T数组是一个全排列

这样我们可以 从1~n*m贪心

能放就放


那么问题就是 如果O(1)判断他是否能放

事实证明因为此题的性质打个标记就好了

然后我当时 ... 写了个二维树状数组 白白多出两个log TLE了 只拿到60分


#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define LL long longconst int INF = 1e9;const int MO = 1000000007;const int MAXN =25000000+10; int x0,a,b,c,d,n,m,q; int t[MAXN];inline void get_t(){int nn=n*m;for(int i=1;i<=nn;i++)t[i]=i,swap(t[i],t[   (x0=((  (LL)a*x0%d*x0%d  + (LL)b*x0%d  )%d+c)%d)  %i+1]);}inline void do_q(){int u,v;for(int i=1;i<=q;i++){scanf("%d %d",&u,&v);swap(t[v],t[u]);}}int  loc[MAXN];inline void get_loc(){int nn=n*m;for(int i=1;i<=nn;i++){loc[t[i]]=i;}}bool bb[5000+10][5000+10];void mark(int xx,int yy){for(int i=xx+1;!bb[i][yy-1]&&i<=n;i++)for(int j=yy-1;!bb[i][j]&&j>=1;j--)bb[i][j]=true;for(int i=xx-1;!bb[i][yy+1]&&i>=1;i--)for(int j=yy+1;!bb[i][j]&&j<=m;j++)bb[i][j]=true;}inline int get_loc_x(int i){return (loc[i]-1)/m+1;}inline int get_loc_y(int i){return loc[i]-get_loc_x(i)*m+m;}inline void solve(){int nn=n*m;for(int i=1;i<=nn;i++){int xx=get_loc_x(i),yy=get_loc_y(i);if(!bb[xx][yy]){mark(xx,yy);printf("%d ",i);}}}int main(){scanf("%d %d %d %d %d %d %d %d",&x0,&a,&b,&c,&d,&n,&m,&q);get_t();do_q();get_loc();solve();return 0;}


0 0