ZOJ - 3265: Strange Game (优化 二分图匹配)

Posted hua-dong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZOJ - 3265: Strange Game (优化 二分图匹配)相关的知识,希望对你有一定的参考价值。

pro:有一个长度为N的数组a[i],要求选择k[i]>0,使得b[i]=a[i]^k[i]%M中出现的不同数最多。N<=200, M<=1e9;

sol:a^x%p的个数的有限的,但是全部求出来再二分匹配显然是不可取的。 但是考虑到二分匹配的特殊性,对于每个a[],最多求min(N,全部)个即可满足条件。

min(N),是因为其他N-1个数最多匹配N-1个,所以无论其他N-1个怎么匹配,对于当前数总能找到未匹配的去配对。

由于M的范围较大,对于每个a[],我们得到N个数b[],排序去重,离散。 然后跑匈牙利。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=201;
int Laxt[maxn],Next[100010],To[100010];
int link[maxn*maxn],cnt,vis[maxn*maxn];
int a[maxn*maxn],tot,T;
vector<int>G[210];
void add(int u,int v)
    Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v;

bool dfs(int u)

    for(int i=Laxt[u];i;i=Next[i])
        if(vis[To[i]]==T) continue;
        vis[To[i]]=T;
        if(!link[To[i]]||dfs(link[To[i]]))
            link[To[i]]=u;
            return true;
        
    
    return false;

int main()

    int N,M,x;
    while(~scanf("%d%d",&N,&M))
        rep(i,1,N) G[i].clear();
        rep(i,1,N)
           scanf("%d",&x);
           int t=x%M,c=N;
           while(c--)
               G[i].push_back(t);
               t=1LL*t*x%M;
           
           sort(G[i].begin(),G[i].end());
           int tot=unique(G[i].begin(),G[i].end())-G[i].begin();
           G[i].resize(tot);
        
        tot=0;
        rep(i,1,N)
          for(int j=0;j<G[i].size();j++) a[++tot]=G[i][j];
        sort(a+1,a+tot+1);
        tot=unique(a+1,a+tot+1)-(a+1);
        rep(i,1,N) Laxt[i]=0; cnt=0;
        rep(i,1,tot) link[i]=0;
        rep(i,1,N) 
            for(int j=0;j<G[i].size();j++)
                int t=G[i][j];
                int pos=lower_bound(a+1,a+tot+1,t)-a;
                add(i,pos);
            
        
        int ans=0;
        rep(i,1,N)
            T++;
            if(dfs(i)) ans++;
        
        printf("%d\n",ans);
    
    return 0;

 

以上是关于ZOJ - 3265: Strange Game (优化 二分图匹配)的主要内容,如果未能解决你的问题,请参考以下文章

CF 873C Strange Game On Matrix(贪心)

ZOJ 2750 Idiomatic Phrases Game

ZOJ3316Game(带花树)

ZOJ3180 Number Game

[ZOJ3316]:Game

ZOJ3791 An Easy Game(DP)