#倍增 #国旗计划

news2024/11/17 13:24:55

文章目录

  • 题目:
  • 题解
  • 代码

题目:

国旗计划

题解

三个技巧:

  1. 断环成链:
    具体而言就是:

if(w[i].R < w[i].L)
w[i].R += m;
m是环的长度;

  1. 贪心:
    选择一个区间i后,下一个区间只能从左端小于等于i的右端点的区间中选。
    但是每次都往后遍历n次的话,时间复杂度就是O(n2),超时。
  2. 倍增
    为了高效进行查询,参考ST算法,预设好一些“跳板”,快速找到后面的区间。
    定义go[s][i],表示从第s个区间出发,走2i个最优区间后到达的区间。
    说人话就是:从s到s + 2i之间,最大的满足条件的左端点的值。
    这个操作的时间复杂度是O(nlogn)。
    肝了一个晚上,将自己遇到的几个难点说一下:
    第一个是关于狗函数,我们设从当前区间到下一合法区间为一次,那么我们要跳好多好多次……
    为了简便运算,我们利用倍增的思想进行快速跳跃,狗就是拿来这么用的。

以上所有的操作是O(nlogn) + O(nlogn)次,完全不会超时。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 10;
int n, m;
struct wa
{
    int id, L, R;
}W[maxn * 2];

bool operator < (wa &a, wa &b)
{
    return a.L < b.L;
}

int n2;
//狗函数表示从第s个区间出发,走2^i个区间到达的区间
int go[maxn][20];
//神奇的预处理……尤其是那个什么狗(go)数组,麻烦死了
void init()
{
    //先用nxt找到下一个位置要到哪里?
    int nxt = 1;
    for(int i = 1; i <= n2; i ++)
    {
        //但下一个位置还在范围之内的时候,且下一个位置的L不超过i的R;
        //至于nxt为什么不用刷新,那是因为这个数列具有单调性,无论是L还是R
        while(nxt <= n2 && W[nxt].L <= W[i].R) nxt ++;
        go[i][0] = nxt - 1;
    }
    //长度
    for(int i = 1; (1 << i) <= n; i ++)
        //起点
        for(int s = 1; s <= n2; s ++)
            go[s][i] = go[go[s][i - 1]][i - 1];
}
int res[maxn];
//从第x个战士开始的话,目标战士就一定会被包含在里面了。
void getans (int x)
{
    //len是战士的L加一圈,用来防止R自己跑了一圈,cur是当前战士的位置,ans就是人数咯
    int len = W[x].L + m, cur = x, ans = 1;
    //i从大往小枚举,代表
    for(int i = log2(maxn); i >= 0; i --)
    {
        //然后就是大步大步地跳,跳到的位置没有超过len就是合法的跳
        int pos = go[cur][i];
        //首先往右夸那么多步的区间要存在
        //其次是这个区间的R小于限制
        //最后一点,先不要越过起点的左端点,最后补上;
        //因为我们不确定是不会还有兄贵守着更小的区间,有的话是不能结束的,所以一定要走到i=0。
        if(pos && W[pos].R < len)
        {
            //这中间跳过了2^i个人,要加上。
            ans += 1 << i;
            //然后将标记打到新的人身上。
            cur = pos;
        }
    }
    //最后答案加1
    res[W[x].id] = ans + 1;
}

int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++)
    {
        W[i].id = i;
        scanf("%d %d", &W[i].L, &W[i].R);
        //要是R比L小,那就将R加一圈,变成R+m;
        if(W[i].R < W[i].L) W[i].R += m;
    }
    //按照L进行排序,当然,按照R进行排序也可以
    sort(W + 1, W + n + 1);
    n2 = n;
    //拆成链,所有的都往后延长一遍
    for(int i = 1; i <= n; i ++)
    {
        n2 ++;
        W[n2] = W[i];
        W[n2].L = W[i].L + m;
        W[n2].R = W[i].R + m;
    }
    init();
    //逐个计算每个战士。
    for(int i = 1; i <= n; i ++) getans(i);
    for(int i = 1; i <= n; i ++) printf("%d ", res[i]);
    return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

(c++)类和对象中篇

目录 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 1. 类的 6 个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并…

线性绘制在NSDT 3D场布中的应用

什么是线性摆放&#xff1f; 线性摆放是指将一系列对象按照直线或者曲线进行排列&#xff0c;形成一条线或者弧线状的布局方式。在3D场布中&#xff0c;线性摆放可以应用于多个领域和场景&#xff0c;如展览设计、景观规划、商业空间布置等。 线性绘制在3D场布中的应用 展览设…

Postman全局配置变量token

Postman全局配置变量token 这里主要是介绍在 Postman 中全局配置token&#xff0c;以及方便以后查阅&#xff01;&#xff01;&#xff01; 一、简介 用户在开发或调试网络程序和网页B/S模式的程序时需要一些方法来跟踪网页请求&#xff0c;可使用一些网络的监视工具如Firebu…

多线程详解(下)

文章目录 常见锁策略乐观锁 vs 悲观锁重量级锁 vs 轻量级锁自旋锁 vs 挂起等待锁读写锁可重入锁 vs 不可重入锁公平锁 vs 非公平锁面试相关题 CAS什么是CASCAS 是怎么实现的CAS 有哪些应用1)实现原子类2)实现自旋锁 CAS的ABA问提什么是ABA问提ABA问提引来的BUG解决方法 相关面试…

基于LLMs构建产业多智能体

前言 随着信息技术的发展以及产业数字化的发展&#xff0c;在产业端&#xff0c;信息系统的建设和应用场景的搭建日渐完善&#xff0c;如何从完备的业务系统中挖掘数据价值以及如何从业务互联走向数据驱动决策成为产业数字化的新发展阶段。目前主要由数据中台承担数据汇聚、数…

