一、题目链接

  http://codeforces.com/gym/101490

二、题面

  

三、题意

  给你n个点,代表学生所在位置,n个点,代表老师所在位置。每个学生分配一个老师。让你找出一个最小的学生到他的老师的距离(曼哈顿距离),使得其他学生到其老师的距离不超过这个距离。

四、思路

  一开始看到这个题,第一反应是N很小,可以考虑暴力搞。但是,压根没思路,暴力都不知道怎么暴。有个很朴素的思路,对第一个学生,枚举每一个老师,计算他和老师的距离,然后,对第二个以后的学生,dfs继续这么干。那这样的话,复杂度是O(100^100) >> O(2 ^ 100)。当时,我想到这个想法时,还和旁边的同学开了个玩笑,我说:我昨晚算了一下,从1循环到2^64次方,需要跑几年。假设普通计算机每秒做10E次操作,约等于10^9。2^64≈10^19,10^19/10^9=10^10(秒),一年也才3000W+秒,要跑300+年。

  好了,很明显,上面很Naive的想法肯定是不行的。那怎么办呢?其实这题不难往二分图的方向去想。因为比较裸。我后来看到有同学是用二分图匹配A的。我之前也敲过二分图匹配的题,但是,由于图论方面我没有做太多的训练,只会用用大家都会的图论板子而已。所以,虽然能想到二分图,但是,不知道该怎么去用。后来想到一个办法:二分枚举最大的距离,在原图的基础上删除所有距离比枚举值大的边,跑一遍dfs,如果能连通,则说明此枚举值有效。然而,GG……这个想法也不行。比如这个样例:

  然后,我又想到另外一个方法:枚举每一个学生,看看所有的学生所能连接的老师有没有n个,有的话,当前二分的枚举值合法。然后,又找到这样的样例:

  思路想到此了,既然这样不行,那我就把老师这边也来一次这样的,如果能连接的学生有n个,那么,这确实可以保证每个学生都和至少一个老师、每个老师都和至少一个学生有连接了。

至于存储能连接的老师有没有n个,这样的方法有很多。我使用的是bitset位存储。

五、源代码

  

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> PLL;
int n;
PLL stu[], tea[];
vector<][];

LL bas(LL x) {
     ? -x : x;
}

LL dis(PLL p1, PLL p2) {
    return bas(p1.first - p2.first) + bas(p1.second - p2.second);
}

bitset<> match[][];
bool test(LL mid) {
    ; i < ; ++i)g[][i].clear(), g[][i].clear();
    ; i <= n; ++i) {
        ; j <= n; ++j) {
            if(dis(stu[i], tea[j]) <= mid) {
                g[][i].push_back(j);
                g[][j].push_back(i);
            }
        }
    }
    bitset<> res[];
    res[].reset(), res[].reset();
    ; i <= n; ++i)match[][i].reset(), match[][i].reset();
    ; k < ; ++k) {
        ; i <= n; ++i) {
            , sz = g[k][i].size(); j < sz; ++j) {
                int adj = g[k][i][j];
                match[k][i].set(adj);
            }
            res[k] = res[k] | match[k][i];
        }
    }
    ].count() == n && res[].count() == n;
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("Jinput.txt", "r", stdin);
#endif // ONLINE_JUDGE
    while(~scanf("%d", &n)) {
        ; i <= n; ++i)scanf("%lld%lld", &stu[i].first, &stu[i].second);
        ; i <= n; ++i)scanf("%lld%lld", &tea[i].first, &tea[i].second);
        LL low = -, high = 1LL << , mid;
        ) {
            mid = (high + low) / ;
            if(test(mid))high = mid;
            else low = mid;
        }
        printf("%lld\n", high);
    }
    ;
}

 经验:由于习惯了int,这次的long long一不小心又用成了%d输入,然后,调试调了几十分钟,真不应该啊。

