省选模拟赛乱改

news/2025/2/22 20:57:50/文章来源:https://www.cnblogs.com/abnormal123/p/18731383

省选模拟赛乱改

好长时间不写博客了,发篇题解证明我还活着。

游戏

给定一个正整数序列,每次在非零的元素中等概率选一个,使其减一,进行 \(m\) 次操作后,问 \(0\) 的期望个数。 $ n \le 15 , m\le 200 $

赛时多一个等号保龄了,哈哈哈

考虑状压DP,设 $ f_{i,S} $ 为第 \(i\) 次操作后,序列状态为 \(S\) (是否为0)的概率,有转移:

\[f_{i,S} = \frac{f_{i-1,S}}{count(S)} + \sum_{j \in S} \frac{f_{i-1,S / {j}}}{count(S)-1} \times \binom { i-1+a_j-a_S } { a_j-1 } \]

其中组合数是确定使某一个元素变成零的操作位置。对于没有对状态产生贡献的操作,最后要统计一下方案数,包含相对位置和数量,注意边界,跑一遍背包即可。

容易发现这样做是正确的。

总复杂度 $ O(2^n n m^2) $ ,瓶颈在于背包,实际跑不满,也许可以证明最劣复杂度正确。

排序

考虑一种反人类的排序:

  1. 从排列的开头开始,判断每一对相邻的数是否大小关系正确。
  2. 如果存在相邻的一对数大小关系不正确:
    把较小的那个数丢到排列开头。回到步骤一。
  3. 排列有序了,结束。

现在给定步骤二的操作次数 \(K\) ,要求构造一个字典序最小的排列满足步骤二进行了恰好 \(K\) 次。 $ K\le 10^{18} $

对于一个上升前缀,如果后一个元素不满足单调递增,那么它产生的贡献为 $ 2^k $ ,其中k是在这之前比它小的元素个数。证明是显然的,归纳即可。

构造有些小清新。

二进制拆分,从低往高位枚举,维护一个栈。若当前为1,将未使用的最小值压入栈,次小值输出;若当前为0,如果栈非空,输出栈顶,否则输出最小值。

证明就是对于每一个1,之前都输出了足够多的小于它的元素,并且以后不会再增加。

送信

诈骗题。

初始时有 \(n\) 个空信箱,排成一排,以如下方式送 \(m\) 封信:

随机选择一个信箱,在随机一个方向(左或右),从该信箱出发向该方向移动,遇到第一个空信箱就把信放入,结束。若没有空信箱就把信撕毁。

问所有信都送出的方案数。

考虑看成一个环,就是求不经过第 \(n+1\) 个点的方案数。

发现方案数很难做,改为求概率。如果最终的信箱确定,那么这些信箱没有区别。

总方案 $ (1-\frac{m}{n+1}) (2n+2)^{m} $

逆序对

原题P5972

一个长度为 \(n\) 排列,对于每个 $ k \in [1,n] $ ,找到长度为 \(k\) 的逆序对数量最少的子序列,求最小值和方案数。

原题范围 $ n\le 40 $ ,时限6s

注意到数据范围很小,考虑优化状压DP。

首先,$ O(2^n n) $ 的DP是显然的,考虑对它优化。思考,我们需要状压的原因是,后续选择的贡献与之前的状态有关,充分发扬人类智慧,发现后续未确定状态的位置把已选择的元素划分成若干段,我们不关心每个段内具体状态,只需要知道每个段包含元素个数。

举例来说,假设我们选择了 $ 1,7,3,4 $ ,未确定状态的是 $ 2,6 $ ,划分成三段 $ [1] , [3,4] , [7] $ 。考虑对状态再次压缩。

假设划分成 $ m $ 段,第 \(i\) 段元素个数为 $ x_i $ ,则复杂度为 $ O( \prod x_i n ) $ ,显然每段相等时复杂度最劣,设每段元素个数均为 \(s\) ,考虑 \(s\) 取何值使得 $ s^{\frac{n}{s}} $ 最大。

\(n\) 对单调性没有影响,先不理,对原式取自然对数,单调性不变,即 $ \frac1{s} ln(s) $ ,求导发现(我还不会求导,长大后再来探索吧),是个单峰函数,当 $ s=e $ 时取最大值,令 $ s \in N $ ,最大为 $ 3^{\frac{n}{3}} $

