hdu 5943 二分图匹配
来源:互联网 发布:淘宝账号如何绑定手机 编辑:程序博客网 时间:2024/06/06 19:27
题意:给出S + 1 ~ S + N这些数,然后放到1 ~ n的位置中去,x能放到y这个位置的条件是x % y == 0.
思路:
素数出现两次就不能匹配,但是没想到素数间隔(潜意识认为20亿以内的素数肯定间隔很大).
20亿内两个素数之间最大间隔不会超过300,所以超过600直接输出No.所以解法就是小数据二分图匹配,大数据直接输出No.防止区间相交,要特判一下n,s的大小.
PS :比赛的时候想猜两个素数最大的间隔为1000,交了好几次都WA了;
结束后搜了一下题解,没想到要特判一下n和s的大小,因为s < n的时候,两个区间相交,就不能枚举1 ~ n里面的数是否是S + 1 ~ s + n 的因子了;所以当n > s的时候,两个区间相交的部分就相当宇匹配了,直接匹配不相交的就行了,swap(n,s);
#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int> P;#define clr(x,y) memset(x,y,sizeof x)#define INF 0x3f3f3f3fconst int maxn = 100000 + 10;vector<int>g[maxn];ll n,s;void Init(int t){ for(int i = 1; i <= n; i ++) { if(t % i == 0) { g[i].push_back(t - s + n); g[t - s + n].push_back(i); } }}bool vis[maxn];int match[maxn];bool dfs(int u){ vis[u] = true; for(int i = 0; i < g[u].size(); i ++) { int v = g[u][i],w = match[v]; if(w < 0 || !vis[w] && dfs(w)) { match[u] = v;match[v] = u; return true; } } return false;}int solve(){// cout << "Pass_by" << endl; int ret = 0; clr(match,-1); for(int i = 1; i <= n; i ++) { if(match[i] < 0) { clr(vis,false); if(dfs(i)) ret ++; } } return ret;}int main(){ int Tcase; scanf("%d",&Tcase); for(int ii = 1;ii <= Tcase; ii ++) { scanf("%I64d%I64d",&n,&s); if(n > s) swap(n,s); printf("Case #%d: ",ii); if(n >= 1000) { puts("No"); continue; } for(int i = 1; i <= n * 2 + 10; i ++) g[i].clear(); for(int i = s + 1; i <= s + n; i ++) { Init(i); } int ans = solve();// cout << ans << endl; if(ans == n) puts("Yes"); else puts("No"); } return 0;}
阅读全文
0 0
- hdu 5943 二分图匹配
- hdu 5943 二分图匹配
- hdu 5943 二分图匹配
- hdu 5943 素数分布+二分图匹配
- 二分图匹配——HDU 5943
- HDU-2063 二分图匹配
- HDU-2444 二分图匹配
- HDU-3729 二分图匹配
- hdu 2063 二分图匹配
- HDU 1083 二分匹配图
- 二分图匹配 hdu 1045
- 二分图匹配 hdu 2063
- 二分图匹配 hdu 1150
- hdu 2819 二分图匹配
- HDU 4185(二分图匹配)
- HDU 5727 (二分图匹配)
- HDU 5352 (二分图匹配)
- HDU 1045 二分图匹配
- python之路——文件操作
- zhihu-spider之RabbitMQ——zhihu-spider开源项目使用技术详解(其五)
- _CRT_SECURE_NO_DEPRECATE
- Android 混淆那些事儿
- python实现猴子排序(Monkey_sort)闲聊睡眠排序
- hdu 5943 二分图匹配
- find the most comfortable road HDU
- 文件版通讯录的c语言实现
- POJ 1014 Dividing(多重背包转换成01背包)
- 读写文件的操作
- C++实现创建winform
- 回滚莫队?滚滚滚滚起来!
- #define 宏的用法备注
- java快速排序的递归版