[CODE FESTIVAL 2016]Distance Pairs
题意:有一个未知的边权为$1$的图,给定所有点到$1$的最短路$a_i$和到$2$的最短路$b_i$,问是否存在这样的图,如果存在,问图中最少有多少条边
先考虑$a_i$,有$a_1=0,a_i\neq0(i\neq1)$,对于一条边$(x,y)$有$|a_x-a_y|\leq1$,对于任意$x\neq1$,存在$(x,y)$使得$a_x-1=a_y$,对$b_i$也有类似的约束
所以,我们将点$i$作为$(a_i,b_i)$画在平面上,那么至少要有两条边:第一条连到$(a_i-1,b_i-1)$或$(a_i-1,b_i)$或$(a_i-1,b_i+1)$,第二条连到$(a_i-1,b_i-1)$或$(a_i,b_i-1)$或$(a_i+1,b_i-1)$,如果这时找不到可以连边的点,那么就无解了(点$1$不用连第一种边,点$2$不用连第二种边)
如果可以连,那么我们构造出了一个有$2n-2$条边的图,显然这个图是满足条件的
但我们要最小化图中边数,所以考虑寻找尽可能多的可以共用的边
以下我们将第一种边称为$a$边,第二种边称为$b$边,共用边只可能是两种情况:1.对于点$i$,存在$(a_i-1,b_i-1)$,此时$i$的$a$边和$b$边可以共用;2.存在$i,j$使得$a_i-1=a_j,b_i+1=b_j$,此时$i$的$a$边可以和$j$的$b$边共用
我们把这$2n-2$条边看成点,如果两条边可以共用,在代表它们的点之间连一条边,求最大匹配即可,虽然是一般图,但注意到只有那些满足$a_i+b_i$相等的点$i$引出的边才可能共用,所以建出来的图是这样的(图来自官方题解)