将状态压成一个整数即可,会多带一个n,复杂度 $ O(3^{\frac{n}{3}} n^2) $ 。需要卡常。

CODE
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
typedef long long ll;
const int N=42;
const int M=5e6+40;
int n,a[N],d[N],c[N],g[N],h[N],w[N][N],siz[N];
ll ans[N][N*N];
struct Hash_Table{int num[M],maxn;ll val[M];void ins(int x,int y,ll z){if(val[x]){if(num[x]>y)num[x]=y,val[x]=z;else if(num[x]==y)val[x]+=z;}else {maxn=max(maxn,x);num[x]=y;val[x]=z;}}
}f[2];
inline void get1(int x,int id){if(id==0){memset(g,0,sizeof(int)*(n+1));return ;}for(int i=0;i<siz[id];i++){g[i]=x%w[id][i];x/=w[id][i];}
}
inline int get2(int id){int res=0;for(int i=siz[id]-1;i>=0;i--){res=res*w[id][i]+h[i];}return res;
}
inline void get3(int len,int y){for(int i=0,j=0;i<len;i++){if(i==y)h[j-1]+=g[i];else h[j++]=g[i];}
}
signed main()
{// freopen("q.in","r",stdin);// freopen("q.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){memcpy(c,a,sizeof(c));sort(c+i+1,c+n+1);if(i+1<=n)w[i][siz[i]++]=c[i+1];for(int j=i+2;j<=n;j++)w[i][siz[i]++]=c[j]-c[j-1];if(i==n)w[i][siz[i]++]=n+1;else w[i][siz[i]++]=n-c[n]+1;}for(int i=n;i>=1;i--){d[i]=1;for(int j=i+1;j<=n;j++){if(a[j]<a[i])d[i]++;}}f[0].ins(0,0,1);for(int i=1,flag=1;i<=n;i++,flag^=1){for(int it=0;it<=f[flag^1].maxn;it++){if(f[flag^1].val[it]){get1(it,i-1);int c=f[flag^1].num[it],s=0;for(int j=d[i];j<n-i+2;j++)s+=g[j];get3(n-i+2,d[i]);f[flag].ins(get2(i),c,f[flag^1].val[it]);h[d[i]-1]++;f[flag].ins(get2(i),c+s,f[flag^1].val[it]);f[flag^1].num[it]=f[flag^1].val[it]=0;}}f[flag^1].maxn=0;}for(int it=0;it<=f[n&1].maxn;it++){if(f[n&1].val[it]){get1(it,n);int s=0,c=f[n&1].num[it];s+=g[0];ans[s][c]+=f[n&1].val[it];}}for(int i=1;i<=n;i++){for(int j=0;j<=i*i;j++){if(ans[i][j]){printf("%d %lld\n",j,ans[i][j]);break;}}}
}

发烧

给定 $ n $ 个字符串 $ s_i $ 和一个整数 \(k\) ,求每个字符串有多少子串在至少 \(k\) 个字符串出现过。 $ \sum | s_i | \le 10^5 $

SA都快忘干净了。

考虑把所有字符串拼在一起,中间插入互不相同的特殊字符。

对于每个后缀二分答案,判断一个答案是否合法,就是在一个区间内数颜色,判断颜色数是否不小于 \(k\) 。复杂度为 $ O(n \log^2 n) $

使用双指针似乎可以做到 $ O(n\log n) $

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888166.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek宣布下周开源5大项目,这才是真OpenAI!

近日,DeepSeek 团队宣布将在下周连续开源 5 个项目。这一举措不仅吸引了众多开发者的目光,还在技术社区引发了热烈讨论,不少网友甚至将 DeepSeek 誉为 “真正的 OpenAI”。一、DeepSeek开源计划详情(一)开源时间与方式DeepSeek团队决定开展“OpenSourceWeek”(开源周)活…

NOIP 2024 游记 | Loser.

