k-1

【LGR-060】洛谷10月月赛 I

99封情书 提交于 2019-12-01 07:26:13
A - 打字练习 出题:memset0 送分模拟题,按题意模拟即可。 需要注意的是对退格键的判断,如果光标已经在行首,则直接忽略被读入的退格键。 B - 小猪佩奇爬树 出题:_QAQ 维护所有相同节点颜色的链并,若不构成一条链则显然答案为 $ 0 $ 。 若仅包含 $ 1 $ 个节点,则枚举所有子树大小进行统计。 否则即为链的 $ 2 $ 个端点所对子树大小的乘积。 C - 小猪佩奇玩游戏 出题:_QAQ & SPJ:memset0 容易发现可以将 $ {1,2,\dots,n} $ 进行分组,不同组别的答案是独立的。 举个栗子,对于 $ {1,2,3,4,5,6,7,8,9} $ ,可以将数字分为 $ {1},{3,9},{2,4,8},{5},{6},{7} $ 容易发现这些组别之间互不干扰且互不影响,所以只需要计算每个组别独立的期望值并进行相加即可 那么最终答案即为 \[ \sum_{i=1}^{\infty} f_i \times g_i \] 其中 $ f_i $ 表示大小为 $ i $ 的组别个数, $ g_i $ 表示大小为 $ i $ 的组别期望删除多少次,我们分别来计算 先来计算 $ f_i $ ,显然大小至少为 $ i $ 的组别个数为 $ \sqrt[i]{n} $ 对于 $ 1 $ 个大小为 $ x $ 的组别,其为在大小为 $ y $ 的组别中出现 $

洛谷10月月赛I官方答案(转载)

我只是一个虾纸丫 提交于 2019-12-01 07:23:45
转载自memset0的博客 A - 打字练习 出题:memset0 送分模拟题,按题意模拟即可。 需要注意的是对退格键的判断,如果光标已经在行首,则直接忽略被读入的退格键。 B - 小猪佩奇爬树 出题:_QAQ 维护所有相同节点颜色的链并,若不构成一条链则显然答案为 $ 0 $ 。 若仅包含 $ 1 $ 个节点,则枚举所有子树大小进行统计。 否则即为链的 $ 2 $ 个端点所对子树大小的乘积。 C - 小猪佩奇玩游戏 出题:_QAQ & SPJ:memset0 容易发现可以将 $ {1,2,\dots,n} $ 进行分组,不同组别的答案是独立的。 举个栗子,对于 $ {1,2,3,4,5,6,7,8,9} $ ,可以将数字分为 $ {1},{3,9},{2,4,8},{5},{6},{7} $ 容易发现这些组别之间互不干扰且互不影响,所以只需要计算每个组别独立的期望值并进行相加即可 那么最终答案即为 $$ \sum_{i=1}^{\infty} f_i \times g_i $$ 其中 $ f_i $ 表示大小为 $ i $ 的组别个数, $ g_i $ 表示大小为 $ i $ 的组别期望删除多少次,我们分别来计算 先来计算 $ f_i $ ,显然大小至少为 $ i $ 的组别个数为 $ \sqrt[i]{n} $ 对于 $ 1 $ 个大小为 $ x $ 的组别,其为在大小为 $

卡特兰数的递推公式推导

