杂题口胡

$Bitwise\ Xor$:给定一个长度为$n$的整数序列$a$和一个整数$k$,求$a$有多少子序列,两两异或值大于等于$k$。$n \leq 3e5,k<2^{60}$

题解:发现两两异或值的最小值一定是排序后相邻的两个数,首先把$a$排序,设f[i]表示以i结尾的序列个数。用$trie$树优化$dp$,$trie$上每个节点维护子树$f$值的和,根据当前位要大于$x$应该是$0$还是$1$向下递归。$f[i]=query(a[i],x)+1$。加上他自己单独成串。$O(nlogk)$

$MOD\ Problem$:T组询问,给定$n$,求$\sum \limits_{i=1}^{n} n\ mod\ i$。$T\leq 1e6,1\leq n\leq 1e7$

题解:$\sum \limits_{i=1}^{n} n\ mod\ i=\sum \limits_{i=1}^{n}n-\left \lfloor \frac{n}{i} \right \rfloor*i=n^2-\sum \limits_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor*i$。有$\sum \limits_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor*i=\sum \limits_{i=1}^{n}=d(i)\ \ \ \ d(i)$表示$i$的约数和。线筛在求前缀和即可。$O(T+n)$

平方串:定义平方串当且仅当这个串非空且它可以有两个相同的串连在一起而成。先有一个长度为$n$的串$s$,随机取出一个非空子串,若这个子串没有前导$0$且为平方串,贡献为串的数值,否则贡献为$0$,求取出的子串的贡献的期望。$1 \leq s[i] \leq 9$,$n \leq 5e5$。

题解:有一个经典的套路:插点法。具体就是枚举平方串的长度$2*len$,然后把原串每$len$个插一个关键点,则平方串最多会跨越两个关键点。枚举两个关键点的三段字符串,求前两个串的最长公共后缀,后两个串的最长公共前缀,发现平方串的左端点可以在一个$[l,r]$区间里滑动(建议画图理解)。预处理出$f[i]=f[i-1]*10+s[i]$,那么$[i,j]$构成的数就是$f[j]-f[i-1]*10^{j-i+1}$,处理一个前缀和。那么可以很容易得到平方串的前一半的贡献$sum$,那么最终贡献为$sum*10^{len}+sum$。前导$0$的情况:在处理f的时候如果$s[i+1]==0$,那么$f[i]=0$。因为处理的是平方串的前一半,那么$i+1$就等于这个串的开头,直接把f值设为$0$就不会考虑到了。复杂度调和级数$O(nlnn)$

先整几个高考数学的概率公式:

$P(A|B)$表示在$B$发生的条件下发生$A$的概率,$P(AB)$表示$A$和$B$同时发生的概率。

全概率公式:假设$B_1,B_2...B_k$是基本事件的一个分割,则$P(A)=\sum \limits_{i=1}{k}P(A|B_i)*P(B_i)$

条件概率:$P(A|B)=\frac{P(AB)}{P(B)}$

贝叶斯公式:$P(A|B)=\frac{P(AB)}{P(B)}=\frac{P(B|A)P(A)}{P(B)}$

$Conjugate$:有$n$堆石子,第$i$堆石子有$a_i$个,每次等概率随机选择一个石子把其所在的那一堆全部丢掉,求期望多少次后第$1$堆石子被丢掉。$n \leq 1e6,a_i \leq 1e9$

题解:期望的线性性。考虑第$i$堆石子$(i>1)$在第一堆石子被丢掉前被丢掉的概率为$\frac{a[i]}{a[i]+a[1]}$,对答案的次数贡献为$1$,所以$ans=\sum \limits_{i=2}^{n} \frac{a[i]}{a[i]+a[1]}\ \ +1$。加一是丢$a_1$的那一次。$O(n)$

湖人:数$1~n$,每次随机选择一个还未被删去的数$x$,把包括自己在内的所有倍数删去,求期望多少次之后所有数都被删掉。$1 \leq n \leq 1e9$

题解:同上,考虑期望的线性性。对于数$x$,被自己删掉的概率为$\frac{1}{d(x)}$。每删一次对答案贡献$1$,所以$ans=\sum \limits_{i=1}^{n}\frac{1}{d(i)}$。$n$很大,用个$min25$筛(我还不会好可怕)。

$Game\ with\ Marbles$:袋子里有$R$个红球,$G$个绿球和$B$个蓝球。每回合随机等概率从袋子中取出一个球。如果是红球,就扔掉;如果是绿球或蓝球,就放进袋子里。已知当前刚好拿出了第$K$个蓝球,求期望经过的回合数。$1\leq R,G,B,K \leq 1e9$