图中框代表某个坐标$(a_i,b_i)$上的点,红点代表$b$边,蓝点代表$a$边,如果方框内有连边说明存在$(a_i-1,b_i-1)$
这种分层图可以从左上往右下贪心选边求最大匹配,实现时只需维护每个坐标的未匹配点个数即可
总时间复杂度为$O(n\log n)$,感觉这题还是不错的
#include<stdio.h>
#include<map>
using namespace std;
map<int,map<int,int> >mp,vis;
int a[100010],b[100010];
bool ex(int x,int y){
return mp.count(x)&&mp[x].count(y);
}
int main(){
int n,i,j,s,las,now;
scanf("%d",&n);
#define wa {puts("-1");return 0;}
for(i=1;i<=n;i++){
scanf("%d%d",a+i,b+i);
if(i!=1&&a[i]==0)wa
if(i!=2&&b[i]==0)wa
mp[a[i]][b[i]]++;
}
for(i=1;i<=n;i++){
if(i!=2){
if(!(ex(a[i]-1,b[i]-1)||ex(a[i],b[i]-1)||ex(a[i]+1,b[i]-1)))wa
}
if(i!=1){
if(!(ex(a[i]-1,b[i]+1)||ex(a[i]-1,b[i])||ex(a[i]-1,b[i]-1)))wa
}
}
s=0;
for(i=1;i<=n;i++){
if(!ex(a[i]-1,b[i]+1)&&!vis[a[i]][b[i]]){
vis[a[i]][b[i]]=1;
las=0;
for(j=0;ex(a[i]+j,b[i]-j);j++){
now=mp[a[i]+j][b[i]-j];
s+=min(las,now);
now-=min(las,now);
if(ex(a[i]+j-1,b[i]-j-1)){
s+=now;
now=min(las,mp[a[i]+j][b[i]-j]);
}else
now=mp[a[i]+j][b[i]-j];
las=now;
}
}
}
printf("%d",2*n-2-s);
}
[CODE FESTIVAL 2016]Distance Pairs的更多相关文章
- 【AtCoder】CODE FESTIVAL 2016 qual A
CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...
- 【AtCoder】CODE FESTIVAL 2016 qual B
CODE FESTIVAL 2016 qual B A - Signboard -- #include <bits/stdc++.h> #define fi first #define s ...
- 【AtCoder】CODE FESTIVAL 2016 qual C
CODE FESTIVAL 2016 qual C A - CF -- #include <bits/stdc++.h> #define fi first #define se secon ...
- Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution
Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution 题目链接:https://atcoder.jp/contests/cf16- ...
- Atcoder CODE FESTIVAL 2016 qual C 的E题 Encyclopedia of Permutations
题意: 对于一个长度为n的排列P,如果P在所有长度为n的排列中,按照字典序排列后,在第s位,则P的value为s 现在给出一个长度为n的排列P,P有一些位置确定了,另外一些位置为0,表示不确定. 现在 ...
- CODE FESTIVAL 2016 qualA Grid and Integers
划年代久远的水 题意 有一个R*C的棋盘,要求在每个格子上填一个非负数,使得对任意一个2*2的正方形区域,左上角和右下角的数字之和等于左下角和右上角的数字之和.有一些格子已经被填上了数字,问现在能否满 ...
- [CODE FESTIVAL 2016]Problem on Tree
题意:给一棵树,对于一个满足以下要求的序列$v_{1\cdots m}$,求最大的$m$ 对$\forall1\leq i\lt m$,路径$(v_i,v_{i+1})$不包含$v$中除了$v_i,v ...
- [CODE FESTIVAL 2016]Encyclopedia of Permutations
题意:给定一个排列,其中有可能有一些未确定的数,求出所有可能的排列的排名之和 首先我们要知道怎么算一个给定排列的排名,设它为$p_{1\cdots n}$ 排名即为比它小的排列数$+1$,对于每一个比 ...
- CODE FESTIVAL 2016 Grand Final 题解
传送门 越学觉得自己越蠢--这场除了\(A\)之外一道都不会-- \(A\) 贪心从左往右扫,能匹配就匹配就好了 //quming #include<bits/stdc++.h> #def ...
随机推荐
- Gulp、Grunt构建工具
在Gulp中创建一个库从磁盘gulp.src读取源文件并通过磁盘管道写回内容到gulp.dest,可以理解成只是将文件复制到另一个目录. var gulp = require('gulp'); gul ...
- crontab 详解 -- (转)
cron 是一个可以用来根据时间.日期.月份.星期的组合来调度对重复任务的执行的守护进程. cron 假定系统持续运行.如果当某任务被调度时系统不在运行,该任务就不会被执行. 要使用 cron 服务, ...
- mysql 之修改初始密码
转载自:https://www.cnblogs.com/ivictor/p/5142809.html 为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于er ...
- Linux 入门记录:十七、Linux 命令行文本/文件处理工具
一.文件浏览 cat 查看文件内容 more 以翻页形式查看文件内容(只能向下翻页) less 以翻页形式查看文件内容(可以上下翻页) head 查看文件的头几行(默认10行) tail 查看文件的尾 ...
- Mongo 配置文件 [www]
Mongo 配置文件 [www] http://blog.chinaunix.net/uid-25206403-id-3510934.html mongodb 安装使用 http://blog.si ...
- Java显式锁学习总结之一:概论
我们都知道在java中,当多个线程需要并发访问共享资源时需要使用同步,我们经常使用的同步方式就是synchronized关键字,事实上,在jdk1.5之前,只有synchronized一种同步方式.而 ...
- Codeforces 877C Slava and tanks(思维)
题目链接:http://codeforces.com/problemset 题目大意:有n个格子,某些格子里可能有一个或多个坦克,但不知道具体位置,每个坦克被轰炸一次就会移动到相邻的格子里(第1个格子 ...
- python字符编码与解码 unicode,str
解释以下几个问题: (1)python2中str和unicode是两种字符串类型,与字符编码方式是什么关系? (2)str和unicode是怎么相互转换的? (3)'\x...':'\u...', ' ...
- Linus 谈软件开发管理经验
原文出处: linuxtoday 译文出处:CSDN // 伯乐在线转注:英文原文写于 2011 年 导读:没有人比Linus Torvalds更了解软件开发项目管理中的酸甜苦辣了.作为Linux ...
- NET应用——你的数据安全有必要升级
最近又被[现场破解共享单车系统]刷了一脸,不得不开始后怕:如何防止类似的情况发生? 想来想去,始终觉得将程序加密是最简单的做法.但是摩拜.ofo也有加密,为什么仍然被破解?那是因为请求在传输过程中被篡 ...