NOI2017
整数(线段树)
不难想到按位处理,位数比较多考虑使用动态开点线段树维护大数,那么复杂度是\(O(nlog^2n)\)的,不够优秀。
但注意到我们需要支持的是二进制下的加减法,而在二进制下我们可以使用int压位来节约时空,于是使用unsigned int压32位,再用线段树维护。这样每一次加减都只会影响到最多两个位置,复杂度可以降为\(O(nlogn)\)。线段树需要支持单点查询、区间查询是否全\(0\)或全\(1\)(这是为了在进退位的时候二分出进退位的影响范围)、区间覆盖。直接做就可以了。
蚯蚓排队(哈希)
\(7.5 \times 10^8\)过\(2s\) emmm
因为每一次询问的串长不会超过\(50\),所以我们考虑在拼接和分离的时候动态维护长度为\(1\)到\(50\)的所有串。
因为每一次拼接和分离都只会加入/删除个数为\(k^2\)级别的串,所以暴力维护一下它们的Hash值,每一次询问的时候也暴力搞出每一个子串的Hash值,然后在哈希表上查一下。
复杂度\(O(k^2m)\)。卡常方法:哈希表手写、链表手写、自然溢出、\(seed=19491001\)……
泳池(概率、DP、线性递推)
首先恰好为\(k\)可以转化为\(\leq k\)的概率-\(\leq k - 1\)的概率。
设\(f_i\)表示宽度为\(i\)、底部最右边第\(i\)个点一定被ban、最大的无ban块矩形\(\leq k\)的概率,枚举底部从右往左第二个被ban的块,有\(f_0 = 1 , f_i = (1-q)\sum\limits_{j=1}^{\min\{k , i\}} f_{i-j} p_{j-1}\),其中\(p_{j-1}\)是宽度为\(j\)、底部没有被ban的块、最大无\(ban\)块矩形\(\leq k\)的概率。这样\(\leq k\)的概率就是\(\frac{f_{n+1}}{1-q}\),因为第\(n+1\)列的被ban的块的概率要除掉。
注意到上面是一个线性递推,只需求出\(p_1,...,p_k\)就可以\(O(k^2logn)\)或者\(O(klogklogn)\)地求解。
求\(p_i\)考虑一个DP:设\(dp_{i,j}\)表示对于一个宽度为\(i\)的矩形,其底部\(j\)行不存在ban块,第\(j+1\)行一定存在ban块,最大无ban块\(\leq k\)的概率。那么\(p_i = \sum\limits_{j=1}^{+\infty} dp_{i,j}\)。
\(dp\)数组转移枚举从左往右第一个ban块在第几列,有\(dp_{i,j} = q^j(1-q) \sum\limits_{k=1}^i (\sum\limits_{l > j} dp_{k-1,l}) (\sum\limits_{l \geq j}dp_{i-k , l})\),边界为\(dp_{0,x} = 1 , x \in [1 , k]\)。有效的\(dp_{i,j}\)会满足\(ij \leq k\),所以有效位置是\(O(klogk)\)级别的,故上面转移可以后缀和优化至\(O(k^2logk)\),(或许?)可以FFT优化到\(O(klog^2k)\)。
但是似乎这道题强上多项式和暴力没什么特别大的区别
游戏(2-SAT)
第一眼看上去似乎是一个3-SAT问题,然而\(d \leq 8\)给我们的信息就是暴力枚举。枚举\(x\)型地图变成\(a\)型地图还是\(b\)型地图(实际上不要枚举\(c\),因为\(ab\)两种地图已经包含了选择\(ABC\)三辆车的情况),对于每一种情况跑2-SAT。复杂度\(O(2^d(n+m))\)
然后需要用一些玄学的随机和疯狂叉人的test12345看不懂的2-SAT写法
蔬菜(贪心、并查集)
使用增量法求解答案,即每一次增加一天然后考虑新增加的蔬菜的最大价值,因为之前被加入到售卖行列的蔬菜在天数增加之后也一定会在售卖行列里。考虑现在正在做有\(i\)天的最大收益。
首先,一个价值更高的蔬菜肯定会优先被安排位置。所以我们把所有蔬菜全部丢到一个堆里面,对于\(s_i\),我们从每一种蔬菜中单独拿出一个蔬菜,特殊处理一下它的腐坏时间,也作为一个对象放到堆里。每一次我们从堆顶取出价值最大的蔬菜看它是否有位置。安排\(m\)个蔬菜进入到售卖行列或者堆为空时就完成了一次增量。
对于一个蔬菜,为了给之后的蔬菜腾出位置,肯定安排在越后面越好。我们算出这种蔬菜最后能安排在哪天(要跟\(10^5\)取min),我们要求的就是这一天前距离这一天最近且蔬菜没有被安排满的天是哪一天。可以使用并查集完成:每当某一天的蔬菜被安排满了之后就把它的父亲指向前一天,那么当前点的并查集的根就是第一个没有被安排满的天数。
最后,注意到上面的贪心是对于\(10^5\)天而言的,也就是说如果能够安排在第\(10^5\)天就一定会安排在第\(10^5\)天,但是实际上并没有那么多天。但这样的贪心是正确的,考虑:如果某一个蔬菜被安排在了第\(x+1\)天,而第\(x\)天的蔬菜没有满,那么放在第\(x\)天也是可行的。因为蔬菜数量一定不会超过\(iM\),所以我们可以把所有蔬菜全部推到前\(i\)天,也就相当于求出了有\(i\)天时的最大收益。
分身术
咕
NOI2017的更多相关文章
- LOJ_2305_「NOI2017」游戏 _2-sat
LOJ_2305_「NOI2017」游戏 _2-sat 题意: 给你一个长度为n的字符串S,其中第i个字符为a表示第i个地图只能用B,C两种赛车,为b表示第i个地图只能用A,C两种赛车,为c表示第i个 ...
- [NOI2017]蔬菜
[NOI2017]蔬菜 题目描述 大意就是有\(n\)种物品,第\(i\)个物品有\(c_i\)个,单价是\(a_i\).然后每天你可以卖出最多\(m\)个物品.每天结束后第\(i\)种物品会减少\( ...
- BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流
题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...
- [NOI2017]游戏(2-SAT)
这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...
- 【BZOJ4946】[NOI2017]蔬菜(贪心)
[BZOJ4946][NOI2017]蔬菜(贪心) 题面 BZOJ 洛谷 UOJ 题解 忽然发现今年\(NOI\)之前的时候切往年\(NOI\)的题目,就\(2017\)年的根本不知道怎么下手(一定是 ...
- [NOI2017]泳池——概率DP+线性递推
[NOI2017]泳池 实在没有思路啊~~~ luogu题解 1.差分,转化成至多k的概率减去至多k-1的概率.这样就不用记录“有没有出现k”这个信息了 2.n是1e9,感觉要递推然后利用数列的加速技 ...
- bzoj4946: [Noi2017]蔬菜 神烦贪心
题目链接 bzoj4946: [Noi2017]蔬菜 题解 挺神的贪心 把第次买的蔬菜拆出来,记下每种蔬菜到期的日期,填第一单位蔬菜比其他的要晚 按价格排序后,贪心的往前面可以填的位置填就可以了.找可 ...
- NOI2017 游记
成功在NOI2017退役……现在的我已经是一只退役狗了 结果也一直到了退役,我都还不会半平面交,不会单纯形,不会非旋转版Treap…… FWT我也不熟,分治FFT我也只写过一道板子题 但是现在已经退役 ...
- 【BZOJ4943】【NOI2017】蚯蚓排队(哈希)
[BZOJ4943][NOI2017]蚯蚓排队(哈希) 题面 BZOJ 洛谷 UOJ 题解 记得去年看网络同步赛的时候是一脸懵逼的. 昨天看到\(zsy\)做了,今天就看了看.. 这不是\(Hash\ ...
- 【BZOJ4945】【NOI2017】游戏(搜索,2-sat)
[NOI2017]游戏(搜索,2-sat) 题面 BZOJ的SPJ是假的 兹磁洛谷 题解 如果没有\(x\)地图的影响 这就是一个裸的\(2-sat\)问题 但是现在有不超过\(8\)个\(x\)地图 ...
随机推荐
- 【JZOJ6228】【20190621】ni
题目 $ n $ 个数 $ E_i $ ,$ F(i) $ 表示对1-i的数任意排列 $ p $ ,初始 $ X=0 $ ,依次执行: \(X \lt E_{p_j} \ , \ X++\) $X \ ...
- 18年今日头条笔试第一题题解:球迷(fans)
其实本题是加强版,原数据是100*100的,老师为了尊重我们的智商加成了3000*3000并进行了字符串处理…… 上原题~ 球迷 [问题描述] 一个球场C的球迷看台可容纳M*N个球迷.官方想统计一共有 ...
- mysql e的n次幂exp()
mysql> ); +-------------------+ | exp() | +-------------------+ | 2.718281828459045 | +---------- ...
- Runtime Only和Runtime + Compiler
如果你需要在客户端编译模板 (比如传入一个字符串给 template 选项,或挂载到一个元素上并以其 DOM 内部的 HTML 作为模板),就将需要加上编译器,即完整版 当使用 vue-loader ...
- Unity接入微信登录 微信分享 微信支付 支付宝SDK
你将会学到的unity集成SDK游戏中接入微信支付与支付宝支付游戏中接入微信登录与微信分享 目录 mp4格式,大小2.2GB 扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop13 ...
- docker vim右键进入visual模式无法粘贴
右键不能粘贴,反而进入了visual模式, vim版本:version 8.0.707 修改方法: vim /usr/share/vim/vim80/defaults.vim 第70行 在mouse= ...
- linux环境,无dig命令-bash: dig: command not found?
背景描述: 今天使用dig命令,报错命令不存在,-bash: dig: command not found 解决: 通过yum方式安装 yum -y install bind-utils 备注:之前尝 ...
- QStackedWidget居中布局
QStackedWidget* m_pStackedWidget= new QStackedWidget(this); QWidget* btnWidget = new QWidget; QWidge ...
- Spring cloud微服务安全实战-7-6自定义metrics监控指标(1)
自己写代码来定义一个metrics,然后让prmetheus收走,在grafana里面定义一个panel并展示出来. prometheus的四种metrics指标.虽然所有的metrics都是数字,但 ...
- oracle的jdbc 的maven配置
oracle的jdbc是需要收费,因此在maven的中心库是无法下载.有两个办法引入到工程中,一个是手工,另外一个是加入oracle自己的maven库 一.手工配置(本地依赖) 首先要下载到想要的版本 ...