【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]);
}

猜你喜欢

转载自www.cnblogs.com/leiyuanze/p/12337009.html