题解:(充分认识到自己在概率上有多白痴,不是很明白,超级感性,可能有错)瞎写:期望回合数$=$期望拿过的球个数$=$红球个数期望$+$蓝球个数期望$+$绿球个数期望。期望的线性性可以分别求在求和。拿出了$K$个蓝球,所以期望拿出$K$个蓝球。考虑每摸到一个蓝球前摸到了期望摸到几个绿球,这时候可以不考虑红球,(红的拿就拿了没影响),所以列出方程$E= \frac{G}{B+G}*(E+1)$,解得$E=\frac{G}{B}$。所以一共期望摸了$\frac{KG}{B}$个绿球。考虑对于每个红球摸出他的概率,发现不太好算,所以反过来,求每个球没被摸到的概率:同样也是可以只考虑所有的蓝球和这一个红球,红球一直没被拿,所以这$K$次都是拿的蓝球。一次拿到蓝球的概率为$\frac{B}{B+1}$,$K$次后这个红球都没被摸到的概率为$(\frac{B}{B+1})^K$。所以一个红球被摸到的概率就是$1-(\frac{B}{B+1})^K$。每个红球都是独立的,所以摸到的红球的期望是$(1-(\frac{B}{B+1})^K)*R$。(理解不深,可能是错的...)

$UOJ$#$299$游戏:$N$局游戏,给定首局两个人分别获胜的概率,当第$i − 1$局小$R$获胜时,第i局小$R$获胜的概率为$P_i$;当第$i-1$局小$B$获胜时,第$i$局小$B$获胜的概率为$Q_i$。$M$次动态插入或删除一些已知的比赛结果,求小$R$获胜总局数的期望。$1 \leq N,M \leq 2e5$

题解:期望线性性$+$贝叶斯公式。每局游戏一定只与两边已确定的结果有关。这样就划分出来了若干个区间,$M$次修改相当于把两个区间合并或把一个区间分成两个区间。假设当前$X$的两边已确定的事件是$A,B$。根据条件概率,有$P(X|(A \bigcap B))=\frac{P(X \bigcap A \bigcap B)}{P(A \bigcap B)}=\frac{P((X \bigcap B)|A)P(A)}{P(B|A)*P(A)}=\frac{P((X \bigcap B)|A)}{P(B|A)}$。然后用线段树维护矩阵乘维护分子分母。

$AGC035D$:长度为n的序列$a$,每次可以选择其中连续三项,依次为$a,b,c$,将其替换为$a+b$,$b+c$两项。求最终剩下的两个数的和的最小值。$2\leq n\leq 1e9$

题解:首先题目里的操作还可以看做是选择一个数,把他的权值加到左右两项上,并把他删去。发现最后答案是每个数算了若干次。倒着考虑这个过程,发现$1,n$位置上的数一定只算了$1$次,倒数第二个删掉的数算了两次...所以每个数计算的次数为左边第一个在他之后删除的次数$+$右边第一个在他之后删除的次数。考虑记忆化搜索。$solve(l,r,cntl,cntr)$表示区间$(l,r)$,$l$计算$cntl$次,$r$计算$cntr$次。$f[l][r][cntl][cntr]=\min \limits_{l<i<r}{solve(l,i,cntl,cntl+cntr)+sovle(i,r,cntl+cntr,cntr)}$。

$CF765F$:给定一个长度为$n$的序列,有$m$次询问,每次给定一个区间$[l, r]$,求$\min \limits_{l \leq i<j\leq r}{|A_i−A_j|}$。$n\leq 2e5,m \leq 3e5$

题解:线段树。这种题见过好几次了好像,或者原题?记不清了。 不要求强制在线,离线下来按$r$排序,用线段树动态维护当前点为右端点时的答案。绝对值不好处理,所以只考虑$j<i$且$a[j]\geq a[i]$的情况,另一种情况倒过来再来一遍就好。现在要把右端点从$a[i-1]$移到$a[i]$,考虑$a[i]$的加入带来的影响。找到$i$左边第一个大于$a[i]$的位置$pos$,更新$pos$位置的答案。对于$k<pos$,如果$a[k]\geq a[pos]$,那么$k$和$pos$之间的答案一定比$k$与$i$之间的答案优,且能取到$k$的话一定就能取到$pos$。对于$a[k]<a[pos]$,设$mid=(a[i]+a[pos])>>1$,如果$a[k]>mid$,$k$和$pos$的答案会在反向的时候计算不用管;所以就只需要考虑$a[k] \leq mid $的情况,每次区间长度会$/2$,一直处理下去就好了。复杂度$O(nlognloga_i)$

