Codeforces 1469 F. Power Sockets —— 二分+线段树,贪心

2023-11-15

This way

题意:

现在有一个根节点,和n条包含a[i]个节点的链。一开始所有点的颜色是白色的。你每次可以做以下操作:
找到树中某个白色节点,拿出一条链,将这个节点和链上某个节点连接,并且这两个点的颜色变成黑色,之后这条链属于树中一个部分。
你可以合并任意的链,问你离根节点第k远的白色点的深度最小是多少。

题解:

首先知道了一点:加入一条链的时候,两个白点会变成黑色,那么长度小于等于2的必不用加入。
并且长的链在前面一定是更优的,因为短链在前,再加长链的话,会使得更多的白点深度增加。
链接树上的白点时,一定是找深度最小的,连接链的时候,一定是链最中间的点。就像刚才说的一样,如果不是深度最小的话,更多的白点深度会增加。连接中间点的话,链上会有一半的点的深度降低。
但是我们不能白点数量一到k的时候就结束操作,因为可能能够在一些深度较低的白点上加链使得第k远的白点的深度减小。
于是这种最大值最小的题目我们一眼就知道是二分。
那么怎么知道当前第k远的点的深度,怎么知道深度最低的点的位置呢,使用线段树维护即可。

#include<bits/stdc++.h>
using namespace std;
const int N=8e5+5;
#define ll long long 
ll sum[N*4],f[N*4];
void push_down(int l,int r,int root){
    if(!f[root])return ;
    int mid=l+r>>1;
    sum[root<<1]+=(mid-l+1)*f[root];
    sum[root<<1|1]+=(r-mid)*f[root];
    f[root<<1]+=f[root];
    f[root<<1|1]+=f[root];
    f[root]=0;
}
void update(int l,int r,int root,int ql,int qr,int v){
    if(l>=ql&&r<=qr){
        sum[root]+=(r-l+1)*v;
        f[root]+=v;
        return ;
    }
    int mid=l+r>>1;
    push_down(l,r,root);
    if(mid>=ql)
        update(l,mid,root<<1,ql,qr,v);
    if(mid<qr)
        update(mid+1,r,root<<1|1,ql,qr,v);
    sum[root]=sum[root<<1]+sum[root<<1|1];
}
int q_k(int l,int r,int root,int k){
    if(l==r)return l;
    int mid=l+r>>1;
    push_down(l,r,root);
    if(sum[root<<1]>=k)return q_k(l,mid,root<<1,k);
    else return q_k(mid+1,r,root<<1|1,k-sum[root<<1]);
}
int q_f(int l,int r,int root){
    if(l==r)return l;
    int mid=l+r>>1;
    push_down(l,r,root);
    if(sum[root<<1])return q_f(l,mid,root<<1);
    else return q_f(mid+1,r,root<<1|1);
}
int a[N],n,k;
bool cmp(int x,int y){return x>y;}
int check(int x){
    memset(sum,0,sizeof(sum)),memset(f,0,sizeof(f));
    update(1,N-1,1,2,1+(a[1]-1)/2,2);
    if(a[1]%2==0)
        update(1,N-1,1,1+a[1]/2,1+a[1]/2,1);
    for(int i=2;i<=n;i++){
        if(sum[1]>=k)
            if(q_k(1,N-1,1,k)<=x)return 1;
        if(a[i]<=2)return 0;
        int p=q_f(1,N-1,1);
        update(1,N-1,1,p,p,-1);
        update(1,N-1,1,p+2,min(N-1,p+1+(a[i]-1)/2),2);
        if(a[i]%2==0&&p+1+a[i]/2<=N-1)
            update(1,N-1,1,p+1+a[i]/2,p+1+a[i]/2,1);
    }
    if(sum[1]>=k)
        if(q_k(1,N-1,1,k)<=x)return 1;
    return 0;
}
int main()
{
    
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+1+n,cmp);
    if(a[1]==2)return 0*printf("-1\n");
    int l=1,r=N-1,mid,ans=-1;
    while(r>=l){
        mid=l+r>>1;
        if(check(mid))r=mid-1,ans=mid;
        else l=mid+1;
    }
    printf("%d\n",ans?ans:-1);
    return 0;
}

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

