标签:perm 组成 挑战 其他 平移 意义 ^c span sigma
出于某种原因新开了一篇。
对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树,这样跨越\(mid\)的点对之间的最短路一定会经过\(mid\),因此两点之间的最短路径就可以描述成最短路树上的两段到根路径。对每棵最短路树处理\(dfs\)序,用树状数组维护权值修改即可。
类似SCOI2016萌萌哒一题,并查集\(f_{i,j}\)表示从\(i\)点开始往上\(2^j\)个祖先的集合,然后依然按照\(Kruskal\)的理论从小往大加边。卡常warming。
相当于是要构造一条起点在\(0\)终点在\(inf\)的欧拉路,为了方便从\(inf\)向\(0\)连一条边转为求欧拉回路。在保证每个点的度数为偶数的前提下用最小的代价使图连通即可。
先随便找到一个存在\(k\)次单位根的质数\(p\),对矩阵中的每个非\(-1\)位随机一个权值\(b_{i,j}\),然后每次令\(a_{i,j}=b_{i,j\times }(\omega^t)^{e_{i,j}}\)求一次行列式,答案相加。若不存在一个合法排列,则答案一定为\(0\),否则答案以极大概率不为\(0\)。
考虑\((i,j)\)位置最终对\((0,0)\)的贡献,显然被计算了\(\binom{T}{i}\binom{T}{j}\)次,要使这个数在模\(2\)意义下为\(1\)则说明\(i|j\)是\(T\)的子集。高维后缀和即可。
一个常见的套路是,右端点从左往右扫,维护所有左端点的答案,这里只要维护所有的左端点的答案之和。
先考虑所有数互不相同的情况。考虑新增一个\(r\),首先\(r\)自身会是答案加上若干个\(r\),即每个区间内比\(r\)小的数的数量。同时\(r\)的加入也会使比\(r\)大的数的权值增加,讨论一下即可。
如有相同的数其实也很简单,只要对每种数只保留最后一次出现即可。
实现时需要用一个二位数据结构维护,两维分别是下标与权值。需要维护的量有\(\sum 1,\sum i,\sum a_i,\sum a_ii\)。
其实只要考虑在每一个数中大于等于数字\(x\)的数字出现了多少次就可以算出其贡献了。简单\(dp\)一下即可。
令\((2i-1,2i)\)为一对,显然\((x,y)\)对对答案没有任何影响可以忽视。现在我们已经得到了若干对\((-1,x)\),若干对\((-1,-1)\),在这里\((-1,x)\)的本质是限制了两个不同对中的\(x\)不能组成一对。考虑从大往小确定位置以处理取\(\min\)。设\(f_{i,j,k}\)表示确定前\(i\)大数的位置,剩余有\(j\)个在输入中出现过的数尚未匹配,\(k\)个在输入中未出现的数尚未匹配,转移只要考虑当前的第\(i-1\)大数是自己新开一组匹配还是与之前一个待匹配位置匹配,其中在“输出中未出现的数匹配输出中出现过的数”时方案数要乘上\(j\)。最终答案要乘上\((-1,-1)\)的数量的阶乘。
有一个十分显然的\(O(nq)\)的\(dp\)做法。
直接用线段树维护这个\(dp\)就行了。主要支持的操作有:全局加,以及用整棵线段树去更新一个单点。需要维护\(f_i,f_i-i,f_i+i\)的最小值。
相当于是求从\(y=0\)出发,每步可以走\((1,1)\)或是\((1,-1)\)最终到达\(y=2m\)的不同路线数,这里定义路线上下平移算作相同。为了解决算重的问题可以强制路线经过\(x=0\)。
假设任两棵树之间的距离都是\(\max(r_i,r_j)\),之后再把剩下的距离用隔板法分配进去即可。所有树按照\(r_i\)从小往大加入,这样两树之间的距离就有后加入的树确定,\(f_{i,j,k}\)表示前\(i\)棵树,排列共分成\(j\)段,总距离为\(k\)的方案数,转移显然。
对每个亲戚求出其掌控范围,然后求个最短路即可。可以直接半平面交实现做到\(O(n^2\log n)\)。
Case1:判断所有\(\le n\)的数的权值减下标(模\(n\)意义下)是否都相等,以及判断是否有重复元素。
Case2:多余的替换全部丢到最大的那个位置上即可。
Case3:一个缆车的替换方案至多只有\(n\)种,直接找出计算贡献的区间然后快速幂即可。
可以看做变种的树上最大独立集问题。依然对每个点记\(f_x,g_x\)表示\(x\)选或不选的最优答案(这其中的另一层含义是,\(f_x\)表示\(x\)的儿子一个都没有选,\(g_x\)表示可能选择了\(x\)的儿子)。
普通连边方式的转移为\(f_x\gets f_x+g_y, g_x \gets g_x+\min(f_y,g_y)\)。
对于所有兄弟连边的连边方式,转移为\(f_x\gets \max(f_x+\max(f_y,g_y),g_x+f_y),g_x\gets g_x+g_y\)。
对于第三种连边方式,转移为\(f_x\gets\max(f_x+g_y,g_x+f_y),g_x\gets g_x+g_y\)。
考虑确定最终访问到的区间\([l,r](l\le s \le r)\),收益即为除去走路用的\(r-l+\min(r-s,s-l)\)步后,剩下的步数在区间\([l,r]\)内取前若干大。
一个小结论是,每个\(l\)对应的最优的\(r\)是单调的,于是分治+主席树求前\(k\)大\(O(n\log^2n)\)美滋滋。
显然是个二合一
\[\sum_{a_1=1}^m\sum_{a_2=1}^m...\sum_{a_n=1}^m\sigma_0(\gcd(a_1,a_2...a_n)^3)^3\prod_{j=1}^k[a_{x_j}\le a_{y_j}]\\=\sum_{d=1}^m\sigma_0(d^3)^3\sum_{a_1=1}^m\sum_{a_2=1}^m...\sum_{a_n=1}^m[\gcd(a_1,a_2...a_n)=d]\prod_{j=1}^k[a_{x_j}\le a_{y_j}]\\=\sum_{d=1}^mG(d)F(\lfloor\frac md\rfloor)\]
其中\(G(d)=\sum_{i|d}\sigma_0(i^3)^3\mu(\frac di),F(m)=\sum_{a_1=1}^m\sum_{a_2=1}^m...\sum_{a_n=1}^m\prod_{j=1}^k[a_{x_j}\le a_{y_j}]\)。
前半部分是个积性函数的前缀和,直接\(\min\_25\)即可。后半部分,可以发现是一个不超过\(n\)次多项式,插值即可。
手玩可以发现\(G(p^c)=81c^2-27c+9\)。
贪心,一次一定只选一段连续的区间。枚举第一段区间选多长,再暴力算后面的答案,复杂度\(O(k\times \frac nk)=O(n)\)。
把区间\([a_i,b_i]\)看做一个二维平面上的点。每次选点都会在当前可选点集中选择一些纵坐标最小的点。
问题在于如何维护单次操作中已选择的点集。会发现已选点集会在平面上构成的矩形的高度是单调不降的(否则一定不优),所以就用单调栈维护这个高度就行了。
数字很大转自然对数后进行运算即可。
答案具有可二分性,而且两个人的操作是可以独立的,直接构造第一个人的操作即可。所以说这其实是一道代码实现题。
设区间中前\(k\)小的数之和为\(sum\),且第\(k+1\)小的数超过了\(sum+1\),则\(sum+1\)这个数就不可能被构造出来了。
由此可以不断将值域扩大,当发现扩大值域后权值没有增加则说明已经找到了答案。
将\(2\min(a,b)\ge \max(a,b)\)的限制拆成\(2a\ge b\)与\(2b\ge a\)。合并路径时限制要求变成了\(2(a_1+a_2)\ge b_1+b_2,2(b_1+b_2)\ge a_1+a_2\),随便划下式子就是\(2a_1-b_1\ge-(2a_2-b_2),2b_1-a_1\ge -(2b_2-a_2)\)。看似一个二维偏序的模型但实际上这两者中至少有一者是会被满足的,所以只需要分别减去违反两个条件的贡献就行了。
先不管\(q\)组询问,直接处理出\(k\in[0,+\infty)\)的答案。扫描线从左向右扫,维护\(f_i\)表示第\(i\)朵云单独覆盖的长度,\(g_i\)表示第\(i\)朵云与其他的一朵云覆盖得到的最大长度。当扫到一段区间不被任何云覆盖时,可以直接加入答案。当一段区间只被一朵云覆盖时,可以更新这朵云的\(f\)值,用满足\(c_i+c_j\le C\)的云(按云的权值排序后对应一段前缀)去更新这朵云的\(g\)值,同时更新答案。当一段区间被两朵云覆盖时,可以直接开std::map
记录两片云共同覆盖的部分的长度,更新两者的\(g\)值再更新答案即可。
首先做前缀和后转成求区间内选两个数异或和最大。
分块预处理出\(f_{i,j}\)表示从第\(i\)个块的块首到第\(j\)的位置这段区间里任选两个数异或的最大值,询问再暴力处理\(l\)所在的非整块。复杂度\(O((n+m)\sqrt n\times 30)\)
标签:perm 组成 挑战 其他 平移 意义 ^c span sigma
原文地址:https://www.cnblogs.com/zhoushuyu/p/10492689.html