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

20241012 模拟赛

时间:2024-11-08 15:22:06浏览次数:1  
标签:二分 log 20241012 复杂度 斜率 枚举 sum 模拟

20241012 模拟赛

A. 组合

一眼转化成前缀相减的形式,然后注意到 \(a,b,c\le 2000\),于是 \(O(n^2)\) 预处理就做完了。

B. 原神

先考虑暴力一点的想法。考虑枚举最靠右的瓶子 \(i\),再枚举选的瓶子的个数 \(k\),那么这时无论在前面选了哪些数,答案都会异或上 \(\sum_{j=i-k+1}^{i}a_j\)。这时选数的方案数就是 \(C_{i-1}^{k-1}\)。根据 \(x\ xor\ x=0\),得出只有 \(C_{i-1}^{k-1}\) 为奇数时才会对答案造成贡献,但此时 \(C_{i-1}^{k-1}\) 会很大,难以判断,而且枚举的复杂度也难以接受。

根据 Lucas 定理,\(C_{i-1}^{k-1}\equiv 1(\bmod 2)\) 当且仅当 \((k-1) \& (i-1)=k-1\),也就是说在二进制下 \(k-1\) 是 \(i-1\) 的子集。那么每次枚举 \(i\) 的时候,直接枚举 \(i-1\) 的子集就能快速找到所有能造成贡献的 \(k\)。时间复杂度为枚举子集的复杂度,\(O(3^{\log_2n})\)。实际计算量约为 \(2.1\times10^8\),可以通过。

C. 公交

容易想到对 \(d\) 做前缀和得到 \(s\)。那么询问的式子就形如 \(\min(s_i+vm_i)\)。

大佬说这种形式的求值可以转化为凸包上二分。将每个 \((m_i,s_i)\) 当作平面直角坐标系中的一个点,求出下凸壳。因为斜率为 \(-v\) 的直线在经过点 \((m_i,s_i)\) 时纵截距为 \(s_i+vm_i\),所以我们只要想象一条斜率为 \(-v\) 的直线从最下方往上平移,那么遇到的第一个点就是作为答案的点。考虑这个点具有什么性质,通过画图可以发现,这个点一定在下凸壳上。记下凸壳上的点为 \(a_i\)。那么连接 \(a_{i-1}\) 与 \(a_i\) 的直线的斜率一定小于 \(-v\),连接 \(a_i\) 与 \(a_{i+1}\) 的直线的斜率一定大于 \(-v\)。根据这个性质就可以先求出一个凸包,查询时直接二分就能找到答案。

对于这题,我们对序列分块,每次修改 \(d_i\) 时,将 \(i\) 所在的块暴力修改 \(s\) 的值并重构凸包,后面的块直接打一个标记就行了,因为一个块内所有 \(s_i\) 增加相同的值时,就相当于所有点整体上移,对二分并不会造成影响。修改 \(m_i\) 时,也是直接重构整个块即可。查询时,对每个块的凸包二分取最优即可。

设块长为 \(B\),则时间复杂度为 \(O(qB\log B+\frac{qn\log B}{B})\),当 \(B=\sqrt n\) 时为 \(O(q\sqrt n\log n)\)。

D. 树

20pts做法

最大的问题在于如何求解 \(f\)。观察样例解释可以发现,当答案最优时,每个节点的权值一定是与它相连的点的权值的平均值。证明不会。根据这个性质,我们就可以列出若干个多元一次方程,直接高斯消元求解即可,\(O(n^4)\)。

根据这个性质,经过一些思考应该可以做到 \(O(n^2)\),但是遗憾的仍然只有 20pts。

还可以根据一些不等式直接推出每个节点权值的表达式。因为 \(n\leq15\) 时树最多 4 层,直接手算即可。

满分做法

可以找规律或经过复杂推导得出(记 \(s_i\) 为子树和,\(len_i\) 为子树内叶子节点数,\(u\) 不为叶子):

\[ans=\sum{\frac{(sum_{lson_u}-sum_{rson_u})^2}{len_u(len_u-1)}} \]

证明不会。维护不会。

标签:二分,log,20241012,复杂度,斜率,枚举,sum,模拟
From: https://www.cnblogs.com/luyuyang/p/18535170

