Arthur and Table 【CodeForces - 557C】【Splay】

2023-11-15

题目链接


有一张桌子,有n个腿。第i根腿的长度是li。

现在要拿掉一些腿,使得桌子稳定,拿掉第i根腿需要di的能量。

稳定的条件是,假如拿掉若干条腿之后,桌子还有k个腿,那么长度最长的腿的数目要超过一半。比如桌子有5根腿,那么至少要有三根腿是最长的。另外,只有一根腿的桌子是稳定的,两个腿的桌子想要稳定,必需长度是一样的。

你的任务是拿掉若干腿,使得桌子稳定,并且所消耗的能量要最少。


  然后,我们可以枚举是哪个“高度”最为这个最高高度。

  那么,高于这个最高高度的,就必须要减去了的,然后在剩下部分,我们可能还要减去一些点,使得这个高度超过一半,我们肯定减去的是最小的部分,所以用Splay充当一个堆来维护前K小。

跑起来真快,78ms。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f3f3f3f3f
#define eps 1e-8
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1e5 + 7;
int N, root = 0, tot = 0, L[maxN], D[maxN], _UP = 0, sz[maxN] = {0};
ll ss[maxN] = {0};
vector<int> vt[maxN];
struct node
{
    int ff, val, num, siz, ch[2]; ll sum;
    node() { ff = val = siz = ch[0] = ch[1] = num = sum = 0; }
} t[maxN<<2];
void pushup(int rt)
{
    t[rt].siz = t[t[rt].ch[0]].siz + t[t[rt].ch[1]].siz + t[rt].num;
    t[rt].sum = t[t[rt].ch[0]].sum + t[t[rt].ch[1]].sum + 1LL * t[rt].val * t[rt].num;
}
void Rotate(int x)
{
    int y = t[x].ff, z = t[y].ff;
    int k = t[y].ch[1] == x;
    t[z].ch[t[z].ch[1] == y] = x;
    t[x].ff = z;
    t[y].ch[k] = t[x].ch[k ^ 1];
    t[t[x].ch[k ^ 1]].ff = y;
    t[x].ch[k ^ 1] = y;
    t[y].ff = x;
    pushup(y);  pushup(x);
}
inline void Splay(int x, int goal)
{
    while(t[x].ff != goal)
    {
        int y = t[x].ff, z = t[y].ff;
        if(z != goal) (t[z].ch[0] == y) ^ (t[y].ch[0] == x) ? Rotate(x) : Rotate(y);
        Rotate(x);
    }
    if(!goal) root = x;
}
void Insert(int x)
{
    int u = root, ff = 0;
    while(u && (t[u].val ^ x))
    {
        ff = u;
        u = t[u].ch[x > t[u].val];
    }
    if(u)
    {
        t[u].num ++;
    }
    else
    {
        u = ++tot;
        if(ff) t[ff].ch[x > t[ff].val] = u;
        t[u].num = 1;
        t[u].ff = ff;
        t[u].val = x;
        t[u].siz = 1;
    }
    Splay(u, 0);
}
ll sum_K(int kth)
{
    int u = root; ll ans = 0;
    while(true)
    {
        int y = t[u].ch[0];
        if(kth > t[y].siz + t[u].num)
        {
            kth -= t[y].siz + t[u].num;
            ans += t[y].sum + 1LL * t[u].num * t[u].val;
            u = t[u].ch[1];
        }
        else
        {
            if(t[y].siz >= kth) u = y;
            else
            {
                ans += t[y].sum + 1LL * (kth - t[y].siz) * t[u].val;
                break;
            }
        }
    }
    return ans;
}
int main()
{
    scanf("%d", &N);
    for(int i=1; i<=N; i++) { scanf("%d", &L[i]); _UP = max(_UP, L[i]); }
    for(int i=1; i<=N; i++) scanf("%d", &D[i]);
    for(int i=1; i<=N; i++) vt[L[i]].push_back(D[i]);
    for(int i=1, len; i<=_UP; i++)
    {
        len = (int)vt[i].size();
        ss[i] = ss[i - 1]; sz[i] = sz[i - 1] + len;
        for(int j=0; j<len; j++) ss[i] += vt[i][j];
    }
    ll ans = INF, tmp;
    for(int i=1, len, need_del; i<=_UP; i++)
    {
        len = (int)vt[i].size();
        if(!len) continue;
        tmp = ss[_UP] - ss[i];
        need_del = sz[i] - 2 * len + 1;
        if(need_del > 0)
        {
            tmp += sum_K(need_del);
        }
        ans = min(ans, tmp);
        for(int j=0; j<len; j++) Insert(vt[i][j]);
    }
    printf("%lld\n", ans);
    return 0;
}

 

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

