【NOI2014】随机数生成器

代码

#include<cstdio>
using namespace std;
typedef long long LL;

const int N = 5000;
int n , m , q , tot;
LL a , b , c , d;
int x[N * N + 5] , T[N * N + 5] , l[N + 5] , r[N + 5] , ans[N + N + 5];

inline void swap(int &x , int &y)
{
	register int t = x;
	x = y , y = t;
}

int main()
{
	scanf("%d%lld%lld%lld%lld%d%d%d" , &x[0] , &a , &b , &c , &d , &n , &m , &q);
	for(register int i = 1; i <= n * m; i++) 
		x[i] = (a * x[i - 1] * x[i - 1] + b * x[i - 1] + c) % d , T[i] = i;
	register int t , u , v;
	for(register int i = 1; i <= n * m; i++) swap(T[i] , T[x[i] % i + 1]);
	for(register int i = 1; i <= q; i++)
	{
		scanf("%d%d" , &u , &v);
		swap(T[u] , T[v]);
	}
	for(register int i = 1; i <= n * m; i++) x[T[i]] = i;
	for(register int i = 1; i <= n; i++) r[i] = 2e9;
	for(register int i = 1; i <= n * m; i++)
	{
		u = x[i] % m ? x[i] / m + 1 : x[i] / m;
		v = (x[i] - 1) % m + 1;
		if (v >= l[u] && v <= r[u])
		{
			ans[++tot] = i;
			if (tot == n + m - 1) break;
			for(register int j = u - 1; j >= 1; j--)
			{
				if (v < r[j]) r[j] = v;
				else break;
			}
			for(register int j = u + 1; j <= n; j++)
			{
				if (v > l[j]) l[j] = v;
				else break;
			}
		}
	}
	for(register int i = 1; i <= tot; i++) printf("%d " , ans[i]);
}
posted @ 2020-02-20 19:12  leiyuanze  阅读(152)  评论(0编辑  收藏  举报