Codeforces 1469 F. Power Sockets —— 二分+线段树,贪心 的相关文章

  • ZOJ 1610 Count the Colors

    Problem acm zju edu cn onlinejudge showProblem do problemCode 1610 Reference blog csdn net shuangde800 article details 8
  • 【NOIP 2004 提高组】合并果子

    题就自己找啦 各大OJ上应该都有 题目 题目描述 在一个果园里 多多已经将所有的果子打了下来 而且按果子的不同种类分成了不同的堆 多多决定把所有的果子合成一堆 每一次合并 多多可以把两堆果子合并到一起 消耗的体力等于两堆果子的重量之和 可以
  • Polycarp and Div 3【Codeforces Round #496 (Div. 3)【D题】】【贪心】

    应该说是今天凌晨的吧 第一次打Code Forces 懵懵懂懂的 不过感觉还是良好 做了几道签到题 难题还是没有那个水准去做 Polycarp likes numbers that are divisible by 3 He has a h
  • HDOJ 1052 Tian Ji -- The Horse Racing

    Tian Ji The Horse Racing Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 2
  • Atlantis 【POJ - 1151】【扫描线模板讲解】

    题目链接 是第二次写这道题了 但是也加深了我对扫描线的印象了 具体什么是扫描线 我们就如是讲讲吧 扫描线就是为了方便处理有重的区间面积的方式 我们通过线段树的方式去优化它 可以做到更少的时间复杂度 对于一个二维平面 我们用一个平行于Y轴的线
  • 【2019年ICPC南昌网络赛】Distance on the tree【DFS+线段树合并(可持久化线段树)】

    题目链接 DSM Data Structure Master once learned about tree when he was preparing for NOIP National Olympiad in Informatics i
  • 多元Huffman编码问题

    题目链接 题意 最多可以让k堆合并 每一次合并的花费为河合并堆的数量 问最多和最少的花费 题解 最少的花费一定是每次合并的堆数尽可能多 这样我们就会减少前面已经合并的堆的重复计算 所以 每次合并k堆时最少 每次合并2堆时最大 另外 最少的时
  • HDOJ1052

    先用最快马比 不行再用最慢马比 都不行 就送最慢马给忘得最快马 include
  • 2605. 从两个数字数组里生成最小数字

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 枚举比较法 方法二 集合的位运算表示法 写在最后 Tag 贪心 位运算 数组 题目来源 2605 从两个数字数组里生成最小数字 题目解读 给定两个各自只包含数字 1 到 9 的两个数组
  • poj 2155 Matrix

    Problem poj org problem id 2155 vjudge net contest 146952 problem A Meaning 一个 N N 的矩阵 A 初始时全部值为 0 有两种操作 1 C x1 y1 x2 y2
  • ArabellaCPC 2019 I:Bashar and Hamada 贪心

    Bashar and Hamada 给你一个长度为 n 的数组 选k个数 使F ai aj k个数 i j 求k 2 3 n时 F的最大值 首先n 2时 肯定选择数组中的最大值和最小值 这样F2 max min F2最大 n 3时 在F2的
  • 牛牛的等差数列【线段树】

    题目链接 这里的突破口在于小于等于25且大于等于3的质数连乘在1e8左右 所以 我们可以在操作上 将其看作对1e8去求模 而不是对每个都进行预处理 时间复杂度 也就是说 我们排除这个预处理之后 直接就是降了10倍左右的复杂度 然后 给区间一
  • 敌兵布阵

    http acm hdu edu cn showproblem php pid 1166 Problem Description C国的死对头A国这段时间正在进行军事演习 所以C国间谍头子Derek和他手下Tidy又开始忙乎了 A国在海岸线
  • Mayor‘s posters(线段树染色)

    题目链接 Mayor s posters 2023 4 13 更新了代码 修复了错误的离散化长度 已在代码中注出 大致题意 有n个人依次贴海报 第i个海报的范围是 li ri 后面贴的海报会覆盖掉之前贴的海报 问 最终还能看到多少张海报 解
  • poj 2155 Matrix

    Problem poj org problem id 2155 vjudge net contest 146952 problem A Referencd www cnblogs com gj Acit p 3258880 html Mea
  • LeetCode-1827. 最少操作使数组递增【贪心,数组】

    LeetCode 1827 最少操作使数组递增 贪心 数组 题目描述 解题思路一 简单暴力 解题思路二 优化1 ans是操作数 mx是当前最大元素 mx无论如何会依次递增 解题思路三 优化2 遇到小的数就pre 1 否则变为num 题目描述
  • 二维线段树【模板——给出对应注释】

    闲话少说 直接看注释反而会更容易读懂这段二维线段树的模板 include
  • 线段树Segment tree(1):单点修改,区间查询

    问题描述 给定数列a 1 a 2 a N 依次进行Q次操作 操作有两类 1 i x 给定i x 将a i 加上x 2 l r 给定i x 求 i l r
  • +-字符串(简单贪心)

    字符串 时间限制 1000 ms 内存限制 65535 KB 难度 1 描述 Shiva得到了两个只有加号和减号的字符串 字串长度相同 Shiva一次可以把一个加号和它相邻的减号交换 他想知道最少需要多少次操作才能把第一个字符串变换成第二个
  • [POI2007]砝码Odw

    看这数据范围就不太可DP的样子 考虑贪心 首先注意到题目里有对于任意两个砝码其中一个是另一个质量整数倍的条件 所以砝码质量的种类不超过log INF 考虑按质量从小到大把砝码往容器里放 这样的话所有的砝码和容器的质量都可以除以当前砝码质量然

