模拟测试58

T1:

  每个数至多有$2 \sqrt{m}$个约数,也就是说即使$n$很大,在数集中有倍数的数在$m \sqrt{a}$级别。

  可以暴力筛出数集中每个数得约数,用hash表维护一下,可实现$O(1)$查询。

  用$n$减去筛出的数个数即为答案中0的个数,但是注意超过$n$的数要删掉。

  时间复杂度$O(m \sqrt{m})$。

T2:

  我们发现每个物品的花费很大,价值却很小,于是我们可以将价值做背包,求出每个花费对应的最小代价。

  然后将询问离线排序,从时间较早的计划做起。

  将所有商店也排序,从早到晚枚举计划,用单调指针维护当前可以买到东西的商店。  

  如果有新的商店加入,就再做一轮背包DP。

  背包DP同时维护一个花费的后缀最小值,用于二分查询最大的可以获得的价值。

  时间复杂度$O(n^3+mlogn)$。

T3:

  最长路即是树上直径。

  树上直径可以用并查集维护。

  将两个连通块连接,新的直径一定是由原先两条直径的四点中的两点组成的。

  在并查集的代表元素上维护直径的两个端点,合并时分6种情况讨论即可。

  而这六种情况的长度都可以在原树上用lca或树剖求出。  

  但是次题还有上界限制,也就是说我们需要分离并查集。

  用平衡树维护可持久化并查集?

  考虑类似线段树分治的思路。

  对于速度值域开一棵线段树,把每条边像线段树区间查询一样加进去,一条边至多被劈成$log(r-l)$段。

  然后dfs遍历整棵线段树,到一个节点将这个节点的边加上,同时用栈维护加边前并查集的状态。

  回溯时直接弹栈,将并查集连的边分离即可。

  由于要维护结构,并查集不能用路径压缩,只能按秩合并。

  处理出来所有答案,$O(1)$回答询问即可。

  遍历线段树是$O(n)$的,而每次查询是$O(mlogn)$的,所以不能每次都查询。

  由于一共有$m$条边,每条边至多被劈成$logn$段,外加并查集的复杂度$O(logn)$,总的时间复杂度为$O(nlog^2n)$。

原文地址:https://www.cnblogs.com/hz-Rockstar/p/11624798.html

时间: 2024-10-31 12:18:37

模拟测试58的相关文章

[考试反思]1003csp-s模拟测试58:沉淀

稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使用的话,切记计算内存,一点都不能开大. T1: 直接根号筛,拿map也能过. 遍历map直接begin和end啊... 1 #include<cstdio> 2 int Cnt[202]; 3 struct hash_map{ 4 int cnt,fir[10000020],l[6666666],

csp-s模拟测试58「Divisors」&#183;「Market」&#183;「Dash Speed」?

A. Divisors 大概平均下来每个数也就几千约数吧....,直接筛 B. Market 可以把时间离线下来, 考试没有想到将询问离线,用数组存算了算只能过200的点,拿了70 事实上背包后直接二分就好... C. Dash Speed 好题,想到以前的一道题影子. 考场用单调队列多QJ了20分,然而没有想到并查集 线段树上分治????? 线段树上的节点表示在该权值在该区间内的边,每个节点开个vector即可 那么考虑区间查询和单点修改, 对于每个叶子节点,我们从上到下所经历的边其实就是可行

csps模拟测试58

T1: 这好似我是乱搞过的. 和正解很像. 对于这些数,只有他们的因数才能对答案做贡献,别的都是0. 所以我就可以把每个数分解因数,然后把因数卡在一起. 没有的就是0,统计一下就完了. T2: 考试想到了没时间搞了, 做过一次. 条件答案互换,然后这回球出来的是花费必须为s的最少,你可以让花费至少是s的最少,然后就单调了,直接二分就行了. T3: 限制维护链并的题, 也做过一个, 先看到题中给的询问的范围和n同级. 所以可以考虑线段树分治,就是把边的取值打到线段树上, 然后dfs整棵树,让它在此

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

noip模拟测试11

T1:string 第一眼秒出思路,这不就是排序那道题的加强版吗? 然而歪?解复杂度虽然是对的,但常数过大,竟被卡到70 歪?解:(实际上std写的就是这个,但据说std被卡掉了 OAO) 因为字符集很小,所以我们可以把区间排序改为区间查询和覆盖 即:先查询区间内所有字符的个数,再从左端点开始按照大小关系依次将长度为字符个数的区间修改为该字符. 期望复杂度O ( 26*mlogn ),实际复杂度O ( 26*mlogn*(巨大的常数) ) 所以需要一(feng)定(kuang)的卡常 正?解:

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

csp-s模拟测试94

csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间,$T3$写完暴力准备划水,突然发现特殊性质可写,$10$分钟拯救了$25$分. 80 03:24:46 70 03:24:58 65 03:25:10 215 03:25:10 没办法就是菜,退役也不暝目. A. 凉宫春日的忧郁 转成对数轻松过. B. 漫无止境的八月 取模到$K$大小的区间,$ha

模拟测试(vj)

做这份模拟测试,已经崩溃了,英文看不懂,题意理解错.到结束了只a了第一题,人生陷入了低谷,于是花了一天的时间终于把不会的弄明白了,在这里写一份总结~ T1,简单的模拟,如果打枪打中一支鸟,将这个位置设为0,并向两边扩散,注意这个位置一定要有鸟. 代码~ #include<bits/stdc++.h> using namespace std; int a[30000]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) ci

Android单元测试与模拟测试详解

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测