首页 > 其他分享 >浅谈一类信息的暴力重构手法

浅谈一类信息的暴力重构手法

时间:2023-05-18 22:13:26浏览次数:48  
标签:重构 结点 log 暴力 复杂度 势能 pop 浅谈

loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月

背包支持类似栈的加入与撤销(由于是最优化,不太能直接删除),而题目要求维护双端队列式的操作,这是一个经典问题——双栈模拟双端队列(也叫 baka trick)。

直接给出方法:维护两个栈,两栈的拼接即为我们维护的队列,照常进行大部分操作,若某一栈在空的情况下进行 pop,我们将另一栈沿中点劈成两半,暴力重构两栈信息。

分析复杂度:令势能为两栈大小差的绝对值,修改至多影响 \(1\) 的势能,而一次重构会消耗 \(L\) 的势能,产生 \(O(L)\) 次更新,因此总更新次数是 \(O(n)\) 的。

类似题目:JAG2018 Summer Day2 D Knapsack And Queries

一个结构类似的问题:牛客练习赛 102F 黑鸟,由于与本文主题无关,不在此赘述。

CF710F String Set Queries

由于答案有可减性,删除只需维护两个结构,分别表示加/删的字符串,答案即两个结构答案之差。

转化后的问题是经典的二进制分组,其方法为:假设字符串集合大小为 \(S\),我们将序列拆成 \(\operatorname{popcount}(S)\) 段,且长度分别为 \(S\) 从高到低为 \(1\) 的二进制位。此时插入操作相当于 push 一个大小为 \(1\) 的段,每次 push 结束后我们检查最靠后的两段段长是否相同,若相同则合并两段,暴力重构信息。

分析复杂度:一个数所在段段长不减,因此其只会贡献 \(\log n\) 次操作次数,总操作次数 \(O(n\log n)\)。

uoj#46. 【清华集训2014】玄学

由于有区间询问,我们考虑将上面二进制分组的结构搬到线段树上去,每个结点只有 \(l\) 个修改,于是值域被划分段数不超过 \(2l+1\),每一段维护一个最终线性变换。

沿用上面二进制分组的方法,合并两段即线段树上的 pushup,可以归并合并,查询用线段树结构分成 \(O(\log)\) 段区间,每段二分一下即可。

复杂度 \(O(n\log n+q\log^2n)\)。

