Luogu 3644 [APIO 2015] 八邻旁之桥

2023-05-16

          • 传送门
          • 思路
          • 当 k = 2 时
          • 参考代码

传送门
思路

  唉,我太弱了,什么都不会,题也做不来。很明显这道题先要把不过河的人排除了,剩下的都是要过河的。当 k=1 k = 1 时,看看每个人的答案是多少:

  显然,对于每个人,它对答案的贡献是两个端点到桥的距离之和。所以求一个中位数就好啦!(22 分 get,做了这么久 APIO 终于得分了 QAQ)

当 k = 2 时

  唉,我太弱了,什么都不会,连想题都想不出来。

  显然,当我们确定了哪些人走第一座桥,哪些人走第二座桥后,就可以通过求中位数解决这个问题了。

  由以上做法,我们可以大胆猜测:桥一定建在一个房子那里。因此我们可以 O(n2) O ( n 2 ) 枚举了。


  唉,我太弱了,之前推导出来的是错的。

  发现,桥离线段的中点越近越好:显然当不能直接过桥时中点离桥越远答案越大。所以我们按中点位置排序。现在问题从选一个集合变成了选一个分割点。

  所以现在的问题是要求维护一个数据结构,支持插入一个数、删除一个数、查找第 k k 大(中位数)、求比第 k 大小的数之和、求比第 k k <script type="math/tex" id="MathJax-Element-9">k</script> 大大的数之和。用权值线段树即可,你用 Splay 也行,Treap 也 OK,甚至你可以试试 vector

参考代码

  结果我用的是对顶 set……

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cassert>
#include <cctype>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <functional>
#define loop register int
typedef long long LL;
typedef unsigned long long ULL;
using std::cin;
using std::cout;
using std::endl;
typedef LL INT_PUT;
INT_PUT readIn()
{
    INT_PUT a = 0; bool positive = true;
    char ch = getchar();
    while (!(ch == '-' || std::isdigit(ch))) ch = getchar();
    if (ch == '-') { positive = false; ch = getchar(); }
    while (std::isdigit(ch)) { a = a * 10 - (ch - '0'); ch = getchar(); }
    return positive ? -a : a;
}
void printOut(INT_PUT x)
{
    char buffer[20]; int length = 0;
    if (x < 0) putchar('-'); else x = -x;
    do buffer[length++] = -(x % 10) + '0'; while (x /= 10);
    do putchar(buffer[--length]); while (length);
}

const int maxn = int(1e5) + 5;
int k, n;
LL base;
struct Place
{
    int a, b;
    bool operator<(const Place& y) const
    {
        return a + b < y.a + y.b;
    }
} places[maxn];

#define RunInstance(x) delete new x
struct cheat
{
    int all[maxn * 2];
    cheat()
    {
        for (int i = 1; i <= n; i++)
        {
            all[i - 1] = places[i].a;
            all[i - 1 + n] = places[i].b;
        }
        std::nth_element(all, all + n, all + (n << 1));
        int mid = all[n];
        LL ans = 0;
        for (loop i = 0, to = n << 1; i < to; i++)
            ans += std::abs(all[i] - mid);
        printOut(ans + base);
    }
};

struct work
{
    struct MultiSet : public std::multiset<int>
    {
        LL sum;
        MultiSet() : sum() {}
        void push(int t)
        {
            sum += t;
            std::multiset<int>::insert(t);
        }
        void pop(int t)
        {
            sum -= t; // note
            std::multiset<int>::erase(std::multiset<int>::find(t));
        }
    };
    struct OppositeSet
    {
        MultiSet small, big;
        void adjust()
        {
            if (!((small.size() + big.size()) & 1))
            {
                while (small.size() > big.size())
                {
                    big.push(*small.rbegin());
                    small.pop(*small.rbegin());
                }
                while (small.size() < big.size())
                {
                    small.push(*big.begin());
                    big.pop(*big.begin());
                }
            }
            else
            {
                while (small.size() > big.size() + 1)
                {
                    big.push(*small.rbegin());
                    small.pop(*small.rbegin());
                }
                while (small.size() < big.size() + 1)
                {
                    small.push(*big.begin());
                    big.pop(*big.begin());
                }
            }
        }
        void push(int x)
        {
            if (!big.size() || x < *big.begin())
                small.push(x);
            else
                big.push(x);
            adjust();
        }
        void pop(int x)
        {
            if (big.size() && x >= *big.begin())
                big.pop(x);
            else
                small.pop(x);
            adjust();
        }
    } set1, set2;

