topcoder srm 640 div1
problem1 link
首先使用两个端点颜色不同的边进行连通。答案是$n-1-m$。其中$m$是联通分量的个数。
problem2 link
首先构造一个最小割的模型。左边的$n_{1}$个点与源点相连,右边的$n_{2}$个点与汇点相连。每个中间点最少有$d+1$条边(有一条到汇点/源点的边)。最小割为$ans$.
假设有$x$个割边出现在源点和$n_{1}$之间,那么$y=ans-x$个出现在$n_{2}$和汇点之间。其中$x,y$应该满足的关系为$0\leq y=ans-x \leq n_{2},0\leq x \leq n_{1},and\leq min(n_{1},n_{2})\rightarrow 0\leq x \leq ans$
左边剩下的$n_{1}-x$个点与右边剩下的$n_{2}-y$个点之间不能有边存在,否则最小割会变大。所以总的边的数量为$f(x)=n_{1}n_{2}-(n_{1}-x)(n_{2}-y)=n_{1}n_{2}-(n_{1}-x)(n_{2}-(ans-x))$
$f(x)$的最大值在$x=\frac{n_{1}-n_{2}+ans}{2}$时取得。
$0 \leq x=\frac{n_{1}-n_{2}+ans}{2} \leq ans\rightarrow -ans\leq n_{1}-n_{2}\leq ans$。当$n_{1}-n_{2}$不在这个范围时,枚举边界即可。
problem3 link
如果两个数字$x,y$的差$x-y$能被数$p$整除,那么有$x\equiv y(mod(p))$。
所以可以对每个素数计算有那些数对$(A_{i},B_{j})$的余数相等,他们的差值就含有素数$p$。最后就剩下那些素数特别大的。
这个题目应该有几组特别刁钻的测试数据,代码一直超时。
code for problem1
#include <vector>
class ChristmasTreeDecoration {
public:
int solve(const std::vector<int> &col, const std::vector<int> &x,
const std::vector<int> &y) {
int n = static_cast<int>(col.size());
int m = static_cast<int>(x.size());
father_.resize(n);
for (int i = 0; i < n; ++i) {
father_[i] = i;
}
int number = 0;
for (int i = 0; i < m; ++i) {
int u = x[i] - 1;
int v = y[i] - 1;
if (col[u] != col[v]) {
int pu = GetRoot(u);
int pv = GetRoot(v);
if (pu != pv) {
father_[pu] = pv;
++number;
}
}
}
return n - 1 - number;
}
private:
int GetRoot(int x) {
if (father_[x] == x) {
return x;
}
return father_[x] = GetRoot(father_[x]);
}
std::vector<int> father_;
};
code for problem2
#include <algorithm>
class MaximumBipartiteMatchingProblem {
public:
long long solve(int n1, int n2, int ans, int d) {
long long result = -1;
auto Update = [&](int x) {
if (x < d || ans - x < d) {
return;
}
result = std::max(result, 1ll * n2 * x + 1ll * (n1 - x) * (ans - x));
};
if (n1 > n2) {
std::swap(n1, n2);
}
if (n1 == ans) {
return 1ll * n1 * n2;
}
Update(0);
Update(d);
Update(ans - d);
Update(n1);
Update(n2);
Update((ans + n1 - n2) / 2);
Update((ans + n1 - n2) / 2 + 1);
return result;
}
};
code for problem3
#include <algorithm>
#include <vector> constexpr int kMax = 1000;
constexpr int kMaxPrime = 31622; int diff[kMax][kMax];
int values[kMax][kMax]; int nxt[kMax];
int head[kMaxPrime];
int tag[kMaxPrime]; int prime_tag[kMaxPrime]; class TwoNumberGroups {
static constexpr int kMod = 1000000007; public:
int solve(const std::vector<int> &A, const std::vector<int> &numA,
const std::vector<int> &B, const std::vector<int> &numB) {
int n = static_cast<int>(A.size());
int m = static_cast<int>(B.size());
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
diff[i][j] = std::abs(A[i] - B[j]);
}
}
int result = 0;
for (int p = 2; p < kMaxPrime; ++p) {
if (prime_tag[p] != 1) {
for (int x = p + p; x < kMaxPrime; x += p) {
prime_tag[x] = 1;
}
for (int i = 0; i < n; ++i) {
int t = A[i] % p;
if (tag[t] != p) {
head[t] = -1;
tag[t] = p;
}
nxt[i] = head[t];
head[t] = i;
}
for (int i = 0; i < m; ++i) {
int t = B[i] % p;
if (tag[t] == p) {
for (int j = head[t]; j != -1; j = nxt[j]) {
if (A[j] != B[i]) {
values[j][i] += p;
while (diff[j][i] % p == 0) {
diff[j][i] /= p;
}
}
}
}
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (diff[i][j] > 1) {
values[i][j] += diff[i][j];
}
result += 1ll * numA[i] * numB[j] % kMod * values[i][j] % kMod;
if (result >= kMod) {
result -= kMod;
}
}
}
return result;
}
};
topcoder srm 640 div1的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
- topcoder srm 575 div1
problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...
随机推荐
- [05-01]Linux如何重启系统
/* 私人笔记 */ 1.在linux相关路径下J2EE上传代码,指令:svn update : 2. 若项目名在linux中的目录为Scorpius ,跟新代码目录地址为 cd /home/xagd ...
- 学习ActiveMQ(五):activemq的五种消息类型和三种监听器类型
一.前面我们一直发送的是字符串类型,其实activemq一共支持五种消息类型: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者:消费者: 1.String消息类型:发送者 ...
- linux 环境变量函数getenv()和putenv()的使用
环境变量相关函数: getenv()和putenv() 代码示例[Linux程序设计(4th)_4.2小节配套代码]: 程序功能:编写一个程序来打印所选的任意环境变量的值:如果给程序传递第二个参数,还 ...
- React之ref
作为响应式开发框架React,我们知道他是数据驱动的,但有时候避免不了还是得动用到DOM操作,这个时候我们就可以用到ref:用法如下: 然后这样做有个弊端,当一个 ul 下面的 li 是动态添加的时候 ...
- Python3学习之路~8.4 利用socket实现文件传送+MD5校验
利用socket实现文件传送,大约分为如下几步: 1.读取文件名2.检测文件是否存在3.打开文件(别忘了最后关闭文件)4.检测文件大小5.发送文件大小给客户端6.等客户端确认7.开始边读边发数据8.m ...
- AWS的EC2实例搭建服务器使用stackoverflow教程
作为一个技术开发工程师, 一个给力的问题解决方案搜索引擎是十分必要的, stackoverflow作为一个码农必备神器, 存在访问不稳定,有时候打不开的问题,下面介绍如何在亚马逊云服务器上搭建属于自己 ...
- Opencv-Python No module named 'cv2.cv2'
关于 No module named 'cv2.cv2'等其他一些问题,一般都是版本不兼容的问题,重装即可. pip uninstall opencv-python 然后 pip install op ...
- nginx隐藏tp路由index.php
---------------------------------------------- 也可以找到vhosts.conf文件修改, 重启nginx,service nginx restart
- VisualVM监控远程服务器JVM
VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用.JVM堆内存消耗.线程.类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很 ...
- Python基础之数组和向量化计算总结
一.多维数组 1.生成ndarray (array函数) .np.array()生成多维数组 例如:import numpy as npdata1=[6,7.5,8,0,1] #创建简 ...