多校联合第三次题解(网页打不好开,扒下来看)
2017-08-01 18:37
197 查看
1001
考虑容斥,枚举哪些限制强制不满足,把n减去这些不满足限制的和,然后计算组合数. 注意到组合数有点难算,注意到可以把组合数看成一个mm阶多项式,
就可以把问题转换成对每一个1≤k≤m1≤k≤m计算kk次方的和.
如果c=1,可以数位dp,把每一位的贡献dp进去计算.如果c≠1,需要预先枚举有几个限制不满足,
然后再数位dp.注意到可以把随意选择的位的dp结果预处理好来进行加速.时间复杂度O(m4)O(m4).
1002
我们知道,对于任意两个数a,ba,b,我们有:a and b=(a or b)−(a xor b)
我们枚举x=a or bx=aorb,y=a xor by=axorb,显然要求的条件是x and y=yxandy=y
之后可以计算满足以上条件的(a,b)(a,b)有2bit(y)2bit(y)个
于是可以将式子重写成:
C[k]=∑x∑y[x and y=y]∗[x−y=k]∗B[x]∗A[y]∗2bit(y)C[k]=∑x∑y[xandy=y]∗[x−y=k]∗B[x]∗A[y]∗2bit(y)
C[k]=∑x∑y[x and y=y]∗[x xor y=k]∗B[x]∗A[y]∗2bit(y)C[k]=∑x∑y[xandy=y]∗[xxory=k]∗B[x]∗A[y]∗2bit(y)
C[k]=∑x xor y=k[x and y=y]B[x]∗A[y]∗2bit(y)C[k]=∑xxory=k[xandy=y]B[x]∗A[y]∗2bit(y)
C[k]=∑x xor y=k[bit(x)−bit(y)=bit(k)]B[x]∗A[y]∗2bit(y)C[k]=∑xxory=k[bit(x)−bit(y)=bit(k)]B[x]∗A[y]∗2bit(y)
用元素为多项式的FWT计算即可
时间复杂度:O(2m∗m2)O(2m∗m2)
1003
我们只要求出对于一个数x左边最近的k个比他大的和右边最近k个比他大的,扫一下就可以知道有几个区间的k大值是x.
我们考虑从小到大枚举x,每次维护一个链表,链表里只有>=x的数,那么往左往右找只要暴力跳k次,删除也是O(1)的。
时间复杂度:O(nk)
1004
若Ai xor Aj<Aj xor AkAixorAj<AjxorAk,考虑AiAi和AkAk不同的位中最高的,根据这一位的值可以知道AjAj这一位的值必须是多少。
用一个字母树存下所有A_kAk,询问A_iAi时爬一下即可,顺便记录下中间有几个满足条件的A_jAj。
时间复杂度:O(nlogAi)O(nlogAi)
1005
把1看成整棵树的根.问题相当于把2∼n每个点一个[1,k]的标号.然后根据最小斯坦纳树的定义,(x,fax)
这条边的贡献是x子树内不同标号的个数目difi.那么显然有difi≤min(k,szi),szi表示子树大小.
可以通过构造让所有difi都取到最大值.所以答案就是∑nx=2w[x][fax]∗min(szx,k)时间复杂度O(n).
1006
问题相当于展开f(x−∑ai)f(x−∑ai)。
我们可以把每一项用二项式定理展开,然后可以发现这是可以用FFTFFT优化的。
时间复杂度:O(nlogn)
1007
建一个extrabitalways1他的值永远是1.如何判断xi=1xi=1?新建一个extrabitis[i][1],初值为0,来存结果,构造gate:ialways1is[i][1].如何判断xi=0xi=0?新建一个extrabitis[i][0],初值为1,来存结果,构造gate:is[i][1]always1is[i][0].构造一个Trie.每个节点t新建一个extrabitact[t],并且构造gate:act[fa[t]]is[dep[t]][dir]act[t]其中dir表示方向,如果t是左儿子就是0,否则就是1.这样对于一组输入,恰好有一片叶子的act是1,对每片答案为1的叶子构造gate:act[t]always1outputbit.可以通过设定outputbit的初值来减少对叶子的判断.gate和extrabit个数大约在2m+1+2m2m+1+2m左右.
1008
注意到一个数字xx必然会被唯一表示成a2×ba2×b的形式.其中|μ(b)|=1∣μ(b)∣=1。所以这个式子会把[1,nk][1,nk]的每个整数恰好算一次.所以答案就是nknk,快速幂即可.时间复杂度O(logk)O(logk).
1009
注意到计算的是欧拉回路.把BEST′sTHEOREM稍加修改可以得到答案.Trees×deg[1]!×∏mi=2(deg[i]−1)!∏mi=1∏mj=11Di,j!Trees×deg[1]!×∏i=2m(deg[i]−1)!∏i=1m∏j=1mDi,j!1TreesTrees表示1为根的生成树个数,用基尔霍夫矩阵计算就行了.时间复杂度O(m3)O(m3).
1010
用f[i][j]f[i][j]表示p[1:i]p[1:i]分成jj段的最小代价.显然可以写出一个O(n2k)O(n2k)的dpdp.考虑用cdq分治优化dp,考虑用f[l][j−1]⋯f[md][j−1]f[l][j−1]⋯f[md][j−1]来影响f[md+1][j]⋯f[r][j]f[md+1][j]⋯f[r][j]处理出AxAx表示[x,md][x,md]的lca,BxBx表示[md+1,x][md+1,x]的lca.转移的时候计算lca(A[i],B[j])就行了.考虑枚举每一个[md+1,r]的t.注意到转移分成两段,一段后缀满足lca是lca(B[t],p[md]),剩下的一段前缀lca是A[i],前后缀的分界线可以单调移动得到.然后分两段分别转移就好了,通过预处理前后缀最小值来O(1)O(1)转移.时间复杂度O(nklogn)O(nklogn)
1011
一个签到题,目的在于吐槽浙江的高温
考虑容斥,枚举哪些限制强制不满足,把n减去这些不满足限制的和,然后计算组合数. 注意到组合数有点难算,注意到可以把组合数看成一个mm阶多项式,
就可以把问题转换成对每一个1≤k≤m1≤k≤m计算kk次方的和.
如果c=1,可以数位dp,把每一位的贡献dp进去计算.如果c≠1,需要预先枚举有几个限制不满足,
然后再数位dp.注意到可以把随意选择的位的dp结果预处理好来进行加速.时间复杂度O(m4)O(m4).
1002
我们知道,对于任意两个数a,ba,b,我们有:a and b=(a or b)−(a xor b)
我们枚举x=a or bx=aorb,y=a xor by=axorb,显然要求的条件是x and y=yxandy=y
之后可以计算满足以上条件的(a,b)(a,b)有2bit(y)2bit(y)个
于是可以将式子重写成:
C[k]=∑x∑y[x and y=y]∗[x−y=k]∗B[x]∗A[y]∗2bit(y)C[k]=∑x∑y[xandy=y]∗[x−y=k]∗B[x]∗A[y]∗2bit(y)
C[k]=∑x∑y[x and y=y]∗[x xor y=k]∗B[x]∗A[y]∗2bit(y)C[k]=∑x∑y[xandy=y]∗[xxory=k]∗B[x]∗A[y]∗2bit(y)
C[k]=∑x xor y=k[x and y=y]B[x]∗A[y]∗2bit(y)C[k]=∑xxory=k[xandy=y]B[x]∗A[y]∗2bit(y)
C[k]=∑x xor y=k[bit(x)−bit(y)=bit(k)]B[x]∗A[y]∗2bit(y)C[k]=∑xxory=k[bit(x)−bit(y)=bit(k)]B[x]∗A[y]∗2bit(y)
用元素为多项式的FWT计算即可
时间复杂度:O(2m∗m2)O(2m∗m2)
1003
我们只要求出对于一个数x左边最近的k个比他大的和右边最近k个比他大的,扫一下就可以知道有几个区间的k大值是x.
我们考虑从小到大枚举x,每次维护一个链表,链表里只有>=x的数,那么往左往右找只要暴力跳k次,删除也是O(1)的。
时间复杂度:O(nk)
1004
若Ai xor Aj<Aj xor AkAixorAj<AjxorAk,考虑AiAi和AkAk不同的位中最高的,根据这一位的值可以知道AjAj这一位的值必须是多少。
用一个字母树存下所有A_kAk,询问A_iAi时爬一下即可,顺便记录下中间有几个满足条件的A_jAj。
时间复杂度:O(nlogAi)O(nlogAi)
1005
把1看成整棵树的根.问题相当于把2∼n每个点一个[1,k]的标号.然后根据最小斯坦纳树的定义,(x,fax)
这条边的贡献是x子树内不同标号的个数目difi.那么显然有difi≤min(k,szi),szi表示子树大小.
可以通过构造让所有difi都取到最大值.所以答案就是∑nx=2w[x][fax]∗min(szx,k)时间复杂度O(n).
1006
问题相当于展开f(x−∑ai)f(x−∑ai)。
我们可以把每一项用二项式定理展开,然后可以发现这是可以用FFTFFT优化的。
时间复杂度:O(nlogn)
1007
建一个extrabitalways1他的值永远是1.如何判断xi=1xi=1?新建一个extrabitis[i][1],初值为0,来存结果,构造gate:ialways1is[i][1].如何判断xi=0xi=0?新建一个extrabitis[i][0],初值为1,来存结果,构造gate:is[i][1]always1is[i][0].构造一个Trie.每个节点t新建一个extrabitact[t],并且构造gate:act[fa[t]]is[dep[t]][dir]act[t]其中dir表示方向,如果t是左儿子就是0,否则就是1.这样对于一组输入,恰好有一片叶子的act是1,对每片答案为1的叶子构造gate:act[t]always1outputbit.可以通过设定outputbit的初值来减少对叶子的判断.gate和extrabit个数大约在2m+1+2m2m+1+2m左右.
1008
注意到一个数字xx必然会被唯一表示成a2×ba2×b的形式.其中|μ(b)|=1∣μ(b)∣=1。所以这个式子会把[1,nk][1,nk]的每个整数恰好算一次.所以答案就是nknk,快速幂即可.时间复杂度O(logk)O(logk).
1009
注意到计算的是欧拉回路.把BEST′sTHEOREM稍加修改可以得到答案.Trees×deg[1]!×∏mi=2(deg[i]−1)!∏mi=1∏mj=11Di,j!Trees×deg[1]!×∏i=2m(deg[i]−1)!∏i=1m∏j=1mDi,j!1TreesTrees表示1为根的生成树个数,用基尔霍夫矩阵计算就行了.时间复杂度O(m3)O(m3).
1010
用f[i][j]f[i][j]表示p[1:i]p[1:i]分成jj段的最小代价.显然可以写出一个O(n2k)O(n2k)的dpdp.考虑用cdq分治优化dp,考虑用f[l][j−1]⋯f[md][j−1]f[l][j−1]⋯f[md][j−1]来影响f[md+1][j]⋯f[r][j]f[md+1][j]⋯f[r][j]处理出AxAx表示[x,md][x,md]的lca,BxBx表示[md+1,x][md+1,x]的lca.转移的时候计算lca(A[i],B[j])就行了.考虑枚举每一个[md+1,r]的t.注意到转移分成两段,一段后缀满足lca是lca(B[t],p[md]),剩下的一段前缀lca是A[i],前后缀的分界线可以单调移动得到.然后分两段分别转移就好了,通过预处理前后缀最小值来O(1)O(1)转移.时间复杂度O(nklogn)O(nklogn)
1011
一个签到题,目的在于吐槽浙江的高温
相关文章推荐
- 2017第三次多校联合hdu6060
- 2017第三次多校联合hdu6058
- 2017第三次多校联合HDU6059
- 2013多校联合1部分题解(更新中)
- 将网页上word、pdf、txt文件下载下来,解析成文本内容
- hdu 5410 CRB and His Birthday 2015多校联合训练赛#10 dp 动态规划
- 多校联合训练4&&HDU5775
- HDOJ多校联合第六场
- 2013 多校联合 H Park Visit (hdu 4607)
- 13hdu多校联合练习#1
- 2015多校联合第一场5289Assignment RMQ+二分
- 2013多校联合4 1001 Palindrome subsequence(hdu 4632)
- 2015多校联合第八场hdu5384Danganronpa AC自动机
- HDU 4643 GSM 简单计算几何 (2013多校联合)
- HDU 4666 Hyperspace(2013多校联合7 1001)
- 2015暑假多校联合---Friends(dfs枚举)
- hdu 4699 2个栈维护 or 伸展树 (2013多校联合)
- hdu5288 OO’s Sequence 二分 多校联合第一场
- 将用requests爬取下来的html网页存入本地文档中遇到UnicodeDecodeError
- 2011 多校联合第5场 1002 Lucky Numbers