COCI2016-2017#1 Kralj

news2024/10/13 22:50:47

目录

  • COCI2016-2017#1 Kralj
    • 题目描述
      • 背景
      • 输入
      • 输出
      • 数据范围
    • 题解
      • 解法
    • 打赏

COCI2016-2017#1 Kralj

题目描述

背景

精灵王将 n n n个精灵编号为 1 , ⋯   , n 1 , \cdots , n 1,,n,矮人王将 n n n个矮人围成一个圆环,从某个矮人开始顺时针编号为 1 , ⋯   , n 1 , \cdots , n 1,,n
接着精灵王为每个精灵分配一个数字 a i a_i ai,表示将与其决斗的矮人编号,不同精灵分配到的数字可能相同
双方决定:

  1. 精灵王选出一个尚未确定对手的精灵,设其编号为 i i i
  2. 若编号为 a i a_i ai的矮人尚未确定对手,则将其作为这个精灵的对手,否则从编号为 a i a_i ai的矮人开始,选择沿圆环顺时针方向第一个尚未确定对手的矮人作为这个精灵的对手
  3. 重复以上步骤直到所有精灵及矮人都确定了对手
    精灵王知道所有精灵和矮人的力量,决斗时,力量大的一方获胜,它想知道通过规划选择精灵的顺序,最多能有多少精灵在决斗中获胜

输入

  1. 第一行一个整数 n n n
  2. 第二行 n n n个整数 a I a_I aI
  3. 第三行 n n n个整数 p i p_i pi,表示编号 i i i的矮人的力量值;
  4. 第四行 n n n个整数 v i v_i vi,表示编号 i i i的精灵的力量值

输出

一个整数,表示最多有多少精灵能在决斗中获胜

数据范围

1 ≤ n ≤ 5 e 5 , 1 ≤ a i ≤ n , 1 ≤ p i , v i ≤ 1 e 9 1 \le n \le 5e5 , 1 \le a_i \le n , 1 \le p_i , v_i \le 1e9 1n5e5,1ain,1pi,vi1e9

题解

解法

如果矮人没有围成一个圆环,而是排成一列,那么可以考虑贪心,对于第一个矮人,让分配到他且可以战胜他的精灵中力量值最小的与其决斗即可,若分配到他的精灵都不可以战胜他,那么让其中力量值最小的与其决斗即可,对于第二个矮人,需要在本来分配到他的精灵中再加上分配到第一个矮人却没有与其决斗的精灵,而后执行同样的贪心操作,并依此类推
但是围成一个圆环后,即使是第一个矮人也可能有精灵沿着顺时针方向继承到他这,所以需要找到真正的第一个矮人,也就是说这个矮人不可能有精灵沿着顺时针方向继承到他这
定义一个数组 n u m [ ] num[] num[] n u m [ i ] num[i] num[i]表示分配到编号 i i i矮人的精灵数量,求其前缀和得到 s u m [ ] sum[] sum[]
对于编号 i ( i > 1 ) i(i > 1) i(i>1)矮人,为使分配到编号 i − 1 i - 1 i1矮人的精灵不继承到他这,需满足 s u m [ i − 1 ] − s u m [ i − 2 ] ≤ 1 sum[i - 1] - sum[i - 2] \le 1 sum[i1]sum[i2]1,在此基础上,为使分配到编号 i − 1 i - 1 i1 i − 2 i - 2 i2矮人的精灵不继承到编号 i i i矮人处,还需满足 s u m [ i − 1 ] − s u m [ i − 3 ] ≤ 2 sum[i - 1] - sum[i - 3] \le 2 sum[i1]sum[i3]2
依此类推,为使分配到编号 i − 1 , i − 2 , ⋯   , 1 i - 1 , i - 2 , \cdots , 1 i1,i2,,1矮人的精灵不继承到编号 i i i矮人处,需满足 s u m [ i − 1 ] − s u m [ i − 2 ] ≤ 1 , ⋯   , s u m [ i − 1 ] − s u m [ 0 ] ≤ i − 1 sum[i - 1] - sum[i - 2] \le 1 , \cdots , sum[i - 1] - sum[0] \le i - 1 sum[i1]sum[i2]1,,sum[i1]sum[0]i1,任取其中一式记作 s u m [ i − 1 ] − s u m [ k ] ≤ i − 1 − k ( 0 ≤ k ≤ i − 2 ) sum[i - 1] - sum[k] \le i - 1 - k(0 \le k \le i - 2) sum[i1]sum[k]i1k(0ki2),移项得 s u m [ i − 1 ] − ( i − 1 ) ≤ s u m [ k ] − k ( 0 ≤ k ≤ i − 2 ) sum[i - 1] - (i - 1) \le sum[k] - k(0 \le k \le i - 2) sum[i1](i1)sum[k]k(0ki2)
在此基础上,为使分配到编号 n , ⋯   , i + 1 n , \cdots , i + 1 n,,i+1矮人的精灵不继承到编号 i i i矮人处,同理,任取需满足的式子中一式记作 s u m [ i − 1 ] + s u m [ n ] − s u m [ k ] ≤ i − 1 + n − k ( i ≤ k ≤ n − 1 ) sum[i - 1] + sum[n] - sum[k] \le i - 1 + n - k(i \le k \le n - 1) sum[i1]+sum[n]sum[k]i1+nk(ikn1),移项得 s u m [ i − 1 ] − ( i − 1 ) ≤ s u m [ k ] − s u m [ n ] + n − k sum[i - 1] - (i - 1) \le sum[k] - sum[n] + n - k sum[i1](i1)sum[k]sum[n]+nk,又 s u m [ n ] = n sum[n] = n sum[n]=n,所以得 s u m [ i − 1 ] − ( i − 1 ) ≤ s u m [ k ] − k ( i ≤ k ≤ n − 1 ) sum[i - 1] - (i - 1) \le sum[k] - k(i \le k \le n - 1) sum[i1](i1)sum[k]k(ikn1)
综上所述,需满足 s u m [ i − 1 ] − ( i − 1 ) ≤ s u m [ k ] − k ( 0 ≤ k ≤ i − 2 , i ≤ k ≤ n − 1 ) sum[i - 1] - (i - 1) \le sum[k] - k(0 \le k \le i - 2 , i \le k \le n - 1) sum[i1](i1)sum[k]k(0ki2,ikn1),又因为 s u m [ 0 ] − 0 = 0 = s u m [ n ] − n sum[0] - 0 = 0 = sum[n] - n sum[0]0=0=sum[n]n,所以 1 ≤ k ≤ i − 2 , i ≤ k ≤ n 1 \le k \le i - 2 , i \le k \le n 1ki2,ikn
因此 s u m [ i ] − i sum[i] - i sum[i]i最小时对应的 i + 1 i + 1 i+1即为真正的第一个矮人,从该矮人开始应用贪心即可
可以使用 v e c t o r vector vector数组记录分配到每个编号的矮人的精灵的力量值,从真正的第一个矮人开始依次贪心时,使用 m u l t i s e t multiset multiset记录可以与当前矮人对决的精灵的力量值分别是多少
代码如下:

