csp-s 模拟 8

news/2024/10/8 19:36:45

csp-s模拟8

T1 score and rank

特殊性质,题意转换

妙妙题

对于 \(S\) 小于等于 \(0\) 的情况答案显然是所有大于等于 \(S\) 的个数。

现在讨论 \(S\) 大于 \(0\) 的情况。

先对序列做一个前缀和,题目要求即是让所有值减去前缀最小值小于 \(S\)
考虑有一段连续正整数的和大于 \(S\),则贪心的从大到小删除序列中的值,直到和小于 \(S\)
考虑有两段连续正整数中间夹着一段负数并且两段正整数的和都大于 \(S\) 而且这三段的和都大于 \(S\),依旧是考虑贪心删除,但需要考虑顺序,先对两段正整数段内贪心,若此时整段的和依旧大于 \(S\) 再合并贪心。

发现这种做法是可扩展的,但是时间复杂太高了。

观察题目性质发现对于一段正数后连着一段负数,记这两段的和分别为 \(S1,S2\),且 \(S1+S2>0\),那么对于前缀和而言删去那段正数中的数最多能对其后的值减少 \(S1+S2\) 的贡献,即就是说当删除的和大于 \(S1+S2\) 时就对这个题而言没有贡献了。对于上面的做法启发我们维护这个正整数段的前 \(k\) 大,且这前 k 大的和恰好大于 \(S1+S2\)。对于前者很好用堆去维护,后者该怎么维护呢?考虑用正数去填充负数,意思是说对于正整数断后的负数每添加进来一个就用正整数段中最小的正数去填充它直到为正然后再入堆,显然最后的值一定依旧是最小的,堆中的和恰好为 \(S1+S2\),对于本题的答案并不关心值而是关心个数,所以这样做是对的。如果堆中值的和不足以填充这个负数,则直接清空堆等同于连续段的左端点不可能在其左边。

每个数只会进出堆一次,所以时间复杂度为 \(O(nlogn)\)

T2 HZOI大作战

签到题

由于数据较大,有点卡常卡空间。

离线下来对树上的点和询问向祖父中第一个大于自己的点连边,可以考虑倍增 \(max\) ,然后根据 \(dep\) 直接倍增跳就可以了。

时间复杂度 \(O(nlogn)\)

T3 Delov的旅行

二分,DP优化

题目的一些限制使得每个点只能进出子树各一次且最后回到根。

答案显然具有单调性,二分答案。

考虑怎么检查二分值是否合法,首先有个 naive 想法,设计状态 \(f_{i,x,y}\) 表示点 \(i\) 中最早遍历到的叶子节点到 \(i\) 的距离为 \(x\),最晚遍历到的叶子节点到 \(i\) 的距离为 \(y\) 是否合法,转移考虑背包即可,但是值域过大复杂度直接就炸了。但是发现每个叶子到个点的距离是固定的,所以会产生很多冗余的状态,那么就可以将所有的状态放到 \(vector\) 中就行了,但是此时依旧有冗余状态即对于 \(x_i≤x_j,y_i≤y_j\) 对于状态 \(j\) 而言显然是不如 \(i\),所以只需要维护一个 \(x\) 单调递增 \(y\) 严格单调递减的状态即可,排序去重,上双指针即可。注意左右儿子的顺序未定,且儿子本身也是可以翻转的,所以可以将状态两维 \(swap\) 一下再放入。

分析时间复杂度,每个点的状态数为它一个儿子的二倍,即每层有 \(O(n)\) 个状态,有 \(O(logn)\) 层,所以总时间复杂度为 \(O(nlognlogV)\)

T4 gtm和joke的星球

斯坦纳树

模板题

首先答案的形态一定构成一颗树,因为若存在环,则可以删去一条环上的边使答案减少。

因为关键点的个数很少( \(k≤10\) ),所以可以考虑状压 + 树形 \(DP\) 去解决。设计状态 \(f_{i,s}\) 表示当以 i 这个点为根,且子树内具有的关键点包含 s 这个集合的最小答案,那么转移可以考虑集合合并以及根的转移。