Loser. p.s. 本文章比较废话()Day 1 早上 6:30 被拽起来了。吃饭。出门。坐地铁。到! 华科大门,比,华师气派多了诶诶。扯了个横幅,拍照。拍照。拍照。 诶诶,怎么 7:45 就拽着我们进去了。 进考场。我怎么是第一排第一个 /jk 看见了 @Hakureireimu_cjrljpx,但是他不认识…

利用 vscode 进行远程开发

打开远程项目路径在远程服务器上安装 vscode 插件 Go、GitLens、Git History、Git Graph、MarsCode AI对于本地已经安装的插件,点击Install In SSH:xxx就能把插件安装到远程服务器对于本地没有安装的插件,直接查找插件,选中安装,即是安装到远程服务器git 不高亮显示修改行从…

查看Oracle的数据库表命令

在 Oracle 里 “数据库” 的概念和其他数据库系统有所不同,Oracle 一个实例通常对应一个数据库,但可以包含多个不同的模式(类似于其他数据库系统中的用户数据库)1. 查看数据库名称你可以在 SQL*Plus 或者 SQL Developer 等工具中执行如下 SQL 语句:SELECT name FROM v$dat…

Linux 中declare命令详解

Linux 中declare命令001、普通测试[root@PC1 dir1]# ls [root@PC1 dir1]# echo $var1[root@PC1 dir1]# var1="hello world" [root@PC1 dir1]# echo $var1 hello world [root@PC1 dir1]# var1=100.55 [root@PC1 dir1]# echo $var1 100.55 [root@PC1 dir1]# var1=100 […

《软件开发与创新课程设计》第一次课后作业——对学生选课系统的改进

(1)博客介绍 本文的学生选课系统的源码来自于csdn的一篇博客当中。该系统的实现语言以C++为主,本文的主要内容围绕该系统进行分析,并针对系统的主要问题进行一些修改或重构。 本篇如有问题存在,请各位读者多多指正! (2)学生选课系统分析 源代码如下: 点击查看代码 #de…

pikachu unsafe Fileupload

在上传点上传非法文件,提示上传文件不符合要求,且BP没有新的数据包产生,判断为客户端检查禁用浏览器JavaScript后刷新网页,再次上传文件,提示上传成功,文件路径为uploads/test.phpedge: 设置->Cookie和网站权限->所有权限->Javascript->禁用 Chorme:设置-&g…

rust学习十九.1、模式匹配(match patterns)

本章节大概是书本上比较特殊一个,因为它没有什么复杂的内容,通篇主要讨论模式匹配的语法。 一、两个名词a.可反驳 - refutable 对某些可能的值进行匹配会失败的模式被称为是 可反驳的(refutable) let Some(x) = some_option_value;如果 some_option_value 的值是…

大对数电缆打线顺序

5种线缆主色:白色、红色、黑色、黄色、紫色 5种线缆配色:蓝色、橙色、绿色、棕色、灰色 25对电话电缆色谱线序表30对电话电缆色谱线序 这里要特别说明下:30对的电话电缆要注意了,30对通信电缆里有2种白色的主色,大于25对了就一定要看标识线了!!有一小把是用“白蓝"…

01-springsecurity数据库登录

01 - SpringSecurity实现数据库登录 环境: springboot 3.4.2, springsecurity 6.4.2, mybatis 3.0.4springsecurity中的UserDetails接口用于表示用户信息, 包含用户名、密码等信息。UserDetailsService接口用于加载用户信息, 里边就这一个方法 public interface UserDetailsSer…

【喜与悲】- 2025.2.22 晚

下图为《Balatro》中的一张小丑牌:【喜与悲】喜与悲可以重新触发所有打出的人头牌,是重新触发家族中的一员。但其特性也决定了其强度方差极大,有配合则强度很高,没有配合则纯浪费小丑位。但很少有小丑能与其配合,而能与其配合的小丑大多单独拎出来又不强。更多时候其几乎只…

莫队算法学习笔记

莫队算法的发明者是一个叫做 莫涛 的人,所以被称为莫队算法,简称莫队。 英语 Mos algorithm。 使用场景 莫队算法常常被用来处理多次区间询问的问题,离线处理询问(必须满足!!!)。 插叙:离线是一种得到所有询问再进行计算的方法,是很重要的思想。 对于这种“区间询问”…