problem1 link

对于每一个,找到其在目标串中的位置,判断能不能移动即可。

problem2 link

如果最后的$limit$为$11=(1011)_{2}$,那么可以分别计算值为$(1011)_{2},(1010)_{2},(100x)_{2},(0xxx)_{2}$的答案数,$x$位置表示可以为任意。也就是可以忽略这些位。

当答案固定时,可以用高斯消元求解。

problem3 link

令$d(i,j)$表示点 $i$到点$j$的距离。

使用最小割求解。将每个点拆成$n$个点,第$i$个点拆成$p(i,0),p(i,1),...,p(i,n-1)$.其中$p(i,j)$如果与源点在一个割集,说明$d(0,i)\leq j$为假,与汇点在一个割集说明$d(0,i)\leq j$为真。

所以,如果一个割产生在边$p(i,j-1)\rightarrow p(i,j)$说明最后$d(0,i)=j$.其中边$p(i,j-1)\rightarrow p(i,j)$的代价为$(want[i]-j)^{2}$

有以下边:

(1)对于0点来说,$p(0,0)$与汇点的边流量为无穷大,说明,最后它与汇点在一个割集,所以$d(0,0)\leq 0$为真;

(2)对于$1\leq i < n$号点来说,源点到$p(i,0)$为无穷大(一定不可能),$p(i, n-1)$到汇点为无穷大(一定为真); $p(i,j-1)\rightarrow p(i,j),1\leq j < n)$为$(want[i]-j)^{2}$

(3)如果原来存在边$i\rightarrow j$,那么$p(i,k)\rightarrow p(j,k-1)$为无穷大,表示如果$d(0,i)>k$,那么一定有$d(0,j)>k-1$

code for problem1

#include <string>

class FoxAndChess {
public:
std::string ableToMove(const std::string &begin, const std::string &target) {
int n = static_cast<int>(begin.size());
int idx = 0;
for (int i = 0; i < n; ++i) {
if (begin[i] == 'L' || begin[i] == 'R') {
while (idx < n && target[idx] == '.') {
++idx;
}
if (idx == n || begin[i] != target[idx] ||
(begin[i] == 'L' && i < idx) || (begin[i] == 'R' && i > idx)) {
return "Impossible";
}
++idx;
}
}
while (idx < n && target[idx] == '.') {
++idx;
}
if (idx != n) {
return "Impossible";
}
return "Possible";
}
};

code for problem2

#include <vector>

class XorCards {
public:
long long numberOfWays(const std::vector<long long> &number,
long long limit) {
const int n = 52;
const int m = static_cast<int>(number.size());
long long result = 0;
auto GetBit = [](long long t, int b) -> int {
return (t & (1ll << b)) != 0 ? 1 : 0;
};
{
std::vector<std::vector<int>> g(n, std::vector<int>(m + 1, 0));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
g[i][j] = GetBit(number[j], i);
}
g[i][m] = GetBit(limit, i);
}
result += Gauss(g);
}
for (int i = 0; i < n; ++i) {
if (GetBit(limit, i) == 0) {
continue;
}
std::vector<std::vector<int>> g(n, std::vector<int>(m + 1, 0));
for (int j = i; j < n; ++j) {
for (int k = 0; k < m; ++k) {
g[j][k] = GetBit(number[k], j);
}
if (j > i) {
g[j][m] = GetBit(limit, j);
}
}
result += Gauss(g);
}
return result;
} private:
long long Gauss(std::vector<std::vector<int>> &g) {
int n = static_cast<int>(g.size());
int m = static_cast<int>(g[0].size()) - 1;
int col = 0; auto HasBit = [&](int start, int col) {
for (int i = n - 1; i >= start; --i) {
if (g[i][col] != 0) return i;
}
return -1;
};
int row_number = 0;
for (int i = 0; i < n && col < m; ++i) {
int row = HasBit(i, col);
while (row == -1 && col + 1 < m) {
row = HasBit(i, ++col);
}
if (row == -1) {
break;
}
if (row != i) {
std::swap(g[i], g[row]);
}
for (int idx = 0; idx < n; ++idx) {
if (idx != i && g[idx][col] != 0) {
for (int k = 0; k <= m; ++k) {
g[idx][k] ^= g[i][k];
}
}
}
++col;
++row_number;
}
for (int i = row_number; i < n; ++i) {
if (g[i][m] != 0) {
return 0;
}
}
if (m < row_number) {
return 0;
}
return 1ll << (m - row_number);
}
};