走远了吗. 提交于 2019-11-30 19:40:06
今天做acm题时碰到了卡特兰数,于是就上百度查了卡特兰数的解释,其中有这么一段: 出栈次序 一个 栈 (无穷大)的 进栈 序列为1,2,3,…,n,有多少个不同的 出栈 序列? 常规分析 首先,我们设f(n)=序列个数为n的出栈序列种数。同时,我们假定,从开始到栈第一次出到空为止,这段过程中第一个出栈的序数是k。特别地,如果栈直到整个过程结束时才空,则k=n 首次出空之前第一个出栈的序数k将1~n的序列分成两个序列,其中一个是1~k-1,序列个数为k-1,另外一个是k+1~n,序列个数是n-k。 此时,我们若把k视为确定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的f(n)=f(k-1)×f(n-k)。而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)。 看到此处,再看看卡特兰数的递推式,答案不言而喻,即为f(n)=h(n)= C(2n,n)/(n+1)= c(2n,n)-c(2n,n+1)(n=0,1,2,……)。 最后,令f(0)=1,f(1)=1。 其中提到首次出空之前第一个出栈的序数k,k把序列分成了1~k-1和k+1~n两个部分,把k作为序数时f(n)=f(k-1

【BZOJ】P2448 挖油

陌路散爱 提交于 2019-11-30 19:01:29
区间dp+决策单调性 题目链接 part1.朴素dp 记 \(dp[l][r]\) 表示l到r这个区间最坏情况下的最小花费。 那么考虑在 \([l,r]\) 中任选一个点k挖,此时有两种情况: 1.k点有油,那么后续代价就是 \(dp[k+1][r]\) 2.k点没有油,那么后续代价就是 \(dp[l][k-1]\) 显然,为了使情况最坏,我们要在 \(dp[k+1][r]\) 和 \(dp[l][k-1]\) 中取最大值。 而 要使最坏情况下花费最小 ,我们要在所有k中取最小值。 那么,转移方程就是: \[ dp[l][r]=min\{max\{dp[l][k-1],dp[k+1][r] \}+A[k]\} k\in[l+1,r-1] \] 其中 \(A[i]\) 表示在点i勘测是否有油的花费。 这样,就有一个 \(O(n^3)\) 朴素dp了,期望得分30分。 part2.决策单调性优化 我们要的是 \([l,r]\) 的最小值,所以应该是维护单 调递增的 队列。 但还有一个问题,转移方程中有 \(max\{dp[l][k-1],dp[k+1][r] \}\) ,我们要想办法把这个max消掉。 那如何消去max呢? 我们维护一个k,使得 \(dp[l][k-1]\) 刚好大于 \(dp[k+1][r]\) 或者 \(dp[k+1][r]\) 刚好大于 \(dp[l][k-1]\

LeetCode 611. Valid Triangle Number

依然范特西╮ 提交于 2019-11-29 18:05:51
和3Sum那题非常类似。3Sum我们是固定i,令j=i+1, k=n-1。 本题由于三角形需要两边之和大于第三边,nums[i]+nums[j]>nums[k]。因此我们可以固定k,令i=0, j=k-1。 如果nums[i]+nums[j]>nums[k],说明 [i,j-1] 范围内的所有数作为i,加上j和k都是可以的。 反之如果nums[i]+nums[j]≤nums[k],那我们必须增加nums[i],和才会增大。 class Solution { public: int triangleNumber(vector<int>& nums) { int n=nums.size(); int res=0; sort(nums.begin(),nums.end()); for (int k=n-1;k>=0;--k){ int i=0, j=k-1; while (i<j){ if (nums[i]+nums[j]>nums[k]){ res += j-i; --j; }else{ ++i; } } } return res; } }; 时间复杂度 O(n^2) Reference https://leetcode.com/problems/valid-triangle-number/discuss/128135/A-similar-O(n2)-solution-to-3-Sum

计算机网络谢希仁第六版第一章课后第十题疑惑求解

陌路散爱 提交于 2019-11-29 11:17:13
计算机网络谢希仁第六版第一章课后第十题疑惑求解 我的疑惑是:为什么分组交换时,中间的处理时延是(k-1) (p/b)而不是(k-1) (x/p)*(p/b) 我的理解是:因为有x/p个包,每个包经过k-1个节点进行存储转发,每一次的存储转发时间为p/b 欢迎大家讨论,更欢迎大神指点 来源: https://blog.csdn.net/colibytwo/article/details/100797609

状态压缩

痴心易碎 提交于 2019-11-28 23:05:27
定义 状态压缩,实际上是将一个30左右长度的bool数组用一个int来表示。为什么呢?众所周知,bool类型只有0,1两种两种类型。而计算机又是用二进制来存储数字,加之强大的位运算功能,我们便可以更改整数在二进制下表示的每一位的数字,来表示不同的状态。由于其与位运算密切相关,所以我们先来讨论一下位运算的事情。 位运算 不做演示,可以自行演示验证 S是原集合 S&(1<<(k-1)) 取出第k位 ^ 将第k位取反 | 将第k位强制变1 S^(1<<k-1) 取补集 S&(-S) 取出右起第一个1 ,减掉这个结果数就更新状态 lowbit S|A==S A是S的子集 for(x=s;x;s&(x-1) 枚举子集 来源: https://www.cnblogs.com/Uninstalllingyi/p/11432672.html

博弈进阶

久未见 提交于 2019-11-28 22:53:22
斐波那契博弈: 1.有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗; 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。 约定取走最后一个石子的人为赢家,求必败态。 2.结论:当n为Fibonacci数的时候,必败。 f[i]:1,2,3,5,8,13,21,34,55,89…… 3.证明: 为了方便,我们将n记为f[i]。 1、当i=2时,先手只能取1颗,显然必败,结论成立。 2、假设当i<=k时,结论成立。 则当i=k+1时,f[i] = f[k]+f[k-1]。 则我们可以把这一堆石子看成两堆,简称k堆和k-1堆。 (一定可以看成两堆,因为假如先手第一次取的石子数大于或等于f[k-1],则后手可以直接取完f[k],因为f[k] < 2*f[k-1]) 对于k-1堆,由假设可知,不论先手怎样取,后手总能取到最后一颗。下面我们分析一下后手最后取的石子数x的情况。 如果先手第一次取的石子数y>=f[k-1]/3,则这小堆所剩的石子数小于2y,即后手可以直接取完,此时x=f[k-1]-y,则x<=2/3*f[k-1]。 我们来比较一下2/3*f[k-1]与1/2*f[k]的大小。即4*f[k-1]与3*f[k]的大小,对两值作差后不难得出,后者大。 所以我们得到,x<1/2*f[k]。 即后手取完k

HDU6651 Final Exam

回眸只為那壹抹淺笑 提交于 2019-11-28 22:45:29
题意 n个题一共m分,出题人可以任意分配每个题的分数,对于x分的题,需要复习x+1分钟,问如果能做出k道题最少需要几分钟。 思路 利用田忌赛马的思路,出题人至少要赢下n-k+1局,最优策略是先用0分的题和最大的k-1个数比较,集中兵力赢下n-k+1局,作为做题人,我们如果想要阻止出题人,需要在最少的n-k+1个题分配m+1分钟,这样无论如何出题人用m分钟无法赢下这n-k+1局。问题转化为如何用最小的时间,使得任意k个数的和大于等于m+1。令x=(m+1)/(n-k+1),若不能整除,剩下k-1个数填x+1,否则剩下k-1个数填x就足够了。 代码 #include<bits/stdc++.h> using namespace std; typedef long long LL; LL n,m,k; int main() { int T; scanf("%d",&T); while (T--) { scanf("%lld%lld%lld",&n,&m,&k); LL x=(m+1)/(n-k+1); LL ans; if ((m+1)%(n-k+1)==0) ans=(k-1)*x+m+1; else ans=(k-1)*(x+1)+m+1; printf("%lld\n",ans); } return 0; } 来源: https://www.cnblogs.com

k进制FWT学习笔记

陌路散爱 提交于 2019-11-28 19:51:22
从线性代数角度看快速变换 考虑我们现在对两个幂级数 A , B A,B A , B 定义运算 ∗ * ∗ : 假设 A ∗ B = C A*B=C A ∗ B = C ,那么要求满足 C k = ∑ i ⊕ j = k A i B j C_k=\sum\limits_{i\oplus j=k}A_iB_j C k ​ = i ⊕ j = k ∑ ​ A i ​ B j ​ ,现在给出 A , B A,B A , B ,要求快速求出 C C C 。 于是我们考虑构造矩阵 f f f 满足 ( f ∗ A ) ∗ ( f ∗ B ) = ( f ∗ C ) (f*A)*(f*B)=(f*C) ( f ∗ A ) ∗ ( f ∗ B ) = ( f ∗ C ) 且 f f f 可逆,那么现在只需快速求出 f ∗ A , f ∗ B , f − 1 ( f ∗ C ) f*A,f*B,f^{-1}(f*C) f ∗ A , f ∗ B , f − 1 ( f ∗ C ) 即可。 不难发现当 ⊕ \oplus ⊕ 为加法时我们的 f f f 即是系数表示法到点值表示法的转移矩阵。 现在考虑推导 K K K 进制 F W T FWT F W T 的系数矩阵: 不妨设 n = K i − 1 n=K^i-1 n = K i − 1 ,那么有 ( f ∗ A ) [ x ] ∗ ( f ∗ B )