首页 > 其他分享 >2024.9.6 模拟赛

2024.9.6 模拟赛

时间:2024-09-06 19:35:36浏览次数:11  
标签:需要 后缀 2024.9 可以 瞬移 子树外 sum 模拟

A

对于一个子矩阵 \((x_1,y_1),(x_2,y_2)\),其元素和为 \(\sum_{i=x_1}^{x_2}\sum_{j=y_1}^{y_2}S_i\cdot S_j=(\sum_{i=x_1}^{x_2}S_i)(\sum_{j=y_1}^{y_2}S_j)\),\(O(n^2)\) 枚举一下 \(S\) 的所有子区间的和放进一个桶里再检验一下即可。

即对于一个子区间和为 \(S_1\),需要累加和为 \(\frac{T}{S_1}\) 的子区间个数到答案中。特殊地,\(S_1=0\) 或 \(T=0\) 的时候需要一些特殊处理。

使用 unordered_map,\(O(n^2)\)。

B

注意到 \(S[l:r+1]\) 的字典序大于 \(S[l:r]\),于是每次找到的都是 \(S\) 的后缀,那么就可以用哈希+二分来比较两个后缀的字典序大小,每次暴力找字典序最大的后缀,做到 \(O(n^2\log n)\)。

删去一个后缀后,剩余串的后缀之间的大小关系与删前原串的对应后缀的大小关系不变,那么接下来从后往前逐个考虑每个后缀,如果 \(S[i:]>S[j:]\) 且 \(i<j\),那么最优策略中不会选择 \(j\) 这个后缀,于是用单调栈完成这个过程就可以找到过程中会选择的所有后缀了,只需要进行 \(O(n)\) 次大小比较,使用哈希+二分做到单次比较 \(O(\log n)\)。\(O(n\log n)\)。

C

首先我们不关心每次操作选择的 \(i,j\) 是如何配对的,只关心逆时针旋转的次数要等于顺时针旋转的次数。于是可以直接设计 dp 状态 \(f_{i,j}\) 表示考虑了前 \(i\) 个学生,并且有 \(j\) 个“不成对”的操作时得到的最大总幸福度,\(j>0\) 表示多出了 \(j\) 次顺时针,\(j<0\) 表示多出了 \(-j\) 次逆时针,每次转移的时候枚举 \(i\) 顺逆时针旋转的次数就可以完成转移。

这样做的问题在于,\(j\) 这一维的大小没有很好的控制,但是可以观察到 \(j\) 的“有效范围”在 \((-m,m)\) 之间,因为若 \(|j|\ge m\),比如 \(j\ge m\),那么我们对任意一个元素进行 \(m\) 次逆时针操作就可以使 \(j\) 减小 \(m\) 而不改变答案,\(j\leq -m\) 同理。于是这样就得到了一个 \(O(nm^2)\) 的做法。

实现上,又注意到 \(k\) 次顺时针可以用 \(m-j\) 次逆时针代替,所以 \(j\) 可以控制在 \([0,m)\) 内且转移时只考虑顺时针旋转的次数,常数会比较小。

D

如果只是维护每次插入的位置而不删除,可以使用 std::set \(S_1\) 维护极长连续空白段的信息,本题中要求按照长度从大到小排序,仍然可以用其维护,每次插入取出符合题意的一段并放入新的两段(如果存在)。再配合动态开点线段树/离散化之后树状数组或线段树,就可以完成员工不会离开的部分分。

对于删除操作,额外记录每个员工外套的位置,再开一个 set \(S_2\) 存这些位置,查询需要删除的位置在这个 set 中的前驱后继就可以找到 \(S_1\) 中对应的区间完成删除与合并的操作了。

要回答区间有多少个有效点,只需要用动态开点线段树。\(O(q\log n)\),可以参考 std 实现。

E

如果不能瞬移,那么答案是 \((2\sum w_i)-L\),其中 \(L\) 是直径长度。这很好理解,因为可以任选起点终点,这之间的边可以不经过第二次。

如果可以瞬移,类似地,这次瞬移可以让一些边不经过第二次,发现等价于选两条边集不交的链 \(P_1,P_2\),其并集中的边可以只经过一次,那么只需要最大化这两条链的并集的边权和。如果边集有交,可以手玩发现其中一定有边被经过两次,而在唯一点相交是没有问题的。接下来只需要分两种情况:

  • \(P_1\cap P_2=u\),枚举点 \(u\),等价于找四条从 \(u\) 出发的边不交的链使得边权和最大。记 \(dp_{u,i}\) 表示 \(u\) 第一步向不同的儿子走,能取到的第 \(i\) 长的链,转移只需要暴力合并一下。但是这没有考虑到向父亲走的情况,于是再记一个 \(f_u\) 表示 \(u\) 向上走的最长链,计算 \(f_u\) 时用父亲的信息合并一下即可。
  • \(P_1\cap P_2=\varnothing\),枚举点 \(u\),选择 \(u\) 子树内和子树外的最长链,即两个连通块里的直径问题。子树内是好做的,子树外仍然是先从父亲继承,再用经过父亲的答案更新。这里实现上需要关注 \(v\) 的子树外答案分为 \(u\) 的子树外与 \(u\) 的子树内但 \(v\) 的子树外两部分,后者需要精细处理一下。注意,\(fa_u\) 与 \(u\) 之间的边可以用瞬移做到一次都不被经过,相当于对这两个连通块分别做不瞬移的问题,所以还需要额外统计此贡献。