code for problem3

#include <limits>
#include <unordered_map>
#include <vector> template <typename FlowType>
class MaxFlowSolver {
static constexpr FlowType kMaxFlow = std::numeric_limits<FlowType>::max();
static constexpr FlowType kZeroFlow = static_cast<FlowType>(0);
struct node {
int v;
int next;
FlowType cap;
}; public:
int VertexNumber() const { return used_index_; } FlowType MaxFlow(int source, int sink) {
source = GetIndex(source);
sink = GetIndex(sink); int n = VertexNumber();
std::vector<int> pre(n);
std::vector<int> cur(n);
std::vector<int> num(n);
std::vector<int> h(n);
for (int i = 0; i < n; ++i) {
cur[i] = head_[i];
num[i] = 0;
h[i] = 0;
}
int u = source;
FlowType result = 0;
while (h[u] < n) {
if (u == sink) {
FlowType min_cap = kMaxFlow;
int v = -1;
for (int i = source; i != sink; i = edges_[cur[i]].v) {
int k = cur[i];
if (edges_[k].cap < min_cap) {
min_cap = edges_[k].cap;
v = i;
}
}
result += min_cap;
u = v;
for (int i = source; i != sink; i = edges_[cur[i]].v) {
int k = cur[i];
edges_[k].cap -= min_cap;
edges_[k ^ 1].cap += min_cap;
}
}
int index = -1;
for (int i = cur[u]; i != -1; i = edges_[i].next) {
if (edges_[i].cap > 0 && h[u] == h[edges_[i].v] + 1) {
index = i;
break;
}
}
if (index != -1) {
cur[u] = index;
pre[edges_[index].v] = u;
u = edges_[index].v;
} else {
if (--num[h[u]] == 0) {
break;
}
int k = n;
cur[u] = head_[u];
for (int i = head_[u]; i != -1; i = edges_[i].next) {
if (edges_[i].cap > 0 && h[edges_[i].v] < k) {
k = h[edges_[i].v];
}
}
if (k + 1 < n) {
num[k + 1] += 1;
}
h[u] = k + 1;
if (u != source) {
u = pre[u];
}
}
}
return result;
} MaxFlowSolver() = default; void Clear() {
edges_.clear();
head_.clear();
vertex_indexer_.clear();
used_index_ = 0;
} void InsertEdge(int from, int to, FlowType cap) {
from = GetIndex(from);
to = GetIndex(to);
AddEdge(from, to, cap);
AddEdge(to, from, kZeroFlow);
} private:
int GetIndex(int idx) {
auto iter = vertex_indexer_.find(idx);
if (iter != vertex_indexer_.end()) {
return iter->second;
}
int map_idx = used_index_++;
head_.push_back(-1);
return vertex_indexer_[idx] = map_idx;
} void AddEdge(int from, int to, FlowType cap) {
node p;
p.v = to;
p.cap = cap;
p.next = head_[from];
head_[from] = static_cast<int>(edges_.size());
edges_.emplace_back(p);
} std::vector<node> edges_;
std::vector<int> head_; std::unordered_map<int, int> vertex_indexer_;
int used_index_ = 0;
}; #include <string> class FoxAndCity {
public:
int minimalCost(const std::vector<std::string> linked,
const std::vector<int> want) {
constexpr int kMaxCapacity = 1000000;
int n = static_cast<int>(linked.size());
MaxFlowSolver<int> solver;
auto Index = [&](int u, int k) { return u * n + k; };
int source = -1;
int sink = -2;
for (int i = 0; i < n; ++i) {
if (i == 0) {
solver.InsertEdge(Index(i, 0), sink, kMaxCapacity);
continue;
} solver.InsertEdge(source, Index(i, 0), kMaxCapacity);
solver.InsertEdge(Index(i, n - 1), sink, kMaxCapacity);
for (int j = 1; j < n; ++j) {
solver.InsertEdge(Index(i, j - 1), Index(i, j),
(want[i] - j) * (want[i] - j));
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (linked[i][j] == 'Y') {
for (int k = 1; k < n; ++k) {
solver.InsertEdge(Index(i, k), Index(j, k - 1), kMaxCapacity);
}
}
}
}
return solver.MaxFlow(source, sink);
}
};

