摘要: 一棵子树的每一个儿子相当于划分一个区间,同时这些区间一定要存在一个点连续(直接的儿子),因此每一棵树最多只有两个儿子存在子树,并且这两个儿子所分到的区间一定是该区间最左和最右两段,所以ans*=(son)!(没有儿子的点任意排列)*2(两棵子树可以选择最左和最右),注意根节点还有两种划分方式,但当n 阅读全文
posted @ 2019-08-07 19:54 PYWBKTDA 阅读(103) 评论(0) 推荐(0) 编辑
摘要: 线性基中的所有数一定能够造出所有异或的结果,同时一定只有一种方式(否则这两种方式异或起来为0),那么只需要考虑为了异或出X,每一位的线性基要不要选,若X的这一位是1,那么别的方案一定可以使得这一位是0,因此会增加$2^{剩下的线性基个数}$个比X小的数,否则不会增加还有重复数字,可以发现除了线性基外 阅读全文
posted @ 2019-08-07 19:54 PYWBKTDA 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 一个点的贡献即$(x+1)^3-x^3=3x^{2}+3x+1$(x表示结尾的长度),由于期望的可加性,分别维护末尾序列长度平方的期望,长度的期望(不能一起维护,因为后者平方并不是前者),直接计算即可 1 #include<bits/stdc++.h> 2 using namespace std; 阅读全文
posted @ 2019-08-07 19:54 PYWBKTDA 阅读(75) 评论(0) 推荐(0) 编辑
摘要: 插一块板表示让这个数字+1,问题转化为对于长度为1~n的序列,插入r-l块板(首尾也可以插板,每个点板数不限),有多少种方案,即求$\sum_{i=1}^{n}c(r-l+i,r-l)$考虑该式,再补上一项c(r-l+1,r-l+1),原式=$\sum_{I=1}^{n}c(r-l+i,r-l)+c 阅读全文
posted @ 2019-08-07 19:54 PYWBKTDA 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 很难考虑矩形覆盖的问题,但可以考虑每一个点被覆盖的概率/期望(把矩形分成九部分后容斥即可),sigma起来即答案 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,n,m,k; 4 long long s,sum; 5 double a 阅读全文
posted @ 2019-08-07 19:53 PYWBKTDA 阅读(92) 评论(0) 推荐(0) 编辑
摘要: 定义状态f[i][j]表示发现了i种bug在j台电脑上后期望多少天能结束,$f[i][j]=(ij\cdot f[i][j]+(n-i+1)j\cdot f[i+1][j]+i(m-j+1)\cdot f[i][j+1]+(n-i+1)(m-j+1)\cdot f[i+1][j+1])/(ns)+1 阅读全文
posted @ 2019-08-07 19:53 PYWBKTDA 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 由于题目的证明可以发现$ans\ge 2m/n \ge n-1$,于是大胆猜测答案就是n-1若n是奇数,则将边分为n组,每组(n-1)/2,如果同组内边没有交点,那么只需要每一组边一个权值区间,从每一组边一定不可能走回那组边(因为会经过其他组的边),所以答案至多n-1若n是偶数,先对n-1的图边分类 阅读全文
posted @ 2019-08-07 19:52 PYWBKTDA 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 令f[i][j]表示以i为根的子树中选择j个点颜色为黑色的最大收益,$f[i][j+t]=max(f[i][j]+f[son][t]+val(i->son)$,其中$val(i->son)=(k-t)*t+(sz[son]-t)*(n-k-sz[son]+t)$,时间复杂度为$\sum_{i=1}^ 阅读全文
posted @ 2019-08-07 19:52 PYWBKTDA 阅读(95) 评论(0) 推荐(0) 编辑
摘要: 令g[i][j]表示覆盖了i的子树中距离i大于等于j的所有点,f[i][j]表示覆盖了i的子树和子树外距离i小于等于j的所有点,有递推式$f[i][j]=min(f[i][j]+g[son][j],f[son][j+1]+g[i][j+1]),g[i][j]+=g[son][j-1]$,特别的有g[ 阅读全文
posted @ 2019-08-07 19:52 PYWBKTDA 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 1.直接令x=0,为了判断这一信息,对于所有含有多个1的yi,必然是无用的,答案至少为n且不能含有多位1的y2.令yi=2^(i-1),由此发现一定可以得到x每一位的答案,即答案最多为n。因此,发现方案数即n!,当$n\ge p$时答案一定为0,时间复杂度为o(p) 1 #include<bits/ 阅读全文
posted @ 2019-07-28 19:58 PYWBKTDA 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 网络流建图,首先将所有价值加起来,用最小割考虑要删掉多少个价值:源点向每一个士兵连流量为x的边,士兵向汇点连流量为y的边,每一对关系间连流量为z的边,考虑有方程x1+y2+z=x2+y1+z=a+c,x1+x2=b+c,y1+y2=a+b,由于对称性(其实也不一定要对称),解得x1=x2=(b+c) 阅读全文
posted @ 2019-07-28 19:29 PYWBKTDA 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 有两个结论:1.排序后,答案一定是连续的三个数;2.当序列长度超过44一定有三个相同的数(因为即使该序列是斐波那契数列,此时也超过了1e9),然后用主席树等数据结构(略卡常,建议主席树)来维护前45大即可 1 #include<bits/stdc++.h> 2 using namespace std 阅读全文
posted @ 2019-07-28 19:18 PYWBKTDA 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 计算一对逆序对的贡献,即在n个数期望要删多少步才能删掉其中的两个数,设f(n)表示此时的期望,则有方程$f[n]=3/4+(\sum_{i=2}^{n}f[i]\cdot c(n-2,i-2))/2^n$,手算(打表)得到f[i]=4/3(代入成立),因此$ans=\sum_{i=1}^{n}(i- 阅读全文
posted @ 2019-07-28 19:03 PYWBKTDA 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 首先发现,最终第0辆车一定被堵在某一辆车前,那么等价于它的初始位置就在(那辆车的位置+中间车的车长)/那辆车的速度,其中最大的那个就是答案因此得出结论:$ans=max((\sum_{j=1}^{i}l[j]+s[i])/v[i])$,其中$i\in [0,n]$ 1 #include<bits/s 阅读全文
posted @ 2019-07-28 18:46 PYWBKTDA 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 令$m=\lfloor \sqrt[3]{n} \rfloor-1$ $\sum_{i=1}^{n}gcd(floor(\sqrt[3]{i}),i)$=$\sum_{i=1}^{m}\sum\limits_{j=i^{3}}^{(i+1)^{3}-1}gcd(i,j)+\sum\limits_{i 阅读全文
posted @ 2019-07-28 17:56 PYWBKTDA 阅读(253) 评论(0) 推荐(0) 编辑
摘要: $\sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j)\\$ $=\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}\varepsilon(gcd(i,j))$ $=\sum_{d=1}^{n}d\sum_{g=1}^{n/d}\mu( 阅读全文
posted @ 2019-07-28 10:52 PYWBKTDA 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 直接令2i-1和2i的位置不相同,相当于有2n条边,对其进行二分图染色即可(这张图一定不存在奇环)。 假设给出的n条关系是A类边,2i-1和2i的边是B类边,可以发现一条路径一定是AB交替(因为A/B的终点一定不可能是A/B的起点),那么环就一定是有等量的A边和B边,即偶环。 1 #include< 阅读全文
posted @ 2019-07-28 10:52 PYWBKTDA 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 首先,从1和n跑一次dij,判断每一条边能否出现在最短路上,不能出现就删掉,然后将所有边建在图上,流量为边权,跑最小割即可。 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 10005 4 #define ll long lo 阅读全文
posted @ 2019-07-28 10:51 PYWBKTDA 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 定义g[i][j]表示i个盘子在j柱上最终会移到哪个柱子上,f[i][j]表示相对应的所需步数。考虑转移,令k=g[i-1][j],第k根柱子最上面一个盘子在上一局已经移动6-j-k,因此这一步一定是将最大的盘子移到,总共移动f[i-1][j]+1步。再移动f[i-1][k]步,如果g[i-1][j 阅读全文
posted @ 2019-07-28 10:46 PYWBKTDA 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 由于最终的染色只与ci为几的个数有关,因此定义状态f[a][b][c][d][e][p]表示有a个ci=1,b个ci=2,……,有e个ci=5,上一次选择了ci=p的。状态的转移:发现p会让p-1少选一次,因此可以写出方程(详见代码),可以用记忆化搜索来写。 1 #include<bits/stdc 阅读全文
posted @ 2019-07-28 10:46 PYWBKTDA 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 二分答案+判定,对于一个答案,源点向每一个点连一条流量为1的边,每一扇门向汇点连一条流量为时间的边,每一个人向每一个在答案时间内能走到的门连一条流量为1的边,跑最大流并判断流量是否等于人数。 然而自从bzoj新增数据后就跑不过了,原因是不能保证有一组最优撤离方案使得在最后一个时刻以前(最后一个时刻可 阅读全文
posted @ 2019-07-28 10:45 PYWBKTDA 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 求最长反链(链上任意两个点不连通),可以发现,最长反链=最小链覆盖(因为每一条链都最多只有一个点入选),而DAG的最小链覆盖也就是最小路径覆盖(可相交)。然后floyd传递闭包,将任意两个连通的点都连一条边,这样就变成不可相交的最小路径覆盖(可以绕过去)。 不可相交的最小路径覆盖:将每一个点裂成两个 阅读全文
posted @ 2019-07-28 10:45 PYWBKTDA 阅读(96) 评论(0) 推荐(0) 编辑
摘要: 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 50001 4 int t,n,m,k,ans,mu[N],vis[N],p[N]; 5 void mobius(){ 6 mu[1]=1; 7 for(int i=2;i<N; 阅读全文
posted @ 2019-07-28 10:45 PYWBKTDA 阅读(79) 评论(0) 推荐(0) 编辑
摘要: 有这样一个贪心的思路:当某一个点搜完某个儿子后,发现当前子树中没有被选入其他省的点数超过了B,就将其当做一个省,并把这个点作为省会(注意:这个点并没有进入这个省),显然可以发现此时每一个省的点数都小于2B。另外,当搜完后发现还有小于B的点,那么就将这些点都归入最后一个省,省的点数仍然小于3B。 1 阅读全文
posted @ 2019-07-28 10:45 PYWBKTDA 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 首先在所有点上放上士兵,如果初始不合法直接输出,否则考虑删除士兵。 对于每一个士兵,向所在行和所在列连边,每一行/列向汇点流最多能删掉多少个士兵,源点向每一个士兵流1的边,最后最大流即删掉的士兵。 1 #include<bits/stdc++.h> 2 using namespace std; 3 阅读全文
posted @ 2019-07-28 10:44 PYWBKTDA 阅读(107) 评论(0) 推荐(0) 编辑