Kettle安装初始化问题

1、Kettle启动闪退: 原因&#xff1a;自己的JDK是16 8.0的Kettle适配JDK1.8 【Spoon.bat 双击后闪退】解决办法 - 知乎 2、KettleDB连接中文命名 Unexpected problem reading shared objects from XML file : null Error reading information from input stream Invalid …

解读未知--文档图像大模型的探索与应用

前言&#xff1a; 近日&#xff0c;合合信息在多模态大模型与文档图像智能理解专题论坛上进行了分享。多模态大模型指的是能够处理多种语义信息的一种深度学习模型。文档图像智能理解则是指对文档和图像进行智能化解析和理解的技术。合合信息在这个领域的分享&#xff0c;无疑将…

PHP 变动:PHP 8 版本下字符串与数值的弱比较

文章目录 参考环境声明弱比较隐式类型转换字符串连接数学运算布尔判断相等运算符 字符串与数值的弱比较字符串转化为数值的具体规则字符串与数值的弱比较一般情况科学计数法前缀 0E 与 0e PHP8 在字符串与数值的弱比较方面做出的改动数值字符串优化 参考 项目描述搜索引擎Bing…

栈的应用(C++,进制转化、括号匹配)

十进制转化八进制&#xff0c;利用栈 #include<iostream>//十进制转八进制&#xff0c;利用栈 using namespace std; typedef struct stack {int data;stack* next; }stack, * linkstack; void Initstack(linkstack& s) {s NULL; } int Emptystack(linkstack s) {i…

华为云云耀云服务器L实例评测|基于开源库 Stable Diffusion web UI部署AI绘画应用

前言 随着云计算时代的进一步深入&#xff0c;越来越多的中小企业企业与开发者需要一款简单易用、高能高效的云计算基础设施产品来支撑自身业务运营和创新开发。基于这种需求&#xff0c;华为云焕新推出华为云云服务器实例新品。 华为云云服务器具有智能不卡顿、价优随心用、…

整合minio时出现的错误

Action:Correct the classpath of your application so that it contains compatible versions of the classes io.minio.S3Base and okhttp3.RequestBody 这个错误是我在整合minio时报的错&#xff0c;说实话遇到这个错误我还是很头大的&#xff0c;因为之前在springboot项目…

代码随想录算法训练营 动态规划part12

一、最佳买卖股票时机含冷冻期 309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; public class Solution {public int maxProfit(int[] prices) {int len prices.length;if (len < 2) {return 0;}int[] dp new int[3];dp[0] 0;dp[1] -price…

使用Packet Tracer了解网络模型及Lab3 - 1

协议数据单元PDU&#xff08;Protocol Data Unit&#xff09;是指对等层次之间传递的数据单位。协议数据单元(Protocol Data Unit )物理层的 PDU是数据位&#xff08;bit&#xff09;&#xff0c;数据链路层的 PDU是数据帧&#xff08;frame&#xff09;&#xff0c;网络层的PD…

C语言习题

目录 1、数9的个数 2、分数求和 3、求最大值 4、乘法口诀表 4.1、题目内容:在屏幕上输出9*9乘法口诀表 4.2、题目内容:实现一个函数&#xff0c;打印乘法口诀表&#xff0c;口诀表的行数和列数自己指定如:输入9&#xff0c;输出9*9口诀表&#xff0c;输出12&#xff0c;输出12*…

PN结与二极管的特性

PN结的伏安特性 PN结的正向特性 PN结加正向电压时&#xff0c;P区电位高于N区点位&#xff0c;扩散电流大于漂移电流&#xff0c;PN结呈低阻性。 PN结的反向特性 PN结加反向电压时&#xff0c;P区电位低于N区电位&#xff0c;内电场对于扩散运动起到抑制作用&#xff0c;少…

带网络变压器的RJ45网口连接器/集成RJ45网口连接器

​ Hqst华强盛(华轩盛)导读&#xff1a;带网络变压器的RJ45是一种常见的网络连接器&#xff0c;它包含了一个RJ45接口和一个网络变压器&#xff0c;网络变压器位于RJ45接口内部&#xff0c;可以将数据信号转换为适合以太网传输的信号&#xff0c;并具有隔离电路和滤波电…

解决模型半透明时看到内部结构的问题

大家好&#xff0c;我是阿赵。   之前在做钢铁侠线框效果的时候&#xff0c;说到过一种技术&#xff0c;这里单独拿出来再说明一下。   我们经常要做一些模型半透明效果&#xff0c;比如这个钢铁侠的模型&#xff0c;我做了一个Rim边缘光的效果&#xff0c;边缘的地方亮一点…

Python|OpenCV-访问并修改图片像素值,鉴别彩色和灰色图像(6)

前言 本文是该专栏的第6篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV对图像进行操作的时候,通常需要熟练掌握一些Numpy知识点。因为有的时候需要用到Numpy和OpenCV结合去实现图像的操作,所以说想要写出较好的OpenCV代码的最好方法,就需要有Nump…

【Verilog 教程】5.2Verilog 模块例化

关键字&#xff1a;例化&#xff0c;generate&#xff0c;全加器&#xff0c;层次访问 在一个模块中引用另一个模块&#xff0c;对其端口进行相关连接&#xff0c;叫做模块例化。模块例化建立了描述的层次。信号端口可以通过位置或名称关联&#xff0c;端口连接也必须遵循一些规…

注解,自定义注解

一、什么是注解 二、自定义注解 /*** 自定义注解*/public interface MyAnnotation {String aaa();boolean bbb() default true;String ccc(); }MyAnnotation ( aaa "牛魔王",ccc "sss") public class Test {MyAnnotation ( aaa "aaa",ccc &q…