• HDU5943 Kingdom of Obsession(思路题+二分匹配)


    题意:

    给你两个数n,s(1e9),问你能否使得s+1--s+n和1--n全部匹配

    每个数只能匹配他的因子

    思路:

    要匹配的这一段数中非重合部分最多有1个素数,也就是说n和s不能同时很大

    我打了1e9的素数间隔表,发现最大间距才280多。。

    然后索性直接当n和s都大于500的时候就输出no就可以了

    符合条件的数非重合部分最多500个,二分匹配一下

    /* ***********************************************
    Author        :devil
    ************************************************ */
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <stack>
    #include <map>
    #include <string>
    #include <time.h>
    #include <cmath>
    #include <stdlib.h>
    #define LL long long
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    #define dep(i,a,b) for(int i=a;i>=b;i--)
    #define ou(a) printf("%d
    ",a)
    #define pb push_back
    #define mkp make_pair
    template<class T>inline void rd(T &x)
    {
        char c=getchar();
        x=0;
        while(!isdigit(c))c=getchar();
        while(isdigit(c))
        {
            x=x*10+c-'0';
            c=getchar();
        }
    }
    #define IN freopen("in.txt","r",stdin);
    #define OUT freopen("out.txt","w",stdout);
    using namespace std;
    const int inf=0x3f3f3f3f;
    const int mod=1e9+7;
    const int N=5e4+10;
    LL n,s;
    vector<int>eg[N];
    int linker[N];
    bool vis[N];
    bool dfs(int u)
    {
        for(int i=0; i<eg[u].size(); i++)
        {
            int to=eg[u][i];
            if(!vis[to])
            {
                vis[to]=1;
                if(linker[to]==-1||dfs(linker[to]))
                {
                    linker[to]=u;
                    return 1;
                }
            }
        }
        return 0;
    }
    void add(int u)
    {
        int tmp=s/u+1;
        for(LL i=tmp*u; i<=n+s; i+=u) eg[i-s].pb(u);
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
    //IN
    #endif
        int t,cas=0;
        scanf("%d",&t);
        while(t--)
        {
            printf("Case #%d: ",++cas);
            scanf("%lld%lld",&n,&s);
            if(n>500&&s>500)
            {
                printf("No
    ");
                continue;
            }
            if(n>s) swap(n,s);
            for(int i=1; i<=n; i++) eg[i].clear();
            for(int i=1; i<=n; i++) add(i);
            int ans=0;
            memset(linker,-1,sizeof(linker));
            for(int i=1; i<=n; i++)
            {
                memset(vis,0,sizeof(vis));
                ans+=dfs(i);
            }
            if(ans==n) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
  • 相关阅读:
    微信第三方登录,ios第三方登录(没有进行二次封装,直接调用)
    How Do I Declare A Block in Objective-C?
    Android与JS混编(js调用java)
    React-Native做一个文本输入框组件
    如何在程序退出的时候清除activity栈
    React react-ui-tree的使用
    React-Native OpenGL体验二
    React-Native OpenGL体验一
    react-native使用react-art制作SVG动画
    Android画一个随意拖动的圆形
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/6012853.html
Copyright © 2020-2023  润新知