CF498C. Array and Operations

题意:

给定一个长为 n 的数组,以及 m 对下标 (a, b) 且满足 a + b 为奇数,每次操作可以将同一组的两个数同时除以一个公约数

问最多能进行多少次操作

\[1≤n,m ≤100,1≤ai ≤10^9
\]


根据奇偶性二分图定理此题必定考二分图

贪心,每次除一个质数

质数之间是独立的,可以分开考虑每一个质因子

建图:s -x中质因子p数量-> x -inf-> y -y中质因子p数量-> t

最大权匹配就是这个质因子能带来的最多操作数

注意质因子分解别写错了,最后判x>1

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <set>
#include <map> #define fir first
#define sec second
using namespace std;
const int N = 105, inf = 1e9; int n, m, a[N];
pair<int, int> b[N];
map<int, int> li[N];
set<int> s; void fac(int p) {
int x = a[p], sx = sqrt(x) + 1; //printf("fac %d\n", a[p]);
for(int i=2; i<=sx; i++) if(x % i == 0) { //printf("iii %d\n", i);
int cnt = 0;
while(x%i == 0) cnt++, x/=i; //printf("x %d\n", x);
//li[p].push_back(make_pair(i, cnt));
li[p][i] = cnt;
s.insert(i);
}
if(x > 1) li[p][x] = 1, s.insert(x);
} namespace mf {
int s, t;
struct edge {int v, ne, c, f;} e[1005];
int cnt=1, h[N];
void ins(int u, int v, int c) { //printf("ins %d %d %d\n", u, v, c);
e[++cnt] = (edge) {v, h[u], c, 0}; h[u] = cnt;
e[++cnt] = (edge) {u, h[v], 0, 0}; h[v] = cnt;
}
int cur[N], vis[N], d[N], head, tail, q[N];
bool bfs() {
memset(vis, 0, sizeof(vis));
head = tail = 1;
q[tail++] = s; d[s] = 0; vis[s] = 1;
while(head != tail) {
int u = q[head++];
for(int i=h[u]; i; i=e[i].ne) {
int v = e[i].v;
if(!vis[v] && e[i].c > e[i].f) {
vis[v] = 1;
d[v] = d[u] + 1;
q[tail++] = v;
if(v == t) return true;
}
}
}
return false;
}
int dfs(int u, int a) {
if(u==t || a==0) return a;
int flow = 0, f;
for(int &i=cur[u]; i; i=e[i].ne) {
int v = e[i].v;
if(d[v] == d[u]+1 && (f = dfs(v, min(a, e[i].c-e[i].f))) > 0) {
flow += f;
e[i].f += f;
e[i^1].f -= f;
a -= f;
if(a==0) break;
}
}
if(a) d[u] = -1;
return flow;
} void build(int p) {
cnt = 1;
memset(h, 0, sizeof(h));
s=0; t=n+1;
for(int i=1; i<=m; i++) ins(b[i].fir, b[i].sec, inf);
for(int i=1; i<=n; i++) if(li[i].count(p)) {
if(i & 1) ins(s, i, li[i][p]);
else ins(i, t, li[i][p]);
}
} int solve(int p) { //printf("\nsolve %d\n", p);
build(p);
int flow = 0;
while(bfs()) {
for(int i=s; i<=t; i++) cur[i] = h[i];
flow += dfs(s, inf);
}
return flow;
} }
int main() {
//freopen("in", "r", stdin);
ios::sync_with_stdio(false); cin.tie(); cout.tie(); cin >> n >> m;
for(int i=1; i<=n; i++) cin >> a[i];
for(int i=1; i<=m; i++) {
cin >> b[i].fir >> b[i].sec;
if(b[i].sec & 1) swap(b[i].fir, b[i].sec);
} for(int i=1; i<=n; i++) fac(i);
int ans = 0; for(set<int>::iterator it = s.begin(); it != s.end(); it++) ans += mf::solve(*it);
cout << ans;
}