    static LL calc(const OppositeSet& set)
    {
        if (!set.small.size()) return 0;
        LL mid = *set.small.rbegin();
        return mid * set.small.size() - set.small.sum + set.big.sum - mid * set.big.size();
    }

    work()
    {
        LL INF;
        memset(&INF, 0x3f, sizeof(INF));
        std::sort(places + 1, places + 1 + n);
        for (int i = 1; i <= n; i++)
        {
            set2.push(places[i].a);
            set2.push(places[i].b);
        }

        LL ans = calc(set2);
        for (int i = 1; i <= n; i++)
        {
            set1.push(places[i].a);
            set1.push(places[i].b);
            set2.pop(places[i].a);
            set2.pop(places[i].b);
            ans = std::min(ans, calc(set1) + calc(set2));
        }
        printOut(ans + base);
    }
};

void run()
{
    k = readIn();
    n = readIn();

    int valid = 0;
    for (int i = 1; i <= n; i++)
    {
        char type[2][4];
        scanf("%s", type[0]);
        int p1 = readIn();
        scanf("%s", type[1]);
        int p2 = readIn();
        if (type[0][0] == type[1][0])
            base += std::abs(p1 - p2);
        else
        {
            if (type[0][0] == 'B')
                std::swap(p1, p2);
            valid++;
            places[valid].a = p1;
            places[valid].b = p2;
        }
    }
    n = valid;
    base += n;

    if (k == 1)
        RunInstance(cheat);
    else
        RunInstance(work);
}