总复杂度 \(O(n)\),可以参考 std 实现。

标签:需要,后缀,2024.9,可以,瞬移,子树外,sum,模拟
From: https://www.cnblogs.com/xhqdmmz/p/18400879

相关文章

  • CF1534(模拟赛记录)
    比赛页面ABCD都打的可以,然而E的+10直接葬送了大概率过的F1……先猜了个\(n-k+1\)的结论,但是没有写搜索查正确性(事实上确实不正确),于是两次罚时,第一次是交互格式错了。然后又猜了个\(\min(n-k+1,(n-1)/(k-1))\)的结论,过了几个小的搜索数据(\(n\le6\))的,大一点的没跑,于......
  • 2024.9.6 CF1307 模拟赛记录
    A:各捆干草间互相独立,所以优先移动距\(1\)近的。点击查看代码#include<bits/stdc++.h>#defineintlonglong#definepsbkpush_back#definefstfirst#definescdsecond#defineumapunordered_map#definepqueuepriority_queue#definevcvector#defineendl'\n'......
  • C语言——使用回调函数模拟实现qsort
    同学们还记得之前我们已经学过一种排序方法叫“冒泡排序“嘛。代码直接附上咯voidbubble_sort(intarr[],intsz){ inti=0;//趟数 for(i=0;i<sz-1;i++) { intj=0; for(j=0;j<sz-i-1;j++) { if(arr[j]>arr[j+1]) { inttmp=......
  • 2024.9.6 Python,华为笔试题总结,字符串格式化,字符串操作,广度优先搜索解决公司组织绩效
    1.字符串格式化name="Alice"age=30formatted_string="Name:{},Age:{}".format(name,age)print(formatted_string)或者name="Alice"age=30formatted_string=f"Name:{name},Age:{age}"print(formatted_string)2......
  • 『模拟赛』CSP-S模拟1
    Rank1BADA.喜剧的迷人之处在于签。正好早上还在改一个要分解质因数的题,所以一眼就出思路了。首先将\(a\)的平方因子全部除去,剩下的就是\(b\)必须的因数,即若设将平方因子全部除去后的\(a\)为\(a'\),则\(b\)应表示为\(a'\timesx^2\),从\(L\)这个下界开始只用找......
  • 使用flask进行Mock Server模拟接口操作及问题解决
    1.flask介绍flask是一个轻量级的pythonweb微框架2.MockServer介绍MockServer是一个开源的模拟服务器,它可以定义和记录API交互,支持各种http方法(get、post、put、delete),可以自定义响应内容,例如返回静态文件可以使用flask来搭建一个mock模拟服务3.模拟接口先安装flaskpip......
  • 2024.9.6 leetcode 70 爬楼梯 (哈希表/动态规划)
    题面70.爬楼梯-力扣(LeetCode)题解:极其经典的一道动态规划,比如要跳到10楼有f(10)种方法,可以分为1、先跳到9楼再往上跳1楼2、先跳到8楼再往上跳2楼,所以f(10)=f(8)+f(9),昨天复习了哈希表,所以用哈希练习一下。classSolution{public:intclimbStairs(intn){uno......
  • 9.6 上午 becoder 模拟赛总结&题解
    T1语言水题不多说,很容易发现NP需要满足的只是最后一个单词为N,前面是A或N都可以随意放。所以用两个数组,\(v1_i\)记录以\(i\)结尾的前缀是否可以构成NP,\(v2_i\)记录以\(i\)为开头的后缀是否可以构成NP。最后for循环扫一遍是否有同时满足\(v1_{i-1}=true\)和......
  • KUnit:设备模拟&重定向
    设备模拟有些驱动文件是需要device的,所以KUnit提供了一些设备模拟的方法,并且还提供了总线来管理设备的生命周期。下面先以clockdevice模拟举例(drivers/clk/clk_test.c)首先用一个struct来模拟这个clk设备。其中clk_hw是clk的描述,rate相当于模拟设备的波特率寄存器structclk......
  • 2024.9.4 leetcode 169 多数元素 (哈希表)
    题面 169.多数元素-力扣(LeetCode)题解:复习(自学)了一下哈希表,unordered_map<int,int>umap定义一个表umap.find(nums[i])!=umap.end()判断是否存在umap.insert({nums[i],1})插入umap.erase(nums[i])清除C++容器类<unordered_map>|菜鸟教程(runoob.com)class......