集合合并 \(f_{i,s}=\min\{f_{i,s1}+f_{i,s2}\}(s1∪s2=s)\)

根的转移 \(f_{i,s}=\min\{w_{i,j}+f_{j,s}\}\)

对于第一种直接枚举子集转移就行了,第二种可以考虑在第一种整体转移完后(即这个集合对应的所有根都转移完后),进行最短路松弛即可。

分析时间复杂度,对于第一种转移,由于是枚举子集所以时间复杂度为子集的个数为 \(O(3^k)\)。对于第二种转移,每种集合都会进行一次最短路进行松弛,若使用 Dijkstra 则为 \(O(2^k(n+m)logm)\)。总时间复杂度为 \(O(3^k+2^k(n+m)logm)\)

p

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

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

相关文章

C#联合Visionpro编程学习记录,视觉中需要考虑旋转中心工况的计算方法探讨

一、考虑旋转中心的工况解法, 1,视觉中引导定位或者对位贴合时,机械手或者xyzr轴上手爪中心和末端轴中心不同轴时,就要考虑旋转中心问题; 2,如果设备的CT要求没有很苛刻,可以采用2次拍照的方案解决,1次拍照后纠偏角度,然后在纠正角度后的位置2次拍照纠正x、y偏差;看下…

海外模组联网非常难?不往忘了APN配置…

​除了中国之外,国外的4G信号都比较差劲。 做海外的设备,如果忽视了射频的信号质量,肯定是要吃大亏的! 所以,海外模组的联网问题,会比国内要多不少。 客户在实际应用中或多或少都会遇到:网络相关问题:例如:连不上网,APN不会配置,APN没有配置,当地信号差… 软件升级…

轻松上云怎么操作?IoT_CLOUD之中移OneNET

​最近来了很多新朋友,也经常被问:可以多讲些云平台的操作吗?当然可以!文末留言你想要了解的云平台,优先安排~ 接下来,本文将以Air780E+LuatOS作为示例,教你使用合宙IoT_CLOUD连接中移OneNET物联网云平台。一、IoT_CLOUD简1.1 IoT_CLOUD特色简介 IoT_CLOUD——是合宙专门…

实验2 C语言分支与循环基础应用编程-1

任务一#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 #define N1 397 #define N2 476 #define N3 21int main() {int cnt;int random_major, random_no;srand(time(NULL)); // 以当前系统时间作为随机种子cnt = 0;while(cnt &…

面试-前端基础速刷-Vue

1. Vue中computed和watch的区别 两者用途不同啊!computed用于计算产生新的数据,watch用于监听现有数据。 computed有缓存,methods没有缓存。 computed有点儿像工厂模式(产生新的东西),watch像发布订阅模式。(是我目前的知识盲区) 2. Vue组件通讯有几种方式,尽量全面❗…

宝塔平替:1Panel-新一代的 Linux 服务器运维管理面板(附优惠码/推荐码)

什么是1Panel 1Panel是一款开源,现代化的新一代的 Linux 服务器运维管理面板!1Panel可以帮你实现的功能: 高效管理:用户可以通过 Web 图形界面轻松管理 Linux 服务器,实现主机监控、文件管理、数据库管理、容器管理等功能; 快速建站:深度集成开源建站软件 WordPress 和 …

大模型应用开发初探 : 基于Coze创建Agent

Coze(扣子)是字节跳动公司开发的新一代AI应用开发平台,使用这个AI应用开发平台,无论你是否有编码基础,都可以快速搭建基于大语言模型的各类AI Bot,还可以将Bot发布到其他渠道。对于一个AI Agent而言,最重要的能力就是任务规划、调用工具、知识库 和 记忆能力,而这些能力…

了解final关键字在Java并发编程领域的作用吗?

在Java并发编程领域,final关键字扮演着一个至关重要的角色。虽然很多同学熟悉final用于修饰变量、方法和类的基本用法,但其在并发环境中的应用和原理却常常被忽视。final关键字不仅仅是一个简单的修饰符,它在多线程编程中确保对象状态的可见性和不变性,这对于构建线程安全的…