int main()
{
    run();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Luogu 3644 [APIO 2015] 八邻旁之桥 的相关文章

  • C++ 零碎特性

    摘自 C 43 43 17 入门经典 几乎不会再更新 文章目录 使用花括号初始化变量零初始化使大整型字面量更加易读二进制的整型字面量 96 size t 96 类型浮点数的特殊情况 xff1a NaN xff08 Not a Number
  • Python 学习笔记——进阶

    文章目录 一 模块 xff08 一 xff09 1 导入外部模块2 导入时重命名3 标准库 xff08 一 xff09 96 sys 96 96 argv 96 变量 96 exit 96 函数 96 modules 96 变量 96 pa
  • C++ UTF-8 编码与 UTF-32 编码的互相转换

    C 43 43 UTF 8 编码与 UTF 32 编码的互相转换 代码实现基本照搬了秦建辉的博客 这里不介绍原理 xff0c 只提供可以直接使用的代码 要求 C 43 43 编译器的语言标准至少为 C 43 43 17 如果编译器支持的语言
  • C++ 默认移动构造函数的调用情况

    C 43 43 默认移动构造函数的调用 直接上测试代码 xff1a include lt cstdio gt include lt iostream gt include lt string gt class MyClass int a 6
  • LaTeX 003:使用 MikTeX 组件实现 pdf 转 eps

    气死了气死了 xff0c 这玩意儿居然直接百度不到一个很好的答案 xff0c 百度到的全是用带图形化界面的软件 xff0c 您不累吗 xff1f 唯一找到的一个 xff0c 效果不好 xff0c 是糊的 最后还是上谷歌镜像站 xff0c 一
  • 【深入浅出ios开发】UIStoryboardSegue详解

    一个UIStoryboardSegue对象负责执行两个试图控制器之间的视觉过渡 另外 xff0c segue对象通常用来准备从一个控制器过渡到另一个控制器 segue对象包含了涉及过渡的控制器的信息 当segue被触发 xff0c 并且在视
  • C++ 多线程编程导论(上)

    随着摩尔定律逼近失效和多核处理器快速发展 xff0c 多线程编程变得越来越重要 本文将系统介绍在 C 43 43 中如何使用 STL 实现多线程编程 多线程编程博大精深 xff0c 本文并不介绍多线程算法或多线程编程方法 xff0c 而是把
  • 使用 WaitForSingleObject 等待进程结束错误代码 5(拒绝访问)问题的解决

    说明使用 OpenProcess 的权限不够 xff0c 但是哪个权限呢 xff1f 查阅文档发现是 SYNCHRONIZE SYNCHRONIZE 0x00100000L 使用对象的同步机制的权限 该权限允许线程等待该对象 xff0c 直
  • LaTeX 004:隐藏 hyperref 超链接的红框

    针不戳 xff0c 很快找到答案了针不戳 以往的方法是设置超链接红框的颜色 hypersetup pdfauthor 61 UnnamedOrange colorlinks 61 true linkcolor 61 black anchor
  • LaTeX 005:删除一个命令

    C 43 43 的预编译系统中 xff0c 可以使用 undef 来取消 xff08 Undefine xff09 一个宏 LaTeX LaTeX L A T E X 中是否有类似于这样的功能呢 xff1f 网上的一个评论给出了解决方案 x
  • LaTeX 006:添加一个只有文字没有标号的脚标

    想要如下的效果 xff1a 该脚标只想要写一句注释 xff0c 没有对应的正文文本 如何实现 xff1f 直接使用 footnotetext 是不佳的 xff0c 前面会加上当前的脚标标号 xff0c 而且该标号不会自动递增 虽然 foot
  • GetExitCodeProcess 所需运行时间

    GetExitCodeProcess 在 Windows 中用于获取进程的返回代码 这个看上去只有一个读操作的函数运行速度如何呢 xff1f 直觉上不会很快 xff0c 因为它肯定涉及操作系统进程表的操作 下面做了一个实验 代码 xff1a
  • C++ 继承时返回值或参数的类型是父类的行为

    见以下代码的 base t amp operator 61 const base t amp another 还没有搞清楚 span class token macro property span class token directive
  • LaTeX 007:texify 调用 zhmakeindex

    如文档所述 xff0c 在系统增加一个值为 zhmakeindex 路径的环境变量 MAKEINDEX 即可
  • 转载:LaTeX 定义参数变长的命令

    本文作者 xff1a Liam Huang 本文链接 xff1a https liam page 2017 07 30 define a new command with different amount of parameters in
  • 一个简单的 Lex 词法分析程序示例

    作为一个学习 Lex 词法分析程序的例子 xff0c 下面的 lex 程序将会生成一个分析 LaTeX 中命令的词法分析器 下面的程序包含了很多 lex 语言的语法 xff0c 正则表达式除外 正则表达式的用法网上比较多 xff0c 这里不
  • mysql数据库conf配置详解

    mysqld port 61 6033 skip grant tables datadir 61 usr tools mysql data socket 61 usr tools mysql mysql sock user 61 mysql
  • LaTeX 008:比较方便的键入下划线的方式

    在 LaTeX 中 xff0c 我们有时会需要输入下划线 直接键入 是不行的 xff0c 会出现的编译错误 xff0c 正如网友所述 xff0c LaTeX 为了简化对编译错误的处理禁止在文本模式 xff08 text mode xff09
  • LaTeX 009:自定义带有 * 号的命令

    LaTeX 中 xff0c 我们经常见到 section 和 section xff0c 分别表示有编号的 section 和没有编号的 section 我们也想自己定义带有 号的命令 xff0c 但写下面的代码时却报错了 xff1a ne
  • 2022 New Year‘s Resolution

    Some Might Say 2022 New Year 39 s Resolution Some might say we are on the edge of the new era Always are they saying thi

随机推荐

  • C++ 多线程编程导论(中)

    受篇幅限制 xff0c 上半部分不再更新 xff0c 填坑的新内容都放在此文章中 文章目录 参考资料线程安全 xff08 续 xff09 互斥访问 互斥体 xff08 mutex xff09 和锁 xff08 lock xff09 什么是互
  • C++ 使用模板序列化/反序列化固定键值对

    仅是一个原型 xff0c 留作记录 我感觉可以写出非常逆天的代码 span class token macro property span class token directive hash span span class token d
  • 编译原理习题两则(龙书,写出语言的正则定义)

    3 3 5 3 注释 xff0c 即 和 之间的串 xff0c 且串中没有不在双引号 xff08 34 xff09 中的 注 xff1a 假设双引号是匹配的 思路 xff1a 从空串开始写 xff0c 写出整体框架后 xff0c 通过分类讨
  • 2023 New Year‘s Resolution

    This Is Game 2023 New Year 39 s Resolution My 2022 ended with a day of game I am convinced that I am not to blame becaus
  • 补录:2018 和 2019 New Year‘s Resolution

    前言 xff1a 吉光片羽 xff0c 以飨读者 2018 New Year 39 s Resolution One year and a half ago I felt that life in 2020 would be quite d
  • 原博文地址

    由于账号问题 xff0c 现更改为这个账号 xff0c 以下为原博文地址 使用WH MOUSE LL钩子来判断按键是否是mouse event模拟的 http blog csdn net qq 26140973 article detail
  • [NOI 2003] 文本编辑器 Splay 维护序列 / 块状链表

    传送门 xff08 JZOJ xff09 xff08 第一道全国决赛题 xff09 解法 1 xff1a 使用 Splay 维护 不管怎么说 xff0c 总和刚刚学过的迎合上了 这道题可以直接上 Splay 维护线性序列 xff0c 光标位
  • 一次macOS的升级填坑(macOS Catalina - macOS Monterey)

    目录 小序一 升级前操作二 升级中三 问题填坑1 像我一样长时间卡在一个进度条怎么办2 在更新途中重启过电脑 xff08 完整流程填坑 xff09 3 安装之后不能开机 xff0c 如何紧急拷贝资料4 安装不成功 xff0c 如何重新安装系
  • CF 713C Sonya and Problem Wihtout a Legend

    文章目录 传送门题目大意正解通过维护关键点来维护信息参考代码 传送门 题目大意 给定一个长度为 n n 3000
  • Luogu 3642 [APIO 2016] 烟火表演

    传送门引例 xff08 上一道题 xff09 凸函数一开始的思路正解参考代码总结 传送门 引例 xff08 上一道题 xff09 凸函数 回忆我们上一道题是怎么做的 我们维护的东西的实质是一个 xff08 下 xff09 凸函数 由于我们的
  • Luogu 3631 [APIO 2011] 方格染色

    传送门思路参考代码细节 传送门 思路 很不错的一道题 xff0c 用到的东西不深 xff0c 但是要想到确实需要一定思维 一开始我想的是动态规划 xff0c 发现如果要设状态需要知道一个格子左边 xff0c 上边和左上边三个格子的状态 然后
  • Luogu 3632 [APIO 2011] 寻路

    传送门正解参考代码 传送门 正解 暴力连边跑最短路就好了 xff0c 只不过代码太长太难写啦 xff01 参考代码 span class hljs preprocessor include lt cstdio gt span span cl
  • Luogu 3634 [APIO 2012] 守卫

    传送门思路正解参考代码 传送门 思路 感觉自己越来越笨了 首先 xff0c 很明显这道题需要把没有看到忍者的区间给删去 xff0c 可以用前缀和 O n O n 处理 xff0c 然后对没有删去的地方重新标号 重新标号时 xff0c 需要对
  • Luogu 1552 [APIO 2012] 派遣

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题读错了两次 xff0c 一开始读成了一个一般的背包 xff0c 然后读成了一个价值和花费相同的背包 xff0c 最后才发现原来是一个价值为 1
  • 贪玩 CF 之旅

    文章目录 CF 7D Palindrome Degree http codeforces com problemset problem 7 D 题解 CF 713C Sonya and Problem Wihtout a Legend ht
  • Luogu 3638 [APIO 2013] 机器人

    传送门思路正解参考代码关于 SPFA 传送门 思路 n n 这么小 会不会是搜索题 稍有经验的我直接否定了这个结论 仔细读题并分析样例 发现原来一个位置可以有多个机器人 且机器人行走的时候无视其它机器人 那这个就是一张图啊 可以将这张图预处
  • Luogu 3647 [APIO 2014] 连珠线

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 又看错题了 题目中说一个新的珠子和一个已经添加的珠子连接起来 xff0c 我没有看到 xff0c 然后就凉了 立个 flag xff1a 已经连续看错五题了 xff0c
  • 【转】mingw64的安装方法

    转自 xff1a http write blog csdn net postlist mingw64的安装方法 1 下载ming w64 http sourceforge net projects mingw w64 files or x8
  • Luogu 3645 [APIO 2015] 雅加达的摩天楼

    传送门思路正解参考代码Update 传送门 思路 唉 xff0c 我太弱了 xff0c 我都看出来要分块了 xff0c 就是做不来 不过终于把题读对了 先来看子任务三怎么做 显然可以有一个 O m 2 O m 2
  • Luogu 3644 [APIO 2015] 八邻旁之桥

    传送门思路当 k 61 2 时参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题也做不来 很明显这道题先要把不过河的人排除了 xff0c 剩下的都是要过河的 当 k 61 1 k 61 1 时 xff0