「考试」联赛模拟36-39,noip晚间小测2-3
36.1 party(CF623D)
很是鸡贼的一道题
首先要明确一点,抓人是有策略,而不是随机的,可以认为等同于按一个给定的顺序猜人,那么这时猜中的概率就只是抓住这个人的概率了
对于每一次猜测,因为使用最优策略,所以每一步都猜当前使游戏结束几率最大的那个人
令\(q_i=1-p_i\)即为第\(i\)个人不被猜中的概率
则第\(i\)个人在被猜\(j\)次后已经被猜中过的概率即为\((1-q_i^j)\)
那么这时游戏已经结束的概率即为\(\prod\limits_i(1-q_i^j)\)
于是模拟每轮,贪心找出对结束概率增长贡献最大的人,把猜他的次数++
要求精度为\(10^-9\),模拟\(300000\)次即可满足精度要求(这是最鸡贼的地方
最后……
\(\huge{戒瞎开long\ long}\)
36.2 fibonotci(CF575A)
看到每一项都由前面的两项结合指定的系数得到,而且有循环节,那么每个循环节的运算矩阵是可以用矩阵乘法维护的
但是有修改操作,所以需要一种支持高效修改与“求和”的方法
那么线段树是可以满足这个需求的
按循环节跳,每次如果发现当前循环节里有被修改的位置就先改,算完再改回来
很难写,至少对我来说……
36.3 parking(CF480E)
悬线法,似乎和玉蟾宫类似,只不过变成了求最大正方形,而且带修改
悬线法就是每个点求向上/向下延伸的最远距离,
首先考虑求最大正方形的方式:从大到小枚举区间长度,然后看这个长度的区间中是否存在一个区间,使它中向上/下延伸长度的两个最小值之和不小于这个区间的长度,那么这样找到的第一个符合条件的区间长度就是此时的最大正方形边长
那也肯定不是\(O(qn^3)\)求啊!
发现如果从前往后推,答案是不断减少的,但我们并不知道每个时刻的答案是在地图的哪个位置出现的,所以必须遍历每一个位置才能得到答案,效率极低
又发现其实刚开始就可以推出最后的状态,而如果从后往前推,也就是把点一个一个删去,可能出现改变答案的位置就只有删去的这个点所在的一行
那么可以把修改离线存下来,然后倒着来,首先用\(O(n^2)\)dp求,这样每次就只用\(O(n^2)\)查找一行的答案改变,因为答案是从后往前是单调不减的,每次从上一个答案开始,\(O(n^2)\)更新答案
查找区间最值的操作可以用线段树来维护,这样每次更新答案用当前行建一次树,更新答案时就可以\(O(n\log n)\)了
36.4 ant
高斯消元的主元法优化,留坑……
37.1 简单题
首先发现\((a+b)\)的值和\(c\)的值之和是不变的,而最后的答案只关心\(c\),所以可以把\((a+b)\)和\(c\)的值分开考虑
发现在\(%(a+b+c)\)意义下,加倍的操作和减去另一个数的操作是等价的,所以直接处理一个快速幂与原数相乘即可
37.2 斗地主
神仙思路:把每张牌正反两面的权值连边,那么在存在环的联通块中,所有值都能取,而在一棵树中,必有一个值取不到
所以并查集处理每个联通块,并记录每个联通块的最大/最小值,如果有一棵树权值的值域被询问区间包含,那么询问区间里必有一值取不到
可以用线段树处理区间包含的问题,就能做到\(O(q\log n)\)
37.3 变化的树
每次操作可以看作是树上加了一个等差数列
那么可以用线段树维护差分数组,然后树链剖分一下
38.1 理发
每一次大于\(h_i\)的头发被推平,那么之前等于\(h_i\)的头发与这些头发构成的逆序对就会被全部消除
那么处理出每个高度的头发贡献的逆序对个数,然后在\(j=0\)时答案为\(0\),那么相当于给上面处理出来的数组做一个前缀和
38.2 T形覆盖
考虑将"T"形转化成十字删一角,并重新建图,那么将摆放方式固定的十字连自环,否则与和他有角相交的点连边,用边表示这两个十字其中一个要删这个点占用,那么最终的方案每个点都要至多占有一条边,且每条边都必须被一个点占有,否则无解。
分析这个条件可以发现有解时每个联通块都是树或基环树:
- 如果是基环树,那么每个点都可以恰好占有一条边,这块区域能被覆盖满
- 如果是树,那么必须有一个点要放弃一条边,一个点得删,所以贪心取这个联通块里最小的权值减去
39.2 dequexlis
发现其实操作后的最长上升子序列长度就是把原序列镜像复制一遍再求到的长度
因为严格上升,所以可以保证一个数不会在两边被重复取到
39.3 最大前缀和
把数抽象成在网格上的移动,从原点出发,\(-1\)为向上走,\(1\)为向右走,那么经过的点中横纵坐标之差最小的位置就代表了最大前缀和
发现所有答案一样的点都在一条直线上,那么可以用卡特兰数时学的那个套路沿直线对称再组合数求出不超过某条对角线的方案总数,再记录上一条总数,相减得到恰好最大值为每个值时的答案
W2.1 袜子分配
选出一双袜子,一共有\(\binom{2n}{2}\)种方案,能取到一双袜子有\(2n\)中方案,取\(n\)次答案即为\(\frac{2n^2}{\binom{2n}{2}}\)即为\(\frac{n}{2n-1}\)种方案
W3.2 路径难题
明显需要求一个最短路,但条件比较复杂,考虑建图的方式:对于每条公交线路,所有站台向一个虚点连权值为票价的边,并从这个虚点向所有站台连权值为\(0\)的边
建好边后跑\(dijkstra\)即可,因为要上取整,注意每次坐公交时需要把当前的距离先上取整一下再乘回去,最后一起除以\(r\)就是对的
最新文章
- [C#] 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)
- Linux文本查看及处理.md
- [原创][LaTex]LaTex学习笔记之框架及宏包
- jQuery Ztree基本用法
- [转]面向GPU的多LOD因子的大规模场景可视化策略
- Lambda前世今生
- 问题-[Delphi7]程序在WIN7电脑上的日期错误处理
- weblogic9.2重置密码
- FlexboxLayout 的一些基本介绍与基本用法
- String类的基本用法与注意点,StringBuffer类的用法
- Properties文件,Data,Calendar类的使用
- 总线接口与计算机通信(三)UART起止式异步通用串行数据总线
- js架构设计模式——前端MVVM框架设计及实现(一)
- 使用JPA和Hibernate进行批量处理的最佳方式
- C语言实现数据结构中的堆创建,堆排序
- Loadrunner乱码问题解决方案(录制&;&;运行)
- 新工具DPR的一些想法
- powerdesigner相关记录
- 深入理解css3中 nth-child 和 nth-of-type 的区别
- python: numpy--函数 shape用法