CFGym 101490J 题解的更多相关文章

  1. CFGym 101490E 题解

    一.题目链接 http://codeforces.com/gym/101490 二.题面 三.题意 给你一个图,n个点,m条边,一个x,从顶点1走到顶点n.假设从顶点1走到顶点n的最短路为d,x代表你 ...

  2. CFGym 101161I 题解

    一.题目链接 http://codeforces.com/gym/101161/problem/I 二.题意 给定一棵树,一个初始的省会城市,若干个询问,0表示修改省会城市,1表示查询去省会必须经过指 ...

  3. CFGym 100198G 题解

    一.题目链接 http://codeforces.com/gym/100198/problem/G 二.题意 看样例就能明白,写表达式解析器. 三 .思路 一看这题目,立马就会想到“后缀表达式”,考虑 ...

  4. CFGym 101194L 题解

    一.题目链接 http://codeforces.com/gym/101194/problem/L 二.题意 有4个队伍,要打6场比赛(刚好每两个队伍都能相互比一次),若A和B比赛有3种结果: A赢B ...

  5. CFGym 101194D 题解

    一.题目链接 http://codeforces.com/gym/101194/problem/D 二.题意 给定一个数字n和一个数字k,一个n个整数的序列,让你在里面找尽可能多的长度为k的符合“要求 ...

  6. CFGym 101505I 题解

    一.题目链接 http://codeforces.com/gym/101505 二.题意 这题其实主要就是题意,理解题意后,就是水题了.我想了下,主要原因就是这几点: 1.题意太过英文化,很多句子不能 ...

  7. CFGym 100211J 题解

    一.题目 二.题意 给定一个字母表(最多也就是英文小写字母的前10个字母),一个交换表,两个字符串,判断字符串A能否通过交换表的交换方式变成字符串B. 三.思路 1.一开始,比赛时,我半模拟半记忆化地 ...

  8. [CF-GYM]Abu Tahun Mod problem题解

    前言 这道题比较简单,但我还是想了好一会 题意简述 Abu Tahun很喜欢回文. 一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组\(\left\{1\right\},\left ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. ubuntu 14.04 (desktop amd 64) 查看配置参数

    硬盘型号 sudo hdparm -i /dev/sda |grep "Model"   硬盘数量大小 sudo fdisk -l |grep "Disk /dev/sd ...

  2. 炫酷的CSS3抖动样式:CSS Shake

    CSS Shake是一个使用CSS3实现的动画样式,使用SASS编写,利用它我们可以实现多种不同样式的抖动效果(如下面的GIF图像): 炫酷的CSS3抖动样式:CSS Shake 这是一个很微小的动画 ...

  3. (GoRails)ActiveRecord --explain方法:(优化你的查询)

    https://gorails.com/episodes/activerecord-explain?autoplay=1 比如没有加index的查询和加了index的查询,调用数据库的速度就差5倍. ...

  4. Android------视频播放器(包含全屏播放,快退,快进,腾讯新闻的列表播放等)

    前段时间做了一个新闻APP,涉及到了列表视频播放,和腾讯新闻APP差不多,总结了一下代码,写了一个Demo来分享给大家. 用了  TabLayout+RecylerView+自定义视频控件  完成的 ...

  5. bzoj1069: [SCOI2007]最大土地面积 凸包+旋转卡壳求最大四边形面积

    在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 题解:先求出凸包,O(n)枚举旋转卡壳,O(n)枚举另一个点,求最大四边形面积 /* ...

  6. mongodb 之linux下安装、启动、停止、连接

    今天在linux上面安装了mongodb 1.下载linux的mongodb 2.在目录usr/local下创建文件夹mongodb,把安装包解压到该文件夹中 # mkdir mongodb # ta ...

  7. ExecutorService对象的shutdown()和shutdownNow()的区别

    可以关闭 ExecutorService,这将导致其拒绝新任务.提供两个方法来关闭 ExecutorService. shutdown() 方法在终止前允许执行以前提交的任务; shutdownNow ...

  8. ubuntu16.04下安装opencv3.3

    最近重装了ubuntu16.04的系统,在给电脑配置好cuda8.0和cudnn6.0的版本后,开始重新安装opencv,在opencv的官网上发现最新版本3.3版本增加了很多深度学习方面的东西,果断 ...

  9. Mysql基本操作(远程登陆,启动,停止,重启,授权)

    1.查看mysql版本 方法一:status; 方法二:select version(); 2.Mysql启动.停止.重启常用命令 a.启动方式 1.使用 service 启动: [root@loca ...

  10. CUDA 安装完成以后如何判断安装是否成功

    最近在家里过寒假,可能这是还在学校里带着最大的福利了,无意之中翻出了多年前买的几本关于CUDA编程的书,于是随便在自己电脑上配置了一下环境,试试能不能把当年没有看完的书给看完了,于是有了今天这个判断C ...