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

这道题太 tm 卡内存了.   

不知道这样做意义何在,是在考察选手卡常能力吗 ? 

思路没啥说的,整个棋盘的形态我们是知道的. 

那么显然从小到大把数往棋盘里填,然后我们每次不可以选的是一个左下角和右上角区域,暴力覆盖就行.  

覆盖的时候要判一下什么时候 break,来保证每个地方只被覆盖依次.   

code: 

#include <bits/stdc++.h>  
#define N 5005 
#define M 50007       
#define ll long long 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;  
int mod,n,m,Q;          
int val[N*N],pos[N*N];   
bool mark[N][N];               
int main() 
{ 
    // setIO("input");                  
    int A,B,C,t=0; 
    scanf("%d%d%d%d%d%d%d%d",&pos[0],&A,&B,&C,&mod,&n,&m,&Q);    
    for(int i=1;i<=n*m;++i)  
        pos[i]=(ll)(1ll*A*pos[i-1]%mod*pos[i-1]%mod+1ll*B*pos[i-1]%mod+C)%mod;
    for(int i=1;i<=n*m;++i) val[i]=i;   
    for(int i=1;i<=n*m;++i) swap(val[i],val[(pos[i]%i)+1]);   
    for(int i=1;i<=Q;++i) 
    {
        int u,v; 
        scanf("%d%d",&u,&v),swap(val[u],val[v]);   
    }                       
    for(int i=1;i<=n*m;++i)  pos[val[i]]=i;    
    for(int i=1;i<=n*m;++i) 
    {   
        int x=(pos[i]-1)/m+1,y=(pos[i]-1)%m+1;   
        if(mark[x][y])  continue;   
        printf("%d ",i);         
        for(int a=x+1;a<=n;++a) 
        {   
            if(a>n||y-1<1)  break; 
            if(mark[a][y-1])  
                break;    
            for(int b=y-1;b>=1;--b) 
            {         
                if(mark[a][b]) break;   
                mark[a][b]=1; 
                // vis[aa[a][b]]=1;       
            }     
        }        
        for(int a=x-1;a>=1;--a) 
        { 
            if(a<1||y+1>m)  break;      
            if(mark[a][y+1]) break; 
            for(int b=y+1;b<=m;++b) 
            {      
                if(mark[a][b]) break;   
                mark[a][b]=1; 
                // vis[aa[a][b]]=1;   
            }
        }
    }
    // for(int i=1;i<=n*m;++i) if(an[i]) printf("%d ",i);   
    return 0;  
}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值