zoukankan      html  css  js  c++  java
  • ZOJ

    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
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    luoguP2657 [SCOI2009] windy 数 数位dp
    LOJ#3280. 「JOISC 2020 Day4」首都城市 点分治+BFS
    luoguP2168 [NOI2015]荷马史诗 哈夫曼树
    转载-如何在博客园随笔中增加章节导航
    转载-MySQL之终端(Terminal)管理数据库、数据表、数据的基本操作
    转载-MySQL之终端(Terminal)管理MySQL
    数据库缓存
    独立图片服务器的部署(了解)
    CDN加速
    MySQL update替换字段部分内容
  • 原文地址:https://www.cnblogs.com/hua-dong/p/11002086.html
Copyright © 2011-2022 走看看