相关文章

  • 20241009 模拟赛
    20241009模拟赛A.排列喵手玩一下,依次操作\(1,n,1\)必然能使序列有序,所以答案不超过\(3\)。那么依次判断\(0,1,3\)即可。原序列如果有序就是\(0\)。如果\(a_1=n\)且\(a_n=1\)就是\(3\),因为这两个条件有一个不满足时只要操作\(1,n\)或\(n,1\)就能变成有序。考虑......
  • 20241002 模拟赛
    20241002模拟赛Ainv容易想到按\(s\)中\(0\)和\(1\)的连续段将原序列分段考虑。显然大的数放前面最好。于是按值从大到小,段从前往后分配值,\(0\)的段降序,\(1\)的段升序即可完成构造。求逆序对可以直接树状数组。但这题每个不同\(01\)段之间都有大小关系,于是每段中的......
  • 20240928 模拟赛
    20240928模拟赛Agenius将模运算转化,\(\sum_{i=1}^{n}a_i\bmodk=\sum_{i=1}^{n}(a_i-\lfloor\frac{a_i}{k}\rfloor\timesk)=sum-k\sum_{i=1}^n\lfloor\frac{a_i}{k}\rfloor=s\)。移项得到\(sum-s=k\sum_{i=1}^n\lfloor\frac{a_i}{k}\rfloor\)。于是\(sum-s\)是......
  • 20240925 模拟赛
    20240925模拟赛Apow显然如果出现了\(1\),那么\(1\)和后面的数都没用了。于是剩下的数不小于\(2\)。考虑\(3\)个数的情况,只有\(a^{(b^c)}\)和\((a^b)^c\)两种情况。第二中等价于\(a^{bc}\),注意到当\(b,c\geq2\)时\(b^c\geqbc\),于是第一种情况一定不优,所以直接......
  • 20240918 模拟赛
    20240918模拟赛AStringBPack看这个数据范围很容易想到dp,设\(f_{i,,j,k}\)(pair<int,int>)表示前\(i\)个物品,拿走\(j\)个\(1\),\(k\)个\(2\)所用的最少车数,以及最后一辆车所用的最少空间。转移分当前这个拿不拿掉讨论,非常显然。最后枚举总共拿了几个\(1\)和几个......
  • 20240914 模拟赛
    20240914模拟赛A开挂(openhook)可以发现结果序列是能确定的,而且我们并不关心具体对哪个数进行操作,有用的信息只有操作次数,从而可以得到一个数组\(c\)表示对某个数操作了某个次数。设对\(tot\)个数进行了操作,将\(c\)从小到大排序,将\(b\)中的前\(tot\)小从大到小排序,于......
  • Chromium 进程降权和提权模拟示例c++
     一、背景知识概念参考微软链接:强制完整性控制-Win32应用程序|Microsoft学习授权)(模拟级别-Win32apps|MicrosoftLearnDuplicateTokenEx函数(securitybaseapi.h)-Win32apps|MicrosoftLearn本文主要演示 low,medium,high,andsystem四种权限创建......
  • C++:模拟实现STL的list
    目录一.list类1.list的创建节点2.list迭代器的运算符操作3.list的构造函数及析构4.list的迭代器5.list的插入及删除二.整体代码1.list.h2.list.cpp在上一节已经了解list在库中的用法,在这里实现list的底层逻辑一.list类1.list的创建节点template<classT>struc......
  • [赛记] NOIP2024加赛1 && 多校A层冲刺NOIP2024模拟赛18
    暴力错解大赛玩游戏82pts乱糊的错解,正确性和时间复杂度都不对,但是拿了82pts;对于正解,考虑从$k$将原序列分成两个部分,左边和右边,然后分别求一次前缀和(注意这里,可以省去很多分讨和常数),设前一个前缀和数组为$a$,后一个为$b$,那么问题就转化成有两个指针$i,j$,可以任......
  • NOIP 模拟 7
    T1图书管理(book)考虑每个数做中位数的贡献,经典trick就是小于的为\(-1\),大于的为\(1\),前缀和相减为\(0\)的就合法,不会链表。T2两棵树(tree)又是经典trick,森林的连通块数为点数减边数,证明就是算树的数量,好像之前见过这个trick。然后把贡献拆开,\(e\)代表点,\(v\)代......