整数(线段树)

不难想到按位处理,位数比较多考虑使用动态开点线段树维护大数,那么复杂度是\(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的更多相关文章

  1. LOJ_2305_「NOI2017」游戏 _2-sat

    LOJ_2305_「NOI2017」游戏 _2-sat 题意: 给你一个长度为n的字符串S,其中第i个字符为a表示第i个地图只能用B,C两种赛车,为b表示第i个地图只能用A,C两种赛车,为c表示第i个 ...

  2. [NOI2017]蔬菜

    [NOI2017]蔬菜 题目描述 大意就是有\(n\)种物品,第\(i\)个物品有\(c_i\)个,单价是\(a_i\).然后每天你可以卖出最多\(m\)个物品.每天结束后第\(i\)种物品会减少\( ...

  3. BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流

    题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...

  4. [NOI2017]游戏(2-SAT)

    这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...

  5. 【BZOJ4946】[NOI2017]蔬菜(贪心)

    [BZOJ4946][NOI2017]蔬菜(贪心) 题面 BZOJ 洛谷 UOJ 题解 忽然发现今年\(NOI\)之前的时候切往年\(NOI\)的题目,就\(2017\)年的根本不知道怎么下手(一定是 ...

  6. [NOI2017]泳池——概率DP+线性递推

    [NOI2017]泳池 实在没有思路啊~~~ luogu题解 1.差分,转化成至多k的概率减去至多k-1的概率.这样就不用记录“有没有出现k”这个信息了 2.n是1e9,感觉要递推然后利用数列的加速技 ...

  7. bzoj4946: [Noi2017]蔬菜 神烦贪心

    题目链接 bzoj4946: [Noi2017]蔬菜 题解 挺神的贪心 把第次买的蔬菜拆出来,记下每种蔬菜到期的日期,填第一单位蔬菜比其他的要晚 按价格排序后,贪心的往前面可以填的位置填就可以了.找可 ...

  8. NOI2017 游记

    成功在NOI2017退役……现在的我已经是一只退役狗了 结果也一直到了退役,我都还不会半平面交,不会单纯形,不会非旋转版Treap…… FWT我也不熟,分治FFT我也只写过一道板子题 但是现在已经退役 ...

  9. 【BZOJ4943】【NOI2017】蚯蚓排队(哈希)

    [BZOJ4943][NOI2017]蚯蚓排队(哈希) 题面 BZOJ 洛谷 UOJ 题解 记得去年看网络同步赛的时候是一脸懵逼的. 昨天看到\(zsy\)做了,今天就看了看.. 这不是\(Hash\ ...

  10. 【BZOJ4945】【NOI2017】游戏(搜索,2-sat)

    [NOI2017]游戏(搜索,2-sat) 题面 BZOJ的SPJ是假的 兹磁洛谷 题解 如果没有\(x\)地图的影响 这就是一个裸的\(2-sat\)问题 但是现在有不超过\(8\)个\(x\)地图 ...

随机推荐

  1. P2340 奶牛会展 DP 背包

    P2340 奶牛会展 DP \(n\)头牛,每头牛有智商\(s[i]\)情商\(f[i]\),问如何从中选择几头牛使得智商情商之和最大 且 情商之和.智商之和非负 \(n\le 400,-10^3\l ...

  2. 洛谷 P4779 【模板】单源最短路径(标准版) 题解

    P4779 [模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 100 ...

  3. (LIS)最长上升序列(DP+二分优化)

    求一个数列的最长上升序列 动态规划法:O(n^2) //DP int LIS(int a[], int n) { int DP[n]; int Cnt=-1; memset(DP, 0, sizeof ...

  4. Python TIPS上一道关于人民币金额小写转大写的题

    人民币金额打印 题目链接:here.我发现我写的好复杂,但万幸编码还算符合人类,看了其他答案,感觉都是天书. #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  5. 前端如何搭建vue UI组件库/封装插件(从零到有)

    需求 因之前是做外包项目居多,经常用到相同的组件,之前的办法是在一个项目中写一个组件,其他项目直接将compents下的组件复制,粘贴到项目中使用,缺点是维护起来,改一个项目,其他项目也需要修改,所以 ...

  6. Shiro安全框架-简介

    1. 简介 Apache Shiro是Java的一个安全框架.功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案. 实际上,Shiro的主要功能 ...

  7. ICEM-三棱锥的一种画法

    原视频下载地址:https://pan.baidu.com/s/1c4BAqy 密码: nqb4

  8. 微信小程序之网络通信

    关于网络通信,这里我使用的是wx.request,官方代码示例如下: wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '', y: ...

  9. layui如何自定义弹出层关闭事件

    在某些业务场景下,我们需要自定义弹出层关闭事件,代码示例如下: layui.use('layer', function () { var layer = layui.layer; layer.open ...

  10. java 73题以及答案

    作者:乌枭原文:https://blog.csdn.net/qq_34039315/article/details/78549311 1.在java中守护线程和本地线程区别? java中的线程分为两种 ...