暴力即正解。
#include <cstdio> #include <cstring> #include <algorithm> #define N 5010 #define NN 25001000 using namespace std; struct Fiona { short x,y; int w; }s[NN]; int acl[N],acr[N]; long long seed,a,b,c,p,n,m,q; int rdm() { return seed=(a*seed*seed+b*seed+c)%p; } bool cmp(Fiona A,Fiona B) { return A.w<B.w; } int main() { // freopen("test.in","r",stdin); int i,j,k,cnt; int x,y; scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&seed,&a,&b,&c,&p,&n,&m,&q); for(cnt=i=0;i<n;i++) { for(j=0;j<m;j++) { s[++cnt].w=cnt; s[cnt].x=i; s[cnt].y=j; } acr[i]=m-1; } for(i=1;i<=cnt;i++) { swap(s[i].w,s[rdm()%i+1].w); } for(i=1;i<=q;i++) { scanf("%d%d",&x,&y); if(x==y)continue; swap(s[x].w,s[y].w); } sort(s+1,s+cnt+1,cmp); for(cnt=i=1;i<n+m-1;i++,cnt++) { x=s[cnt].x; y=s[cnt].y; while(y<acl[x]||y>acr[x]) { cnt++; x=s[cnt].x; y=s[cnt].y; } printf("%d ",s[cnt].w); for(j=0;j<x;j++) { acr[j]=min(acr[j],y); } for(j=x+1;j<n;j++) { acl[j]=max(acl[j],y); } } x=s[cnt].x; y=s[cnt].y; while(y<acl[x]||y>acr[x]) { cnt++; x=s[cnt].x; y=s[cnt].y; } printf("%d",s[cnt].w); return 0; }