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