#include<cstdio>
#include<vector>
#include<set>

using namespace std;

#define il inline

const int M = 5e5 + 5;

int n;
int sum[M], a[M], p[M];
vector<int> vec[M];
int mnn = M, pos, ans;
multiset<int> S;

il int read() {
    int x = 0;
    char c = getchar();
    while(c < '0' || c > '9') c = getchar();
    while(c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
    return x;
}

int main() {
    n = read();
    for(int i = 1; i <= n; ++i) ++sum[a[i] = read()];     //为了方便,把num和sum合成了一个
    for(int i = 1; i <= n; ++i) p[i] = read();
    for(int i = 1; i <= n; ++i) vec[a[i]].push_back(read());

    for(int i = 1; i <= n; ++i)
        if((sum[i] += sum[i - 1]) - i < mnn) mnn = sum[i] - i, pos = i;     //pos就是解法中最后的i

    int i = pos = ++pos > n ? 1 : pos;     //使pos变为解法中最后的i + 1
    do {
        for(const int& v: vec[i]) S.insert(v);
        auto it = S.lower_bound(p[i]);
        if(it != S.end()) S.erase(it), ++ans;
        else S.erase(S.begin());
        ++i> n ? i = 1 : 1;     //其实就是一个if,最后的1占个位置
    } while(i != pos);

    printf("%d", ans);

    return 0;
}

打赏

制作不易,若有帮助,欢迎打赏!
赞赏码

支付宝付款码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql高级篇(中)——SQL性能分析

Mysql高级篇&#xff08;中&#xff09;—— SQL性能分析 一、&#xff08;了解&#xff09;MySQL Query Optimizer 的主要功能和原理二、&#xff08;了解&#xff09;MySQL 常见瓶颈三、关键字 EXPLAIN1、是什么2、基本语法3、EXPLAIN 执行信息详解&#xff08;1&#xff09…

Windows--linux共享文件夹

1、如果共享文件夹设置在Windows上面 文件夹设置 个人家里电脑通常不设置用户名密码 linux端mount命令行 mount -t cifs -o usernamewade,vers3.0 //192.168.0.143/openvswitch-2.17.10 /root/windows

计算机专业选题推荐-基于python的岗位兼职招聘平台【python-爬虫-大数据定制】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的岗位兼职招聘平…

我的第3个AI项目-Advanced RAG with Gemma, Weaviate, and LlamaIndex

目录 一、项目简介概述时间kaggle地址&#xff08;代码和详细注解&#xff09;主要工作和收获技术栈数据集结果 二、bug修复在 Kaggle 使用模型时需要先同意该模型的使用条款使用 GPU 时显存不足把 Weaviate 从V3升级到V4改动一&#xff1a;创建client改动二&#xff1a;判断某…

网络编程day02(字节序、TCP编程)

目录 【1】字节序 1》大小端转换 2》端口转换 3》IP地址转换 主机字节序转换为网络字节序 &#xff08;小端序->大端序&#xff09; 网络字节序转换为主机字节序&#xff08;大端序->小端序&#xff09; 【2】TCP编程 1》流程 2》函数接口 1> socket 2> …

免费的 Mac 应用清理工具Pearcleaner v3.8.6

免费的 Mac 应用清理工具。这是一款免费开源的 Mac 应用清理工具&#xff0c;能够彻底卸载应用并清理残留文件。它采用 SwiftUI 开发&#xff0c;提供了简单易用的界面&#xff0c;支持右键卸载、迷你模式和 Homebrew 清理等功能。 下载链接&#xff1a;https://pan.quark.cn/s…

【Visual Studio 报错】vs 在使用二进制写入文件时弹窗报错:使用简体中文 gb2312 编码加载文件

如以下报错 解决办法 解决方法&#xff1a;文件->高级保存选项->将文件编码形式改为“UTF-8带签名” 若找不到高级保存选项&#xff0c;可以跟着下面路径把该选项调出来 &#xff1a;工具->自定义->命令->菜单栏中改成文件->预览右边点添加命令->类别中…

BRAM IP Native模式使用

简介 BRAM&#xff08;‌Block RAM&#xff09;是‌FPGA&#xff08;Field-Programmable Gate Array&#xff09;中的一种专用RAM资源&#xff0c;固定分布在FPGA内部的特定位置。该内容主要对BRAM&#xff08;Block RAM”的缩写&#xff09;Native模式下IP界面做详细描述和使用…

C语言进阶版第9课—指针(3)

文章目录 1. 字符指针变量2. 数组指针变量3. 二维数组传参的本质4. 函数指针变量5. typedef关键字6. 函数指针数组7. 函数指针数组的应用—转移表 1. 字符指针变量 练习题 2. 数组指针变量 在学习数组指针前&#xff0c;我们先回忆一下什么是指针数组指针数组 → 存放指针的数…

基于单片机的人脸识别的智能门禁系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单核心代码具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等…

Unity Addressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统&#xff0c;并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址&#xff08;Addressable&#xff09;时&#xff0c;您可以使用该资源的地址从任何地方加载它。无论资源是在…

【C++ Primer Plus习题】14.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

【PWN · 栈溢出 | GOT劫持】[2024 · 长城杯]consumption

通过代码审计&#xff0c;找到栈溢出漏洞点&#xff0c;覆盖关键栈变量&#xff0c;实现任意地址写 前言 本题主要是套壳了Cjson&#xff0c;实则是约定了输入格式。通过仔细代码审计&#xff0c;即可找到栈溢出&#xff0c;并实现利用 一、题目 查阅网上资料&#xff0c;得知…

如何提取视频中的音频?新手也能轻松搞定

在数字媒体处理中&#xff0c;从视频文件中提取音频是一个常见需求。无论你是希望为视频制作单独的音频版本&#xff0c;还是想将某段视频的背景音乐用于其他项目&#xff0c;掌握音频提取技术都至关重要。本文将详细介绍几种提取视频中音频的方法&#xff0c;帮助你轻松实现这…

【自考zt】【软件工程】【21.04】(部分)

一、单选 二、填空 三、简答 四、应用 小结&#xff1a;

DeepSeek缓存命中技术,成本降低10倍

DeepSeek系列升级&#xff1a; DeepSeek发布最新的缓存命中技术&#xff0c;有效降低成本至0.1元/百万tokens&#xff0c;适用于文件读取和固定提示词。 点评&#xff1a;由于token消耗大部分是在系统提示词中&#xff0c;妥善使用确实可以极大降低成本&#xff0c;同时还能保证…

音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

ssm微信小程序校园失物招领论文源码调试讲解

第二章 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于20…

[git操作] git创建仓库上传github报错

操作流程如下 使用 git init使用 git remote add origin 项目ssh链接git add . 报错如下 Bus error (core dumped)然后执行任何别的操作都会报错&#xff1a; fatal: Unable to create path .. /.git/index.lock: File exists.Another git process seems to be running in …

​全国计算机软件中级资料分享

全国计算机软件中级资料分享 软考资料分析 软件设计师中间 免费资料 链接:https://pan.baidu.com/s/1GqbgIq_D0uZd-uuhIhG-Sg?pwd2atp 提取码:2atp 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 求个免费关注不过分吧。