CF 704 D. Captain America】的更多相关文章

CF 704 D. Captain America 题目链接 题目大意:给出\(n\)个点的坐标,你要将每个点染成红色或者蓝色.染一个红色要付出\(r\)的代价,染一个蓝色要付出\(b\)的代价.有\(m\)个限制,每个限制为"第\(i\)行(或者第\(i\)列)两种颜色的球数量差不能超过\(d\)". 对于第\(i\)行,有\(x\)个点,数量差不能超过\(d\),假设最终红球的数量为\(R\),则: \[ R-(x-R)\leq d\\ (x-R)-R\leq d\\ \] 得到:…
CF上的题,就不放链接了,打开太慢,直接上题面吧: 平面上有n个点, 第 i 个点的坐标为 ($X_i ,Y_i$), 你需要把每个点染成红色或者蓝色, 染成红色的花费为 r , 染成蓝色的花费为 b .有m个限制条件, 有两种类型, 第一种类型为$x = l_i$ 上的红点与蓝点个数差的绝对值不超过 $d_i$, 第二种类型为$y= l_i$ 上的红点与蓝点个数差的绝对值不超过 $d_i$. 题解: 表示这题真的写到失去理想,因为是第一次写带上下限的网络最大流,一开始就把建图和统计代价理解错了…
[CF704D]Captain America(上下界网络流) 题面 CF 洛谷 题解 如果没有限制,似乎就不用做了...因为我们只需要贪心的选择代价较小的颜色就行了. 那么我们不妨假设染红色的代价较小,即\(r\le b\). 接下来把限制加进来,每个限制一定是限制了在某一行中染蓝色以及染红色的的个数在一个范围内. 我们贪心的考虑,那么一定就是假设让所有点都被染蓝,然后现在让最多的点被染红就行了. 然后把所有点放在中间,每一个行连向点,每一个点连向列,源点连向行,汇点连向列. 然后上下界网络流…
http://codeforces.com/problemset/problem/704/D 题解 对于两种颜色的染色,我们可以把它看做选择问题. 比如说红色的代价小,所以我们尽可能多的染红色. 然后我们发现有限制的同一行或者同一列内染红色的数量是一段区间. 然后网格上的问题转化为横纵坐标匹配问题. 然后就是一个有上下界的网络流,貌似要判定有无解的话只能最大流? 离散化不要离散限制,还有要特判\(l>r\)的情况. 调了一年.. 代码 #include<bits/stdc++.h> #d…
题意:平面上有n个点,每个点必须涂成红色和蓝色中的一种,花费各为r和b(对所有的点花费都一样).m条限制,每条限制形如"y=b这条直线上两种颜色的点的数目之差的绝对值不能超过c"或" x=b这条直线上两种颜色的点的数目之差的绝对值不能超过c",点数和限制数10^5,坐标范围10^9. 首先看到坐标范围很大先离散化,然后变成100000*100000的网格图每行每列的限制.那么转化成二分图,原先的每个点转换成边.因为每一行每一列的总点数是已知的,"两种颜色的…
分别给行和列hash建两排点,对(x,y)坐标连x行y列的点 设红色价格低,那么就要尽量多选红色 设一个点出度为s,要求最小的最大差值为d,又,假设有流量表示选红没流量表示选蓝,那么要求就变成了这个点的01边差至少为d,列一下式子就是这个点的流入(或者流出)流量可行区间为[(s-d)/2,(s+d)/2] 这样建出图然后跑上下界最大流即可 输出方案就看点对应的边是不是满流 注意有一个不可行情况是最大差为0,并且s为奇数,这个是不可行的但是建图的时候可能会恰好可行所以要提前特判掉 #include…
传送门 题意: 二维平面给出\(n\)个点,现在可以给每个点进行染色,染红色的代价为\(r\),染蓝色的代价为\(b\). 之后会有\(m\)个限制,形式如:\(t_i\ l_i\ d_i\),当\(t_i=1\)时,表示\(l_i\)行两种颜色的点数相差不超过\(d_i\):类似地,当\(t_i=2\)时表示的是列时的状态. 问最终怎么染色代价最小且符合限制条件. 思路: 带上下界的网络流. 我们不妨设\(r<b\),那么肯定是红点越多越好.我们找准最大这个数量关系,然后考虑最大流. 建图方式…
传送门 现在相当于说每一个条件都有一个染成红色的盾牌的数量限制\([l,r]\),需要满足所有限制且染成红色的盾牌数量最小/最大. 注意到一个盾牌染成红色对于一行和一列都会产生影响.如果选中一个物品对两个物品有影响,那么不妨按照二分图的方式建图,就可以描述这种限制. 将横纵坐标离散化,对每一个横坐标和每一个纵坐标建一个点.对于所有的\(t=1\)的限制从\(S\)向对应横坐标连限制最紧的边,\(t=2\)的限制连向\(T\),中间对于每一种盾牌从其对应横坐标向纵坐标连边. 然后就是上下界那一套了…
Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. ​ 考虑括号序列维护树的路径信息和,是将左括号看做 \(-1\) ,右括号看做 \(1\) ,那么一段竖直向上的路径可以表示为括号序列的一个区间和,一段竖直向下的路径可以看做括号序列的一个区间和的相反数.我们要维护的是树的直径,也就是一段连续的和减去紧随其后的一段连续的差.具体来说就是 \[ \max_{\forall [l,r]}\{\sum_{…
Series的简单运算 import numpy as np import pandas as pd s1=pd.Series([1,2,3],index=['A','B','C']) print(s1) 结果: A 1 B 2 C 3 dtype: int64 s2=pd.Series([4,5,6,7],index=['B','C','D','E']) print(s2) 结果: B 4 C 5 D 6 E 7 dtype: int64 print(s1+s2)#对应的index相加,NaN…