[atARC122F]Domination
如果一个红石头在另一个红石头的左下方(包括左和下),那么在后者的限制满足时,前者也一定满足,因此可以删去前者,再将其按照$rx_{i}$排序,即有$rx_{1}<rx_{2}<...<rx_{n}$且$ry_{1}>ry_{2}>...>ry_{n}$
称一个蓝石头覆盖一个红石头当且今当后者在前者的左下方(包括左和下),若一个蓝石头在$(x,y)$,要使其覆盖区间$[l,r]$的红石头,所需代价即$\max(rx_{r}-x,0)+\max(ry_{l}-y,0)$
下面,来考虑$k=1$的情况:
对于一个蓝石头,注意到覆盖$[l_{1},r_{1}]$和$[l_{2},r_{2}]$的代价不小于覆盖$[l_{1},r_{2}]$的代价(其中$l_{1}\le r_{1}<l_{2}\le r_{2}$),因此我们不妨允许其重复使用
由此,令$f_{i}$表示前$i$个红石头都被覆盖的最小代价,枚举上一段被覆盖的区间,即有转移
$$
f_{i}=\min_{1\le j\le i}(f_{j-1}+\min_{1\le l\le m}(\max(rx_{i}-bx_{l},0)+\max(ry_{j}-by_{l},0)))
$$
关于这个dp,可以建立下述有向图来解决——
将每一个石头拆为两个节点,分别称为$x$坐标的节点和$y$坐标的节点
将所有$x$坐标的节点按$x$坐标从小到大排序,每一个节点向下一个节点连边权为两者$x$坐标差值的边,向上一个节点连边权为0的边
将所有$y$坐标的节点按$y$坐标从大到小排序,并与$x$坐标类似的连边
将所有蓝石头$y$坐标的节点向$x$坐标的节点连边权为0的边
此时,第$j$个红石头$y$坐标的节点到第$i$个红石头$x$坐标的节点的最短路即为
$$
\min_{1\le l\le m}(\max(rx_{i}-bx_{l},0)+\max(ry_{j}-by_{l},0))
$$
(这里也允许红石头向红石头移动和蓝石头向蓝石头移动,但这类边实际上一定不优)
将第$i$个红石头$x$坐标的节点向第$i+1$个红石头$y$坐标的节点连边权为0的边,那么第1个红石头$y$坐标的节点到第$n$个红石头$x$坐标的节点的最短路即为答案
接下来,对于任意$k$的情况,实际上即在这张图中找到$k$条路径,且其中蓝石头$x$和$y$坐标的节点之间的连边只能被使用一次,最小化这$k$条路径的长度和
显然这可以用网络流解决,即在此图的基础上,每条边的流量为无穷大(但蓝石头$x$和$y$坐标的节点之间的连边流量为1)且费用为边权,最终求流量为$k$的最小费用即为答案
通过费用流的做法,即做$k$次增广,每一次增广是spfa,复杂度为$o(kn^{2})$,无法通过
给每一个节点一个势能$h_{i}$,再将一条边的费用由$w$变为$w+h_{x}-h_{y}$,那么对于一条从$x$到$y$的路径,实际上即在原费用的基础上再加$h_{x}-h_{y}$,这显然不影响$x$到$y$的最短路
换言之,我们只需要找到合适的$h_{i}$,使得(对于流量非0的边)$w+h_{x}-h_{y}$都非负,那么以$w+h_{x}-h_{y}$为费用求最短路,就可以使用dijkstra,复杂度即降为$o(kn\log n)$
初始由于没有负权(负权边都是反向边,流量为0),直接令$h_{i}=0$即可
接下来每一次求完最短路后增广,会导致一些边流量由0变为非0,因此要调整$h_{i}$
具体的,设最短路为$d_{i}$,只需要令$h'_{i}=h_{i}+d_{i}$即可,下面来证明$w+h'_{x}-h'_{y}\ge 0$:
若$(x,y)$在增广前流量非0,那么$d_{y}\le d_{x}+(w+h_{x}-h_{y})$,化简后即可得$w+h'_{x}-h'_{y}\ge 0$
若$(x,y)$在增广前流量为0且增广后流量非0,即$(y,x)$被作为最短路,也即$d_{y}=d_{x}+(-w+h_{x}-h_{y})$(根据费用流的建边,$(x,y)$和$(y,x)$的费用互为相反数),化简后即可得$w+h'_{x}-h'_{y}=0$
综上,总时间复杂度为$o(kn\log n)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 400005
4 #define ll long long
5 #define fi first
6 #define se second
7 struct Edge{
8 int nex,to,len,cost;
9 }edge[N*6];
10 pair<int,int>a[N];
11 vector<pair<int,int> >vx,vy;
12 priority_queue<pair<ll,int> >q;
13 int E,S,T,n,m,k,x,y,head[N],vis[N],from[N];
14 ll h[N],d[N];
15 void add(int x,int y,int z,int w){
16 edge[E].nex=head[x];
17 edge[E].to=y;
18 edge[E].len=z;
19 edge[E].cost=w;
20 head[x]=E++;
21 if (E&1)add(y,x,0,-w);
22 }
23 bool dijkstra(){
24 memset(d,0x3f,sizeof(d));
25 memset(vis,0,sizeof(vis));
26 d[S]=0;
27 q.push(make_pair(0,S));
28 while (!q.empty()){
29 int k=q.top().second;
30 q.pop();
31 if (vis[k])continue;
32 vis[k]=1;
33 for(int i=head[k];i!=-1;i=edge[i].nex){
34 ll c=edge[i].cost+h[k]-h[edge[i].to];
35 if ((edge[i].len)&&(d[edge[i].to]>d[k]+c)){
36 d[edge[i].to]=d[k]+c;
37 from[edge[i].to]=i;
38 q.push(make_pair(-d[edge[i].to],edge[i].to));
39 }
40 }
41 }
42 return d[T]!=d[0];
43 }
44 ll dinic(){
45 ll ans=0;
46 for(int i=1;i<=k;i++){
47 dijkstra();
48 ans+=d[T]-(h[S]-h[T]);
49 for(int i=T;i!=S;i=edge[from[i]^1].to){
50 edge[from[i]].len--;
51 edge[from[i]^1].len++;
52 }
53 for(int i=1;i<=2*(n+m);i++)h[i]+=d[i];
54 }
55 return ans;
56 }
57 int main(){
58 scanf("%d%d%d",&n,&m,&k);
59 memset(head,-1,sizeof(head));
60 for(int i=1;i<=n;i++){
61 scanf("%d%d",&x,&y);
62 a[i]=make_pair(x,y);
63 }
64 sort(a+1,a+n+1);
65 int mx=-1,nn=0;
66 for(int i=n;i;i--){
67 if (a[i].se<=mx)vis[i]=1;
68 else{
69 mx=a[i].se;
70 nn++;
71 }
72 }
73 for(int i=1,j=0;i<=n;i++)
74 if (!vis[i]){
75 j++;;
76 vx.push_back(make_pair(a[i].fi,j));
77 vy.push_back(make_pair(a[i].se,j+nn+m));
78 if (j<nn)add(j,j+1+nn+m,k,0);
79 }
80 n=nn;
81 for(int i=1;i<=m;i++){
82 scanf("%d%d",&x,&y);
83 vx.push_back(make_pair(x,i+n));
84 vy.push_back(make_pair(y,i+n+n+m));
85 add(i+n+n+m,i+n,1,0);
86 }
87 sort(vx.begin(),vx.end());
88 sort(vy.begin(),vy.end());
89 for(int i=1;i<vx.size();i++){
90 add(vx[i-1].se,vx[i].se,k,vx[i].fi-vx[i-1].fi);
91 add(vx[i].se,vx[i-1].se,k,0);
92 }
93 for(int i=1;i<vy.size();i++){
94 add(vy[i].se,vy[i-1].se,k,vy[i].fi-vy[i-1].fi);
95 add(vy[i-1].se,vy[i].se,k,0);
96 }
97 S=1+n+m,T=n;
98 printf("%lld",dinic());
99 }
[atARC122F]Domination的更多相关文章
- 2014牡丹江D Domination
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- zoj3822 Domination(概率dp)
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- ZOJ 3822 Domination 期望dp
Domination Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showProblem ...
- zoj 3822 Domination (可能性DP)
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- zoj 3822 Domination(2014牡丹江区域赛D称号)
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- ZOJ3822 ACM-ICPC 2014 亚洲杯赛事现场牡丹江司D称号Domination 可能性DP
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- zoj 3822 Domination(dp)
题目链接:zoj 3822 Domination 题目大意:给定一个N∗M的棋盘,每次任选一个位置放置一枚棋子,直到每行每列上都至少有一枚棋子,问放置棋子个数的期望. 解题思路:大白书上概率那一张有一 ...
- Domination(概率DP)
Domination 题目链接:https://odzkskevi.qnssl.com/9713ae1d3ff2cc043442f25e9a86814c?v=1531624384 Edward is ...
- ZOJ 3822 Domination 概率dp 难度:0
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
随机推荐
- 洛谷4719 【模板】动态dp 学习笔记(ddp 动态dp)
qwq大概是混乱的一个题. 首先,还是从一个比较基础的想法开始想起. 如果每次暴力修改的话,那么每次就可以暴力树形dp 令\(dp[x][0/1]\)表示\(x\)的子树中,是否选择\(x\)这个点的 ...
- UI BLOCK自定义枚举控件的宽度
三步: 1.修改PresentationStyle属性为Radio Box 2.修改NumberOfColumns属性为指定的宽度(显示字符的个数) 3.将PresentationStyle属性改回O ...
- 用css写三角形
html部分 <div class="triangle></div> css部分 .triangle{ width:0; height:0; overflow:hid ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫
定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...
- NodeJs安装与环境配置
https://blog.csdn.net/qq_43285335/article/details/90696126 https://www.cnblogs.com/liuqiyun/p/813390 ...
- (转载)关于Linux C函数strtok的使用要点
今天遇到了处理字符串的问题,比如分割问题,但是一时间想不起来什么方法,也不想手写一个类似java String中的split函数,于是百度了一下,发现了strtok这个好用的方法,以此作为总结. st ...
- You (oracle) are not allowed to access to (crontab) because of pam configura
用oracle用户添加备份计划任务,crontab -e,提示:You (oracle) are not allowed to access to (crontab) because of pam c ...
- PHP怎样写延时队列(定时器)
背景 PHP没有定时器,依托的都是crontab这样的系统工具,也没有go中defer这样的延时方法,本文介绍几种PHP写延时队列的几种姿势. 延时队列的定义 普通的队列是先进先出,但是延时队列并不是 ...
- 如何将声学的spectrogram(声谱图)重新反变换成时域语音信号
最近在研究一些信号分析的事情,感兴趣如何将频谱信号反变换成时域信号.fft 与ifft可以顺畅的转变,但是这个是一帧信号,当时间较长的信号再一起是,通过反变换变成一帧一帧的时域信号,如何把他们拼接起来 ...
- svn与git区别
代码扫描工具介绍:https://baijiahao.baidu.com/s?id=1629218655164599200&wfr=spider&for=pc Git和SVN的区别与联 ...