topcoder srm 590 div1 (max_flow_template)的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

  4. SRM 590 DIV1

    转载请注明出处,谢谢viewmode=contents">http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlov ...

  5. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  6. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  7. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  8. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  9. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

随机推荐

  1. Solve Error: "errcode": 85005, "errmsg": "appid not bind weapp hint"

    在使用微信官方给的添加自定义菜单的示例代码: { "button":[ { "type":"click", "name" ...

  2. php项目,别人无法访问自己(windows 系统)上Apache服务器原因(转载)

    别人无法访问自己电脑上的Apache服务器,其中最大的原因是因为Windows防火墙的因素. 1.有安装防火墙的,把防火墙关闭 2.windows默认带防火墙的,进入 控制面板-系统和安全-Windo ...

  3. 微信小程序开发笔记01

    微信小程序开发的优势 1,不用安装,即开即用,用完就走.省流量,省安装时间,不占用桌面: 2,体验上虽然没法完全媲美原生APP,但综合考虑还是更优: 3,对于小程序拥有者来说,开发成本更低,他们可以更 ...

  4. Python学习之旅(十一)

    Python基础知识(10):函数(Ⅱ) 一.全局变量和局部变量 局部变量:在函数内定义的变量,在函数内使用 全局变量:在函数外定义的变量,在程序任何地方都可以使用 1.全局变量与局部变量同名 这时函 ...

  5. 解决 .net core 中 nuget 包版本冲突问题

    今天在一个 asp.net core 项目中遇到了 nuget 包版本冲突的问题,错误信息如下: Version conflict detected for Microsoft.AspNet.WebA ...

  6. RGBA与Opacity

    rgba(r,g,b,a) 都与透明度有关,rgba不会影响文字,opacity则会.

  7. Ubuntu 18.04 安装Docker

    第一种方法从Ubuntu的仓库直接下载安装: 安装比较简单,这种安装的Docker不是最新版本,不过对于学习够用了,依次执行下面命令进行安装. $ sudo apt install docker.io ...

  8. poi导入excel表格数据到数据库的时候,对出生日期的校验

    出生日期格式为8位数字的字符串 如:yyyyMMdd 规则:yyyy大于1900并小于当前时间,月.日 按日期规则校验 //解决读过来的字符串显示为科学计数法问题 BigDecimal bd = ne ...

  9. Ext 修改内容之后 不做任何动作 再次修改时的数据是原来第一次修改前的数据

    转自  http://blog.csdn.net/jaune161/article/details/18220257 在项目开发中遇到这样一个问题,点击Grid中的一条记录并修改,修改完后保存并且刷新 ...

  10. 线程 学习教程(一): Java中终止(销毁)线程的方法

    结束线程有以下三种方法:(1)设置退出标志,使线程正常退出,也就是当run()方法完成后线程终止 (2)使用interrupt()方法中断线程 (3)使用stop方法强行终止线程(不推荐使用,Thre ...