bonus:P8525 [Ynoi2078] 《A Path Towards Autonomous Machine Intelligence》阅读报告(更新中...,将查询加速到 \(O(q\log n)\)。

类似分散层叠的过程,已经确定下来的结点的序列保存每个位置在左右儿子的来源,未确定的结点是一段右链,而修改均为后缀修改,我们维护一个从下到上的分散层叠,每个链上结点为其父亲的 \(\frac 14\) 与其左儿子的 \(\frac 12\) 的归并,于是只需一次二分以及 \(O(\log)\) 次 \(O(1)\) 的定位。

uoj#191. 【集训队互测2016】Unknown

与上一题很类似,但由于有 popback 不能直接用线段树维护。

考虑每个结点在其同层后继能 pushup 时再进行 pushup,每层都有恰好一个结点查询时要拆分成左右儿子的查询,因此询问复杂度仍为 \(O(q\log^2n)\)(多一个 \(\log\) 是因为本题还要在结点凸包上二分)。

分析复杂度:每层相邻两次重构之间均需要 \(O(len)\) 次修改,重构一次是 \(O(len)\) 的。

uoj#693. 【UR #23】地铁规划

单栈模拟队列。

我们想沿用双栈模拟队列的方法,但此时我们无法分开两个栈,不妨直接将左右两栈按某种顺序归并在一个栈中,只记录每条边属于左栈还是右栈(记作 \(0/1\))。

左端点左移时我们需保证栈顶是 \(0\),右端点右移则无所谓。每次左端点左移时直接 pop,据说这样是 \(O(m\sqrt m)\) 的,不过还是无法通过。

结合二进制分组的思想,我们可以每次 pop 时多 pop 一些数出来把 \(0\) 放上去。具体地,若此时有 \(c\) 个 \(0\),我们 pop \(\operatorname{lowbit}(c)\) 个 \(0\) 出来,然后将中途弹出的 \(1\) 放下面 \(0\) 放上面。

分析复杂度:将 \(0\) 元素二进制分组,那么 \(1\) 被 pop 次数是其前面的组数,而 \(0\) 元素可以定义势能为所有出现过的组的长度和,一次 pop 会将一个势能为 \(2^k\) 的组拆成 \(2^{k-1}+2^{k-2}+\cdots+1\),势能恰好减一。

于是复杂度 \(O(m\log m)\)。

标签:重构,结点,log,暴力,复杂度,势能,pop,浅谈
From: https://www.cnblogs.com/xiaoziyao/p/17413029.html

相关文章

  • 云数据库时代:企业数据架构的云化智能重构和变革
    云数据库时代:企业数据架构的云化智能重构和变革原创 国内数据库 作者:数据和云 时间:2018-11-2611:05:13  668  0在2018年11月16日举行的『数据技术嘉年华』大会上,我对行业近期的观察和思考做了一个总结,在此和大家分享商榷。我以为,近代数据库技术的发展可以划分为......
  • 浅谈Java SE、Java EE、Java ME三者的区别
    现在一个个来分析 1.JavaSE(JavaPlatform,StandardEdition)。JavaSE以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。JavaSE包含了支持JavaWeb服务开发的类,并为JavaPlatform,EnterpriseEdition(JavaEE)提供基础。 2.Java......
  • 浅谈Javascript 中几种克隆(clone)方式
    一:在Javascript里,如果克隆对象是基本类型,我们直接赋值就可以了:Js代码varsStr="kingwell";varcStr=sStr;alert(cStr);//输出kingwellsStr="abc";alert(cStr);//输出kingwell; 把一个值赋给另一个变量时,当那个变量的值改变的时候,另一个值不会受到影响。 ......
  • 浅谈栈内存和堆内存,以及它们的区别和联系
    栈内存是一种连续的数据结构,它由操作系统自动分配和释放,通常用来存储局部变量和函数参数。栈内存的分配和回收非常快速和高效,只需要调整一个水位线的位置就可以了。但是栈内存的大小是有限的,如果超过了栈的剩余空间,就会发生栈溢出的错误。堆内存是一种非连续的数据结构,它由程序员......
  • Codeforces Round 767 (Div. 1) E. Groceries in Meteor Town (Kruskal重构树 + 线段
    传送门  出现最大路径权值就应该联想到克鲁斯卡尔重构树,我们对于克鲁斯卡尔重构树求一遍dfs序,维护所有白色点的最大最小dfn(包括出发点),求出最大最小dfn的最近公共祖先既是答案。注意需要特判一下除了本身以外没有白色点情况。#include<bits/stdc++.h>intn,m;constintN......
  • 浅谈什么是多端能力服务统一
    多端能力服务统一(Multi-ExperienceServiceOrchestration,MESO)是一种技术和服务架构的概念,旨在为多种终端设备提供统一的用户体验和功能。它解决了在不同终端设备上使用不同应用程序和服务时出现的问题,使得用户可以在不同的设备上获得一致且无缝的体验。 传统上,不同的设备(如......
  • 基于粒子群算法的配网重构/ Matlab编程 以配电网络中网损最小作为目标
    基于粒子群算法的配网重构/Matlab编程以配电网络中网损最小作为目标函数,通过粒子群算法求得使系统网损最小时的网络拓扑结构。注:下图为程序在IEEE33节点配网系统上的仿真结果图ID:31200676737927322......
  • 浅谈接口测试及常用工具介绍
    前言目前软件测试行业做功能测试和接口测试的人相对比较多。API测试是一种作为集成测试的一部分、通过直接控制被测应用的接口(API)来确定是否在功能、可靠性、性能和安全方面达到预期的软件测试活动。由于API都没有GUI界面,API测试都是在通讯层进行的。现在API测试在自动化......
  • 浅谈反演
    浅谈反演二项式反演\(g_i=\sum\limits_{j=0}\binom{i}{j}f_j,f_i=\sum\limits_{j=0}(-1)^{i-j}\binom{i}{j}g_j\)还有一个的形式\(g_i=\sum\limits_{j=i}\binom{j}{i}f_j,f_i=\sum\limits_{j=i}(-1)^{i-j}\binom{j}{i}g_j\)这里只针对第一个形式,为了得到更普遍的反演,这里我......
  • 浅谈高中生物教学心得
         浅谈高中生物教学心得来源:用户上传   作者:王炳 生物课程是高中阶段重要的科学课程,是自然科学中一门基础学科。《普通高中生物课程标准(实验)》(以下简称《标准》)明确把提高学生生物科学素养作为高中生物新课程理念,要求每个学生不仅要获得生物科学......