首页 > 代码库 > HDU5943 Kingdom of Obsession(思路题+二分匹配)
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\n",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\n"); 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\n"); else printf("No\n"); } return 0; }
HDU5943 Kingdom of Obsession(思路题+二分匹配)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。