Arthur and Table 【CodeForces - 557C】【Splay】 的相关文章

  • 【SQL基础】SQL查询语句实例

    参考自 https www w3school com cn sql index asp 下面举实例 员工表 部门表 薪资等级表 附上sql语句 薪资等级表SALGRADE 部门表DEPT 员工表EMP CREATE TABLE DEPT D
  • Python 安装Python-Jenkins 报错No matching distribution found for python-jenkins

    1 报错情况 报错原因 找不到与python jenkins匹配的分布 pip 安装使用的是外国源镜像 导致获取超时 安装失败 获取不到新版本 解决办法 切换至 pip 源到国内镜像 2 切换pip源的方法 可以直接通过Pycharm 设置
  • Windows Server 2016搭建文件服务器

    1 进入系统在服务器管理器仪表盘中添加角色和功能 2 下一步 3 继续下一步 4 下一步 5 勾选Web服务器 IIS 6 添加功能 7 下一步 8 下一步 9 下一步 10 角色服务没有特殊要求 保持默认 下一步 我这里多选了IP和域限制
  • 2020年4月蓝桥杯第二次模拟赛解题报告(本科组)Java语言描述__2021/3/21

    3 单词重排 问题描述 将LANQIAO中的字母重新排列 可以得到不同的单词 如LANQIAO AAILNOQ等 注意这7个字母都要被用上 单词不一定有具体的英文意义 请问 总共能排列如多少个不同的单词 答案提交 这是一道结果填空的题 你只
  • 代理模式--动态代理--jdk代理

    动态代理 jdk代理 基于接口代理 cglib 基于类代理 javassist 基于字节码 一个jdk动态代理类代理的是一个接口 一般归属于一个业务 在不改动源代码的同时可以很方便的低成本的进行加工附属改造 jdk代理主要是通过java l
  • php邮件发送类源码,一个邮件发送类..

    一个邮件发送类 class emailui static function runlog mode SMTP b c d static function sendmail toemail subject message from cfg a
  • R语言确定聚类的最佳簇数:3种聚类优化方法

    原文链接 http tecdat cn p 7275 确定数据集中最佳的簇数是分区聚类 例如k均值聚类 中的一个基本问题 它要求用户指定要生成的簇数k 一个简单且流行的解决方案包括检查使用分层聚类生成的树状图 以查看其是否暗示特定数量的聚类
  • C++:指针

    目录 1 指针 1 1指针三要素 1 2修饰结构体struct 1 3 Pointers of Pointers 1 4constant修饰 pointer 2 指针和数组 2 1 数组的地址是连续的 2 2pointer arithmet
  • mysql5.7选取JDBC

    记录 springboot 2 5 0 springCloud2020 0 3 mysql5 7 选用 mysql connector java 8 0 25 报错 java security cert CertificateNotYetV
  • expected scalar type Long but found Int

    报错信息 expected scalar type Long but found Int 或者 expected scalar type Long but found Float 报错场景 pytorch的分类 本例具体为torch nn

