随笔分类 - hdu
摘要:构造一个01矩阵,其中格子$(i,j)$对应于第$ik+j$个的位置(其中$0\le i<\lceil\frac{n}{k}\rceil,0\le j<k$,位置从0开始编号),那么问题即有以下限制: 1.$(\lceil\frac{n}{k}\rceil-1,j)$(
阅读全文
摘要:显然可以费用流来做,具体建图如下—— 点集:源点,汇点,左边$n$个工人,右边$n$个设备 边集:源点向第$i$个工人连$(1,a_{i})$的边,第$i$个设备向汇点连$(1,b_{i})$的边,工人向可用的设备连$(1,0)$的边 跑最小费用最大流,流量为$i$时的费用即为
阅读全文
摘要:注意到一个人的三条链一定不会同时选(忽略仅选一个终点的限制),因为其有公共点(起点) 换言之,问题相当于给定$3m$条链,选择$m$条没有公共点的链,并最小化代价和 进一步的,显然也不存在多于$m$条且没有公共点的链,因此"选择$m$条链"也可以理解为选尽量多的链(若选不到$m$条链即为-1)的同时
阅读全文
摘要:将询问拆成$x$到$lca$和$lca$($lca$靠近$y$的儿子)到$y$两部分,分别处理(后者以前者的答案为基础) 两者是类似地,不妨仅考虑前者:用树剖将该询问拆成dfs序上若干个区间,考虑从后往前遍历dfs序(显然即从下到上),若当前位置被覆盖则执行该节点的操作 进一步的,考虑
阅读全文
摘要:记$m=10$,即商品的种类 记$g(x)=1+\sum_{i=1}^{m}a_{i}x_{i}$,问题即求$f_{n}(x)=g^{n}(x)$非0项数(模2意义下) 注意到$f^{2}(x)\equiv f(x^{2})(mod\ 2)$,这是因为如果所选的项在两边不同,那么交换后即会抵消 令$
阅读全文
摘要:最简单的是利用Min25筛求$h(n)$的过程,即 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 1000005 4 #define ll long long 5 int K,vis[N],P[N],h[N<<1]; 6 l
阅读全文
摘要:(首先这道题有更为简单的dp+差分的做法,但以下为概率生成函数的做法) 第一问: 定义$f_{i}$表示(恰好)在第$i$个数结束的概率,$g_{i}$表示前$i$个数仍未结束的概率,则有$\frac{g_{i}}{m^{n-1}}=\sum_{j=1}^{n}\frac{f_{i+j}}{m^{n
阅读全文
摘要:$lyndon\ word$(以下简写为Lw):对于一个字符串s,其为Lw当且仅当其的最小后缀为自身 性质:若$u<v$为LW,那么$uv$也为Lw(反证法即可证) $lyndon$分解:将一个字符串分为$s=s_{1}s_{2}...s_{k}$,满足$\forall 1\le i\le k$,有
阅读全文
摘要:记一条链两端的lca为该链的lca,f[i]表示所有lca在i子树内的链的最大价值和(为方便递推,假设存在i-i的链价值为0),有递推式$f[i]=max(\sum_{son}f[son]+val)$(其中son是链上所有点的儿子且不再链上的节点,val表示该链的价值),时间复杂度为$o(n^{2}
阅读全文
摘要:考虑分别求出RG和GB的最小生成树,然后剩下的边中肯定选择较小的边加入这两颗生成树 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 105 4 struct ji{ 5 int x,y,z; 6 char s[11]; 7 }
阅读全文
摘要:将两棵树分别按照深度分块,即每$\sqrt{n}$深度分为一块对于两棵树任意两个块的根对,统计其中公共的节点并计算出答案(用按秩合并并查集),复杂度为$o(n\sqrt{n}logn)$(其实这玩意是可以被卡掉的,因为这种分块无法保证块的大小和数量) 1 #include<bits/stdc++.h
阅读全文
摘要:考虑对一个集合求莫比乌斯反演的过程,最终答案即$\sum\limits_{d|ai}\mu(d)\cdot calc(d)$(calc(d)表示i子树中d倍数的个数)dfs时维护当前遍历到的点中i倍数的个数,对i搜之前和i搜完后差分一下就可以得到i子树的信息,用上述式子计算即可 1 #include
阅读全文
摘要:考虑每一条非树边都连接了祖先和儿子,类似于序列上的问题,从底往上算,当发现如果走到某个环的祖先,且这个环中还没有被选到,那么就将最浅的那条边贪心选择即可具体实现可以使用bitset维护当前子树的询问,如果这条边选了,那么bitset清空,否则和父亲合并 1 #include<bits/stdc++.
阅读全文
摘要:首先要知道一个式子:$\mu(lcm(i,j))=\mu(i)\cdot \mu(j)\cdot \mu(gcd(i,j))$(分是否为0讨论)令$d=gcd(i,j)$,$n'=\lfloor n/d \rfloor$,$m'=\lfloor m/d \rfloor$$\sum \mu(lcm(i
阅读全文
摘要:首先计算出以1为左端点的所有区间的mex,考虑删除左端点仍然维护这个序列:设当前删除点下一次出现在y,y~n的mex不变,从左端点到y的点中大于删除值的点要变成删除值,因为这个是不断递增的,所以是一段区间,可以用线段树来维护。 1 #include<bits/stdc++.h> 2 using na
阅读全文
摘要:设f[i]表示从点i逃出去的期望步数,显然有递推式$f[i]=Ki\cdot f[1]+(1-Ei-Ki)/s[i](f[fa]+1+\sum_{son}(f[son]+1))$(其中r[i]表示点i的度)。这个用高斯消元复杂度高达三次,无法通过,但可以发现每一个点一定可以用$f[i]=a*f[1]
阅读全文
摘要:考虑LIS的一种求法:维护每一个长度的最小结尾,此时这个序列只与每一个数字有没有出现有关,用2^10状压,状压+数位dp即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 int t,k,a[21]
阅读全文
摘要:一棵子树的每一个儿子相当于划分一个区间,同时这些区间一定要存在一个点连续(直接的儿子),因此每一棵树最多只有两个儿子存在子树,并且这两个儿子所分到的区间一定是该区间最左和最右两段,所以ans*=(son)!(没有儿子的点任意排列)*2(两棵子树可以选择最左和最右),注意根节点还有两种划分方式,但当n
阅读全文
摘要:很难考虑矩形覆盖的问题,但可以考虑每一个点被覆盖的概率/期望(把矩形分成九部分后容斥即可),sigma起来即答案 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,n,m,k; 4 long long s,sum; 5 double a
阅读全文
摘要:1.直接令x=0,为了判断这一信息,对于所有含有多个1的yi,必然是无用的,答案至少为n且不能含有多位1的y2.令yi=2^(i-1),由此发现一定可以得到x每一位的答案,即答案最多为n。因此,发现方案数即n!,当$n\ge p$时答案一定为0,时间复杂度为o(p) 1 #include<bits/
阅读全文
浙公网安备 33010602011771号