首页 > 其他分享 >[Ynoi2000] pri

[Ynoi2000] pri

时间:2024-01-23 23:34:19浏览次数:28  
标签:Ynoi2000 frac log 复杂度 分治 pri 等价 每个

问题等价于区间翻转区间顺序对数,显然没有复杂度比较好的做法。

将操作序列每 \(B\) 个分一组,对每组进行处理。

\(B\) 个操作会将序列划分为 \(B\) 个连续段,在每次操作后都是连续段的一个排列,以及每个连续段内部可能翻转。我们称每个连续段为一个等价类

将值域按 \(C\) 大小分块。考虑如下三类贡献:

  • 每段内部的顺序对 \((i,j)\) 数。
  • 属于同一个值域块、不属于同一个段的 \((i,j)\)。
  • 不属于同一个值域块、不属于同一个段的 \((i,j)\)。

对于第一类,预处理 \(O(n\log n)\) 求出每个连续段内部的顺序对数。

对于第二类,只有 \(O(nC)\) 个 \((i,j)\),预处理这些 \((i,j)\) 属于哪两个块。

接下来考虑对操作序列进行分治,并建立分治结构。

分治到一个操作序列区间 \(q_l,\cdots,q_r\) 时,有若干个等价类会合并,只会有 \(O(len)\) 个等价类。

对于当前分治区间,设当前区间长度为 \(k\),要维护的信息是:

  • 每个等价类内部的顺序对个数。(\(O(k)\) 个信息)
  • 每个等价类中,在每个值域块中的数个数。(\(O(k\frac{n}{C})\) 个信息)
  • 对于上面的第二类的 \(O(nC)\) 个 \((i,j)\),记录这些 \((i,j)\) 属于哪两个块,记录每两个块间的 \((i,j)\) 个数。(\(O(k^2)\) 个信息)

类似 TB5x,从最少的等价类开始,依次构造出每个区间的等价类,即从分治的叶子节点开始构造。

每个操作对于坐标的修改是一个由两个连续段构成的排列,第一段进行了翻转。

而由 \(x\) 个连续段构成的排列复合一个由 \(y\) 个连续段构成的排列最多得到 \(x+y\) 段。

先进行分治建树,每次合并时,通过左右儿子区间的排列求出当前点的排列,同时可以求出当前排列的每一段(即每个等价类)对应了左右儿子的哪个等价类,以及当前的每一段是否被翻转。这部分复杂度 \(O(B\log B)\)。

然后从上到下分治,每次从 \(q_l,\cdots,q_r\) 移动到 \(q_l,\cdots,q_{mid}\) 和 \(q_{mid+1},\cdots,q_r\),会发生等价类的合并。此时可以计算贡献,来维护上面的三类信息。由于已经得到了等价类的对应关系,这部分是容易的:

  • 对于原来的三类信息,可以直接累加。
  • “每个等价类内部的顺序对个数”会增加,但由于只要考虑不属于同一个值域块、不属于同一个段的 \((i,j)\),只需要对 \(O(k\frac{n}{C})\) 的信息做前缀和,就可以计算。

分治到叶子节点时,取第一个区间的内部的顺序对个数信息,就得到了答案。

复杂度 \(T(k) = 2T(\frac{k}{2}) + O(k^2+k\frac{n}{C})\),于是处理一块的复杂度为 \(O(B^2 + B\log B\frac{n}{C})\)。

加上之前的 \(nC\),总复杂度 \(O(\frac{m}{B}(nC + B^2 + B\log B\frac{n}{C}))\)。

取 \(B=n^{2/3}\log^{1/3} n,C=n^{1/3}\log^{2/3} n\) 得到最优复杂度 \(O(mn^{2/3}\log^{1/3} n)\)。

标签:Ynoi2000,frac,log,复杂度,分治,pri,等价,每个
From: https://www.cnblogs.com/Rainbowsjy/p/17983663

相关文章

  • router4j--SpringCloud动态路由利器
    前言本文介绍Java的动态路由中间件:router4j。router4j用于SpringCloud项目,它可以将某个url请求路由到指定的机器上,也可以将所有请求强制转到指定机器。问题描述Java后端在开发SpringCloud项目时如果同一个应用起了多个实例,会遇到以下问题:无法将指定url请求强制转到个人电脑。这样会......
  • 二、SpringCloud Alibaba之nacos
    2.1、环境搭建SpringCloudAlibaba的帮助文档地址:https://github.com/alibaba/spring-cloud-alibaba中的wiki在spring的官网中也有springcloudalibaba:https://spring.io/projects/spring-cloud-alibaba2.1.1、分支版本SpringCloudAlibabaVersionSpringCloudVers......
  • 搞起来,使用 SpringBoot 框架徒手撸一个安全、可靠的本地缓存工具
    在实现本地缓存的时候,我们经常使用线程安全的ConcurrentHashMap来暂存数据,然后加上SpringBoot自带的@Scheduled定时刷新缓存。虽然这样可以实现本地缓存,但既不优雅也不安全。那看一下我的思路,首先看一张图!1.每个处理器都有缓存名字、描述信息、缓存初始化顺序等信息,所以应该定义一......
  • 策略模式【结合springboot实现】
    Hello!~大家好啊,很高兴我们又见面了,今天我们一起学习设计模式–【策略模式】初次对此模式不懂的,或者想偷懒的,我强烈建议大家跟着我的一起把概念和代码一起敲一遍!~为啥子??因为我就是这样学会的,哈哈哈!1.首先我们看下此模式的整体UML图selector:选择器又叫做上下文conte......
  • SpringSecurity-手机号+短信验证码登陆
    与验证码登录逻辑是不一样的,所以不能使用SpringSecurity默认提供的那套逻辑;需要自个去写一个自定义身份认证逻辑短信验证码生成生成验证码短信验证码类ValidateCode是父类,ImageCode子类publicclassValidateCode{privateStringcode;/***过期时间......
  • 如何查找SpringBoot应用中的请求路径(不使用idea)
    背景昨天有个同事向我咨询某个接口的物理表是哪个,由于公司业务较多、这块业务的确不是我负责的,也没有使用idea不能全局搜索(eclipse搜不到jar内的字符串),也就回复了不清楚。除了自己写代码输出servlet的路径和类外,发现了一个我之前没用过的方法:SpringBootActuator,分享给大家。......
  • SpringBoot可视化接口开发工具magic-api
    magic-api简介magic-api是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象。在SpringBoot中使用1、添加magic-api相关依赖<!--接口快速开发框架 magic-api--><depen......
  • SpringBoot实现RequestBodyAdvice和ResponseBodyAdvice接口
    SpringBoot提供了一种机制,允许开发者在请求体(RequestBody)和响应体(ResponseBody)被处理之前和之后执行自定义逻辑。这通过RequestBodyAdvice和ResponseBodyAdvice接口实现。RequestBodyAdvice:此类用于在请求体被处理之前执行自定义逻辑。例如,你可以使用它来解析请求体,或者......
  • Spring Security 认证,登陆拦截体验
    使用SpringSecurity框架之前,我们的应用api是谁都可以访问的引入SpringSecurity之前的SpringBoot应用1.创建一个Springbootapplication,有如下apiimportorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestCo......
  • SpringBoot是什么
    SpringBoot帮我们简单、快速地创建一个独立的、生产级别的Spring应用(说明:SpringBoot底层是Spring)大多数SpringBoot应用只需要编写少量配置即可快速整合Spring平台以及第三方技术特性:快速创建独立Spring应用SSM:导包、写配置、启动运行直接嵌入Tomcat、J......