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

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 long

const 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;
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值