随机推荐

  • 用Tensorflow重现YOLO V4

    如果对Tensorflow实现最新的Yolo v7算法有兴趣的朋友 可以参见我最新发布的文章 Yolo v7的最简TensorFlow实现 gzroy的博客 CSDN博客 YOLO是一个非常出名的目标检测的模型 兼具精度和性能 在工业界的应
  • Virtual-Box Ubuntu 16.04 你应该这样来安装Chrome google 浏览器

    最近写一个项目需要用到ruby来进行开发 但是作为一个只能在windows pc 上来开发的程序员来说 固然需要在windows上做一堆的配置 已经把我搞的疯掉了 没钱买mac就只能VirtualBox上搭一个ubuntu来进行开发了 这里
  • Python多版本管理工具-pyenv相关总结

    由于需要进行MAC下多Python管理 看了很多相关文章 这是自己的理解的相关总结 包括最重要的pyenv 和 virtualenv anaconda有什么区别 文章目录 Python多版本管理工具 pyenv pyenv介绍 pyenv安
  • (2022)安卓和苹果应用注册上架概述

    目录 一 点击目录跳转对应文章 一 华为开发者申请及上架 二 小米开发者申请及上架 三 应用宝开发者申请及上架 四 OPPO开发者申请及上架 五 VIVO开发者申请及上架 六 苹果开发者申请及上架 开始前的准备工作 1 注册前先准备一个邮箱
  • 数据结构刷题:第十七天(基础)

    目录 一 杨辉三角 二 旋转图像 看题解 三 螺旋矩阵 一 杨辉三角 119 杨辉三角 II 力扣 LeetCode https leetcode cn problems pascals triangle ii plan data stru
  • python爬虫:抓取页面上的超链接

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库 它能够通过你喜欢的转换器实现惯用的文档导航 查找 修改文档的方式 Beautiful Soup会帮你节省数小时甚至数天的工作时间 页面上的超链接 在H
  • Tangram 2.0 VirtualView Demo 配置

    天猫开源了一个动态UI的方案 包含 https github com alibaba VirtualView iOS https github com alibaba tangram ios 简单来个Demo 1 常规创建工程 配置podf
  • nohup 后台启动程序,并输出到指定日志

    1 启动程序并输入到指定日志 nohup python manage py runserver 0 0 0 0 9090 gt data zyj xadstat xadstat log 2 gt 1 或者 nohup python mana
  • 企培版edusoho对接第三方云视频点播 最新版本代码披露 支持m3u8视频加密

    edusoho企培系列版本更新日志 新增功能和优化历史 倍数播放功能 视频分类 支持m3u8视频加密 plugins AliVideoPlugin DependencyInjection Configuration php
  • 零基础入门网络安全,收藏这篇不迷茫【2023 最新】

    零基础入门网络安全 收藏这篇不迷茫 2023 最新 前言 最近收到不少关注朋友的私信和留言 大多数都是零基础小友入门网络安全 需要相关资源学习 其实看过的铁粉都知道 之前的文里是有过推荐过的 新来的小友可能不太清楚 这里就系统地叙述一遍 0
  • Qt connect的实现原理

    概述 connect实质上是将对象A的信号和对象B的槽函数进行连接 然后返回一个句柄Connection 正文 下面通过源码来解析一下 注意看中文注释 connection表示信号槽连接句柄 QMetaObject Connection Q
  • 15. 从0开始学ARM-位置无关码

    目录 十九 位置无关码 一 为什么需要位置无关码 1 exynos 4412启动流程 二 怎么实现位置无关码 1 什么是 编译地址 什么是 运行地址 2 举例 3 代码 四 总结 1 位置无关码 2 位置相关码 3 位置无关码的应用 4 结
  • 动态实体类方案1.0(虚拟实体类生成器)[万能实体]

    该工具能实现任何实体类的动态生成传入参数名称自动生成get set方法 供反射调用 该方法生成的实体类是在程序运行过程动态生成加载出来的 实际代码文件并不存在 所以我暂定他为虚拟实体类生成工具 本方法我自己暂时用在mybatis中当统一的传
  • DETR源码学习(三)之损失函数与后处理

    在DETR模型中 在完成DETR模型的构建后 我们送入数据在完成前向传播后就需要使用预测值与真实值进行计算损失来进行反向传播进而更新梯度 在DETR模型中 其标签匹配采用的是匈牙利匹配算法 主要涉及models matcher py mod
  • 调用百度API实现人脸识别

    人脸识别 听着很高级 但实际上它确实很高级 不过对于我们开发人员来说 我们大部分人都是拿来主义 这次展示的是调用百度人脸识别API进行人脸信息分析 笔者试了下 发现还是挺准确的 而且代码量很少才8行 用的python 如果用java铁定不止
  • js拼接字符串与变量

    使用eval 方法可将拼接后的字符串与变量转变为变量 var field test 我是小白鼠一号 var field test 我是小白鼠二号 然后在JS里尝试将前面的语言简写当成变量 拼接后面的字符串 var lang field va
  • 含泪整理最优质Fbx 3d模型素材,你想要的这里都有

    今天小编针对Fbx 3d模型素材为大家整理了很多内容哦 肯定有需要的小伙伴吧 实用 免费 优质的素材谁又不心动呢 赶紧码住 接下来就给大家介绍一下我珍藏已久的网站 我的工作灵感都是来源它哦 里面的Fbx 3d模型资源数量多 种类丰富 并且每
  • Ubuntu16.04搭建Fabric1.4环境

    一 换源 为了提高下载速度 将ubuntu的源改成国内的源 推荐阿里云源和清华源 apt源保存在 etc apt sources list 代表根目录 etc 这个文件夹几乎放置了系统的所有配置文件 1 备份 sudo cp etc apt
  • shell基础+强化

    shell脚本 一 shell介绍 什么是shell shell功能 1 什么是shell shell是一个程序 采用C语言编写 是用户和Linux内核沟通的桥梁 它既是一种命令语言 又是一种解释性的编程语言 通过一个图标来查看以下设立了的
  • Codeforces 1469 F. Power Sockets —— 二分+线段树,贪心

    This way 题意 现在有一个根节点 和n条包含a i 个节点的链 一开始所有点的颜色是白色的 你每次可以做以下操作 找到树中某个白色节点 拿出一条链 将这个节点和链上某个节点连接 并且这两个点的颜色变成黑色 之后这条链属于树中一个部分