$operation$:好像做过?分块大法好。

原文地址:https://www.cnblogs.com/jrf123/p/12651469.html

时间: 2024-11-08 22:32:59

杂题口胡的相关文章

DP杂题2

1.邦邦的大合唱站队 https://www.luogu.org/problem/show?pid=3694 XY说这是道简单的签到题,然后我大概是普及组都拿不到三等的那种了.. 插入题解.写得太好了,不刊之论,orzSXY大佬 http://www.cnblogs.com/Serene-shixinyi/p/7475529.html 一开始不知道为什么这样转移是对的,可能是这几天写(划)题(水)脑子坏掉了,觉得要枚举1的个数为1的,再枚举为2的,再枚举为3的.. (噫突然想了想这样好像也不会T

迷茫之中的口胡

WC冬眠营无聊之余,自己想了很多,想了很多自己的oi生活,想了很多自己,迷茫之中来口胡一些.     我觉得自己初三之前的oi经历都是挺顺利的,初一接触oi,初二下学期正式开始搞oi,初一普及组国一,初二提高组国一,并差一点进省队,初三成功进入省队.      然而noi因为一个字母的打错,造成了少了60分的悲剧,而看着同学们都不错的成绩,心里还是有一些失落.高一noip考试,我本带着信心去考试,却发现day1T3少考虑条件而少60分,day2T3竟然出现想得不在点上的情况,出了考场立马想出来的

Topcoder口胡记 SRM 562 Div 1 ~ SRM 592 Div 1

传送门:https://284914869.github.io/AEoj/index.html Topcoder SRM 562 Div 1 - Problem 1000 InducedSubgraphs 当K*2<=N的时候,显而易见的是编号为i(K<=i<=N-K+1)的点一定会形成一条链. 枚举合法的这样的链,剩下的暴力dp吧. 当K*2>N的时候,显而易见的是编号为i(N-K+1<=i<=K)的点一定会形成一个联通快. 如果把这个联通块去掉,树会形成若干个不相交

口胡提交记录

为了偷懒提高刷题效率,有些题目只做口胡,并在此整理. 1.19 CF1101D GCD Counting pro:https://www.luogu.org/problemnew/show/CF1101D sol:https://www.cnblogs.com/Creed-qwq/p/10293719.html 原文地址:https://www.cnblogs.com/Creed-qwq/p/10293731.html

【最小生成树杂题】

这里谈一下最小生成树 生成树的概念:连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树.生成树是连通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则将出现一个回路:若去掉一条边,将会使之变成非连通图. 生成树各边的权值总和称为生成树的权.权最小的生成树称为最小生成树. 最小生成树一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.常用于求最小生成树得算法包括kruskal(克鲁斯卡尔)算法或Prim(

_杂题_

杂题集 是个放题的好地方! **** 5.28 **** - BZOJ [3052] 糖果公园 - 据说是一道区间操作的综合题,但现在貌似蹦了? 现在还是太水,之后再来写吧. *************

[杂题]URAL1822. Hugo II&#39;s War

看懂题意的请直接跳过下一坨! 本人有表达障碍! ========================================== 题意: (题意真的很难很难懂啊!!!  去他娘的**) 有一个王国,王国里有一个国王(编号为1),他有(编号为2~n) n-1个臣子(这些臣子并不全和他有直接关系) 然后呢 国王要去打架,但是只有当他的x%个及以上的直系下属(与他有直接关系的臣子)做好打架的准备了,他才能去打架 他的直系下属也有下属,也要其中x%及以上的下属做好打架准备了,那些直系下属才会开始准备

BZOJ 口胡记录

最近实在是懒的不想打代码...好像口胡也算一种训练,那就口胡把. BZOJ 2243 染色(树链剖分) 首先树链剖分,然后记录下每个区间的左右端点颜色和当前区间的颜色段.再对每个节点维护一个tag标记.剩下的就是很normal的线段树区间合并和标记下传了. BZOJ 2245 工作安排(费用流) 很normal的拆边费用流.建立虚拟源点s和汇点t.s向产品连边,产品向可以生产它的工人连边,工人向t连边.这里的分段函数是个非递减的分段函数,由于最小费用流的特殊性.这里的分段函数可以用流和费用分割开

hdu 3641 数论 二分求符合条件的最小值数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*==================================================== 二分查找符合条件的最小值 ======================================================*/ ll solve() { __int64 low = 0, high = INF, mid ; while(low <=