首页 > 其他分享 >洛谷题单指南-分治与倍增-P3509 [POI2010] ZAB-Frog

洛谷题单指南-分治与倍增-P3509 [POI2010] ZAB-Frog

时间:2024-09-24 18:12:53浏览次数:9  
标签:窗口 int 洛谷题 POI2010 ZAB ne 距离 long 端点

原题链接:https://www.luogu.com.cn/problem/P3509

题意解读:n个点,每个点上有一只青蛙每次跳到距离自己第k近的点,m次之后跳到哪个点。

解题思路:

1、计算距离每个点第k近的点,存入ne[N]

给定一个点i,距离i第k近的点一定在长度为k+1个点的窗口内,窗口包括i

并且,第k近的点只能是左端点或者右端点,取距离i较远者

当右端点下一个点距离i比i到左端点距离还小,窗口需要右移一位

因此,整个过程可以用双指针来实现

int l = 1, r = k + 1;
for(int i = 1; i <= n; i++)
{
    while(r + 1 <= n && a[r + 1] - a[i] < a[i] - a[l]) l++, r++;
    if(a[r] - a[i] > a[i] - a[l]) ne[i] = r;
    else ne[i] = l;
}

2、计算每个点跳m次之后到达的点

如果直接枚举,必然会超时,可以借助倍增思想,通过快速幂的模型来调m次

while(m)
{
    if(m & 1) 更新每个点跳到ne[i];
    m = m >> 1;
    更新ne[i]到ne[ne[i]];
}

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1000005;

long long n, k, m;
long long a[N];
int ne[N]; //ne[i]表示第i个位置的下一个位置,也就是距离i第k近的点
int ne2[N]; //防止ne数组被覆盖而定义一个滚动数组
int ans[N];

int main()
{
    cin >> n >> k >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];

    //计算ne[],双指针控制窗口滑动,距离a[i]第k近的点一定在连续k+1个点的两端,取距离a[i]较远的那一个
    //但如果右端点的下一个位置距离a[i]小于a[i]到左端点距离, 窗口向右滑动
    int l = 1, r = k + 1;
    for(int i = 1; i <= n; i++)
    {
        while(r + 1 <= n && a[r + 1] - a[i] < a[i] - a[l]) l++, r++;
        if(a[r] - a[i] > a[i] - a[l]) ne[i] = r;
        else ne[i] = l;
    }

    //初始位置
    for(int i = 1; i <= n; i++) ans[i] = i;

    //倍增跳m次,快速幂模型
    while(m)
    {
        if(m & 1) 
        {
            for(int i = 1; i <= n; i++) ans[i] = ne[ans[i]];
        }
        m = m >> 1;
        memcpy(ne2, ne, sizeof(ne)); //复制ne到ne2
        for(int i = 1; i <= n; i++) ne[i] = ne2[ne[i]];// //ne2是在ne基础上连续跳两次,循环中ne会被覆盖,ne2起到滚动数组的作用
    }

    for(int i = 1; i <= n; i++) cout << ans[i] << " ";

    return 0;
}

 

标签:窗口,int,洛谷题,POI2010,ZAB,ne,距离,long,端点
From: https://www.cnblogs.com/jcwy/p/18429754

相关文章

  • 轻松部署!龙蜥操作系统安装Zabbix7.0详细教程​
    龙蜥操作系统(AnolisOS)作为龙蜥社区发行的开源Linux发行版,以其稳定、高性能、安全、可靠和100%兼容CentOS8软件生态的特点,成为众多企业和开发者的首选操作系统。它不仅支持多计算架构,如X86、ARM、RISC-V等,还针对云端场景进行了优化,为云上典型场景带来显著的性能提升和故障率降低。......
  • 轻松部署!龙蜥操作系统安装Zabbix7.0详细教程
    龙蜥操作系统(AnolisOS)作为龙蜥社区发行的开源Linux发行版,以其稳定、高性能、安全、可靠和100%兼容CentOS8软件生态的特点,成为众多企业和开发者的首选操作系统。它不仅支持多计算架构,如X86、ARM、RISC-V等,还针对云端场景进行了优化,为云上典型场景带来显著的性能提升和故障率降低......
  • zabbix安装部署
    一、环境准备#需要提前安装PHP、MySQL、nginx服务#下载zabbix安装包zabbix-7.0.2.tar.gz二、安装部署2.1、安装zabbix.sh#!/bin/bashinstall_zabbix(){version='7.0.2'user=zabbixecho"#####检测网络#####"if!ping-c1-W1www.baidu.com&>/dev/nu......
  • zabbix“专家坐诊”第256期问答
    原作者:乐维社区原文链接:https://forum.lwops.cn/questions问题一Q:zabbix6.4.18版本的,使用zabbix_agentd2监控mysql数据库,只能在界面配置mysql的相关信息吗?这个在zabbix表里面是明文存储的?A:指的是宏值的信息配置加填写吗,要在对应模板配置Q:是的,是的,只能从界面配置吗?从界面配置的,在za......
  • 洛谷题单指南-分治与倍增-P2345 [USACO04OPEN] MooFest G
    原题链接:https://www.luogu.com.cn/problem/P2345题意解读:有n头牛,每头牛都有听力v、坐标x两个属性,要计算每两头牛的max{vi​,vj​}×∣xi​−xj​∣之和。解题思路:首先想到的肯定是枚举法,需要O(n^2)的复杂度有没有优化的方法?可以采用分治法!由于是计算两头牛之间的max{vi​,......
  • 洛谷题单指南-分治与倍增-P2415 集合求和
    原题链接:https://www.luogu.com.cn/problem/P2415题意解读:计算集合所有子集中元素之和。解题思路:集合的特性:互异性,元素各不相同来看样例:23,可以组成的子集有空23232和3都出现2次再比如:123,可以组成的子集有空12312 13231231,2,3各出现4次由于在集合中......
  • 案例分享:Zabbix和AI在电信数据监控领域的融合实践
    当今数字化时代,数据监控与人工智能(AI)的融合已成为企业运营的重要组成部分,这种协作不仅提高了数据处理的效率,还增强了决策的准确性和实时性。数据监控系统通过实时收集和分析大量数据,帮助企业洞察业务流程和系统性能。随着技术的进步,这些系统已经从简单的日志记录和警报系统,发展到能......
  • 洛谷题单指南-分治与倍增-P7167 [eJOI2020 Day1] Fountain
    原题链接:https://www.luogu.com.cn/problem/P7167题意解读:从喷泉任意一个圆盘倒水,水流经的圆盘直径必须递增,水最后流到哪个圆盘。解题思路:1、枚举法有30%的数据范围在N<=1000,Q<=1000,因此枚举也可以得到30分。可以通过单调栈预计算每个圆盘后面第一个直径更大的圆盘位置Next[......
  • Zabbix分布式监控系统
    一、案例分析1.规划节点IP主机名节点192.168.203.11zabbix-serverServer节点192.168.203.12zabbix-agentAgent节点2.基础准备使用提供的CentOS_7.2_x86_64_XD.qcow2镜像,flavor使用4vCPU/8GB内存/100GB硬盘创建云主机。Yum源使用提供的zabbix文件夹。二......
  • Zabbix-Scheduled reports - Cannot connect to web service
    最近使用zabbix创建SchedulReport,完成相关配置进行测试时,总是提示创建失败:Cannotconnecttowebservice:couldn'tconnecttoserverCannotconnecttowebservice:couldn'tconnecttoserver而且执行cat/var/log/zabbix/zabbix_web_service.log查看zabbix_web_ser......