CF498C. Array and Operations [二分图]的更多相关文章

  1. cf498C Array and Operations

    C. Array and Operations time limit per test 1 second memory limit per test 256 megabytes input stand ...

  2. Codeforces Round #284 (Div. 1) C. Array and Operations 二分图最大匹配

    题目链接: http://codeforces.com/problemset/problem/498/C C. Array and Operations time limit per test1 se ...

  3. Codeforces Round #284 (Div. 1) C. Array and Operations 二分图匹配

    因为只有奇偶之间有操作, 可以看出是二分图, 然后拆质因子, 二分图最大匹配求答案就好啦. #include<bits/stdc++.h> #define LL long long #de ...

  4. Array and Operations

    A. Array and Operations Time Limit: 1000ms Memory Limit: 262144KB 64-bit integer IO format: %I64d    ...

  5. 网络流(最大流):CodeForces 499E Array and Operations

    You have written on a piece of paper an array of n positive integers a[1], a[2], ..., a[n] and m goo ...

  6. Codeforces 498C Array and Operations(最大流)

    题目是给一些数和<数对>的下标,然后进行操作:对某个<数对>中的两个数同时除以一个都能被它们整除且不等于1的数,要求的就是最多能进行多少次操作. 除数一定是素数,就是要决定某素 ...

  7. codeforcese 498C. Array and Operations 网络流

    题目链接 给n个数, m个数对, 每个数对是两个下标加起来为奇数的两个数.每次操作可以使一个数对中的两个数同时除某个数, 除的这个数是这两个数的任意约数, 问这种操作最多可以做几次.n<100, ...

  8. ZOJ 3427 Array Slicing (scanf使用)

    题意  Watashi发明了一种蛋疼(eggache) 语言  你要为这个语言实现一个 array slicing 函数  这个函数的功能是 有一个数组初始为空  每次给你一个区间[ l, r)  和 ...

  9. Codeforces Round #284 (Div. 1)

    A. Crazy Town 这一题只需要考虑是否经过所给的线,如果起点和终点都在其中一条线的一侧,那么很明显从起点走点终点是不需要穿过这条线的,否则则一定要经过这条线,并且步数+1.用叉积判断即可. ...

随机推荐

  1. 《Java》第六周学习总结

    本周我学习了第七章和第十章的内容 包括:内部类,匿名类,异常类,断言的使用 File类,文件字节输入输出流,缓冲流,数据流,对象流,scanner的使用扩展还有文件锁等内容令我印象深刻 问题: 在编译 ...

  2. SimMechanics/Second Generation倒立摆模型建立及初步仿真学习

    笔者最近捣鼓Simulink,发现MATLAB的仿真模块真的十分强大,以前只是在命令窗口敲点代码,直到不小心敲入simulink,就一发不可收拾.话说simulink的模块化建模确实方便,只要拖拽框框 ...

  3. 更改MySQL密码

    #安装MySQL5.7参考:https://blog.csdn.net/qq_23033339/article/details/80872136#MYSQL的基础操作参考:https://www.cn ...

  4. nginx反向代理配置两个不同服务器

    1.什么是反向代理通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Inter ...

  5. Web项目容器集成ActiveMQ & SpringBoot整合ActiveMQ

    集成tomcat就是随项目启动而启动tomcat,最简单的方法就是监听器监听容器创建之后以Broker的方式启动ActiveMQ. 1.web项目中Broker启动的方式进行集成 在这里采用Liste ...

  6. #20175204 张湲祯 2018-2019-2《Java程序设计》第六周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第六周学习总结 教材学习内容总结 -第七章内部类与异常类要点: 一.内部类: Java支持在一个类中定义另一个类,这样的 ...

  7. [Kubernetes]PV,PVC,StorageClass之间的关系详解

    在Kubernetes中,容器化一个应用比较麻烦的地方莫过于对其"状态"的管理,而最常见的"状态",莫过于存储状态. 在[Kubernetes]深入理解Stat ...

  8. delphi

    其实现在哪里还有delphi,我之所以建立这个分类,只是为了纪念它,纪念我使用了一年delphi的经历. 那个年代c#刚出道,delphi还是c/s编程届数一数二的人物.但是没想到,这么快被c#打败了 ...

  9. USACO Training Section 1.1 题解(共4题)

    第一题 题目传送门:你的飞碟在这儿 分析 水题一道,输入两个字符串,将它们转换为数字并同时相乘,然后判断一下它们是不是对于47同余就可以了. 代码 #include<bits/stdc++.h& ...

  10. django学习笔记-模板层

    模板层 将Python嵌入到HTML中. 模板简介 将HTML硬解码到视图并不是那么完美原因如下: 对页面设计时也需要对python代码进行相应的修改,模板可以不就行python代码修改的情况下变更设 ...