随机推荐

  • anaconda和tensorflow安装教程

    即使以前安装过python的其它版本也没关系 本教程一样有效 1 anaconda安装 使用清华的源下载速度比较 下载地址 下载完成后安装 没什么需要注意的 添加环境变量 检测 anaconda环境是否安装成功 conda version
  • 解决:Pycharm无法识别Python已安装的模块,如cv2(OpenCV)模块

    https blog csdn net qq2399431200 article details 92832662 查看了好几篇这样的博客 该加的都加了 就是没解决 我装的是华军软件的破解版pycharm2018 搞了一下午 都没有弄好 最
  • rsync问题处理

    使用rsync同步时出现 in rsync opt failed Permission denied 13 检查了服务器的同步的目录权限都没有问题 网上找了说是开启了SELinux 的enforce模式 于事 root test01 etc
  • 技术解读倚天 ECS 实例 — Arm 芯片的 Python-AI 算力优化

    深度学习技术在图像识别 搜索推荐等领域得到了广泛应用 近年来各大 CPU 厂商也逐渐把 AI 算力纳入了重点发展方向 通过 Arm 芯片 Python AI 算力优化 我们将看到龙蜥社区 Arm 架构 SIG Special Interes
  • 三菱modbusRTU通讯实例_编程实例

    点击箭头处 工业之家 选择 关注公众号 台达PLC控制伺服项目接线及程序 今天主要分享的是关于台达 ASDA 伺服的相关控制案例 台达 ASDA 伺服定位演示系统 控制要求 1 由台达 PLC 和台达伺服组成一个简单的定位控制演示系统 通过
  • 2019年“华为杯”研究生数学建模比赛总结

    前言 参加数学建模比赛是学习生涯甚至是人生的一次难忘的经历 不管是比赛过程还是最终的结果 无论最终结果如何 自我学习生涯至今 在研究生期间参加一次数学建模更重要的是我对数学建模比赛的一种情怀 回想本科期间参加数学建模竞赛 从校赛到省赛 再到
  • qwt之左键控制局部放大,右键逐步还原功能

    一 完成新建工程 并配置完qwt的图形 这个后期会做一个专栏进行说明 二 拖上开始的按钮 布局如图所示 三 加上头文件 include
  • V4L2 摄像头应用编程

    目录 V4L2 简介 V4L2 摄像头应用程序 打开摄像头 查询设备的属性 能力 功能 设置帧格式 帧率 申请帧缓冲 内存映射 入队 开启视频采集 读取数据 对数据进行处理 结束视频采集 V4L2 摄像头应用编程实战 实战小项目之视频监控
  • PAT C语言入门题目-7-62 切分表达式——写个tokenizer吧 (20 分)

    7 62 切分表达式 写个tokenizer吧 20 分 先说点出题背景 这个题是为低年级同学 学C语言的同学准备的 因为 对这部分同学 这个题目编写起来略有一点复杂 如果是高年级 学过了正则表达式 Regular Expression 的
  • 银行转账项目

    package Day14 class Account String id 用户名称 double balance 用户余额 public void save double money 存钱方法 if money gt 0 balance
  • Postman设置中文

    1 下载资源 postman官网下载地址 postman汉化包 2 配置 Mac 访达 应用程序 Postman app 右键查看包内容 替换Postman app Contents Resources app windows 复制到Pos
  • vue新增删除内容排序问题解决处理

    本次答题选项的删除添加是个人最初比较头疼的地方 比如ABCD四个选项 删除c选项后 点击 新增答题类型 选项按钮 则默认创建是E选项 再或者就是ABCD四个选项位置删除任意一个后 顺序被打乱等 最后解决了 就是多写好几行代码 有点繁琐 1
  • vue 使用 scss 的坑

    vue 使用 scss 的坑 日常记录开发中遇到的坑 1 使用 npm install sass loader node sass save dev 进行安装 2 在页面中直接使用 有时候可以 有时候不行 原因 我个人觉得安装的两个插件本版
  • vscode 终端 npm 命令运行时 自动弹出如何打开这个文件?

    解决
  • wireshark数据包分析实战 读书笔记

    由头 永久链接 之前读了很多书籍 但是现在回顾的时候 很多内容仅仅是熟悉 而不是真正掌握 所以尝试一种新的方式 将读书时觉得比较重要的 或者是自己还不理解的东西记录下来 达到这本书我已经不需要再去翻 只要看笔记即可的效果 第一章 数据包分析
  • sql语句查询A表有而B表没有的数据

    SELECT A 户名FROM TABLE A A TABLE B BWHERE A 户名 B 户名 WHERE B 户名 IS NULL 还可以有其他方法 1 select distinct A ID from A where A ID
  • ps多种去水印方法与技巧-适合各种水印

    ps作为一款功能强大的图片处理软件 有着丰富的功能 ps去水印也是我们常用的一种功能 但是在我们日常使用中遇到的水印千奇百怪 不同的水印就需要使用不同的去水印方法 方法一 ps内容识别去水印 1 套索工具圈出水印 2 选择 编辑 填充 内容
  • 深度学习中的优化算法之Adam

    之前在https blog csdn net fengbingchun article details 124909910 介绍过深度学习中的优化算法Adadelta 这里介绍下深度学习的另一种优化算法Adam 论文名字为 ADAM A M
  • 在linux中怎么查看错误日志

    在linux中怎么查看错误日志 cat或者tail f命令日 志 文 件 说 明 var log message 系统启动后的信息和错误日志 是Red Hat Linux中最常用的日志之一 var log secure 与安全相关的日志信息
  • Arthur and Table 【CodeForces - 557C】【Splay】

    题目链接 有一张桌子 有n个腿 第i根腿的长度是li 现在要拿掉一些腿 使得桌子稳定 拿掉第i根腿需要di的能量 稳定的条件是 假如拿掉若干条腿之后 桌子还有k个腿 那么长度最长的腿的数目要超过一半 比如桌子有5根腿 那么至少要有三根腿是最