ZROI 19.08.02 杂题选讲

  • 给出\(n\)个数,用最少的\(2^k\)或\(-2^{k}\),使得能拼出所有数,输出方案。\(n,|a_i|\leq 10^5\)。

显然一个绝对值最多选一次。这个性质非常强。

如果所有都是偶数,可以直接除以\(2\)。

否则\(1\)或\(-1\)必须选,暴力枚举选哪个然后递归,每层去重,发现最多只会递归\(\log a\)次。总复杂度\(O((n+a)\log n)\),等价于线段树上区间长度总和。


  • \(n\)个数,每次可以花费\(1\)的代价给某个数\(+1\)或\(-1\),问变成不上升序列的最少代价。\(n\leq 5\times 10^5\)。

等价于不下降序列。

设\(f(x)\)表示最后一个数\(\leq x\)时的最优答案。显然它形如若干段斜率为整数的折线,且斜率是连续不降的。

最右边加入\(a\)时,每个位置加上\(|x-a|\),并对\(f(x-1)\)取\(\min\)。

只需要维护拐点,每次加入两个拐点,并删去最大的一个。

最后用\(f(0)=\sum|a_i|\)还原答案。


  • 考虑所有的正整数可重集\(\{a_1,…,a_k\}\),满足\(\sum a_i=n\),求所有\(\sum a_i^m\)的和。\(n,m,k\leq 4096\)。

设\(f_{i,j}\)表示前\(i\)个数,和为\(j\)的方案数。每次转移要么放一个\(1\)在末尾,要么所有数均\(+1\)。

暴力dp可以维护每个数的\([0,m]\)次和,转移的时候乘上组合数。复杂度\(O(n^4)\)。

一点优化是维护每个数的下降幂(似乎组合数也可以),最后用第二类斯特林数还原答案,这样单次转移是\(O(1)\)的,复杂度\(O(n^3)\)。

考虑每个数产生的贡献有多少次。发现就是\(\sum_j[i\)出现至少\(j\)次的方案数\(]\)。

这个可以用\(f_{i,j}\)算,不需要dp的时候统计答案。复杂度\(O(n^2)\)。


  • 给出\(A_1\)到\(A_n\),设\(F_k=\sum_{i=1}^na_i^k\),求\(F_1,…,F_n\)。\(n,k\leq 2\times 10^5,a_i\leq 10^9\)。

牛顿恒等式:对于首一多项式\(F(x)=\sum_{i=0}^nC_{n-i}x^i\),设\(P_i\)为它的\(n\)个根的\(i\)次方和,对于任意正整数\(d\),有等式

\[\sum_{i=0}^{d-1}C_i P_{d-i}+C_d\cdot d =0\]

由\(C\)求\(P\):多项式求逆;由\(P\)求\(C\):多项式\(\exp\)。

本题硬点\(a_i\)是某多项式的\(n\)个根,分治fft求出多项式,求逆即可。复杂度\(O(n\log^2n)\)。


  • \(n\)个点,\(m\)条带权无向边,权值\(\in [0,17)\),问有多少种方案选择一些边(不选重边),使得整张图联通,且边权和\(\equiv x(\mod p)\)。对\(x\in [0,17)\)都要求答案。\(n\leq 17,m\leq 10^5\)。

显然是个循环卷积,先DFT,用点值计算完再IDFT回去即可。

考虑容斥,用总数减去不连通的方案数。枚举\(1\)所在的连通块容斥,复杂度\(O(3^np)\)。

\(O(2^nn^2p)\)的做法有点麻烦,需要高超的生成函数技巧,掉线了。


  • 给出\(n\)个数\(a_i\)和\(m\),求最小的\(k\),使得存在一个长度\(\geq m\)的区间,使得区间内任意一个数,都能找到另一个区间内的数和它差不超过\(k\)。\(n,m\leq 10^5\)。

二分答案,对每个数求出左右最近的满足条件的位置,设为\(L_i,R_i\)。

问题转化为判定是否存在\([l,r]\geq m\),使得区间内的任意元素满足\(L_i\geq l\)或\(R_i\leq r\)。

设\(solve(l,r)\)表示\([l,r]\)内是否存在满足条件的子区间。

如果\(r-l+1<m\),显然不行。

如果某个点\(L_i<l\)且\(R_i>r\),这个点就不能选,递归处理\(solve(l,i-1)|solve(i+1,r)\)。

暴力从左往右扫是\(O(n^2)\)的,考虑两边往中间扫,找到就return,这样是\(T(n)=T(i)+T(n-i)+O(\min(i,n-i))\)的,总复杂度\(O(n\log^2n)\)。


  • \(n\)种物品,每种物品重量\(w_i\),价值\(v_i\),有无限多个。\(q\)次询问,每次问在所有重量恰好为\(m\)的方案中,价值最大的是多少,拼出这个价值的方案数是多少。顺序不同的算作不同的方案。\(n,w_i,q\leq 100,m,v_i\leq 10^9\)。

由于方案数不需要考虑顺序,可以直接dp,\(f_i=\max(f_{i-w_j}+w_j)\),同时更新方案数即可。

发现\(w_i\)不超过\(100\),即每次只有最近的\(100\)个状态有用。用\(\max\)定义加法,用加法定义乘法,发现是矩乘的变体。

直接做\(O(n^4\log m)\)。考虑预处理出转移矩阵的\(2^k\)次方,每次用向量乘\(O(\log m)\)个矩阵,总复杂度\(O(n^3\log m)\)。


  • 给出\(A,N,p\),对于所有\(u\),求从\(1\)到\(\lfloor\frac{A}{2^u}\rfloor\)中选出\(n\)个数,\(1\leq n \leq N\),且\(n\)是奇数,且选出的最大数是奇数,求方案数&求和。对\(p\)取模。\(A\leq 10^9,N\leq 30000, p=O( 10^5),Time=5000ms\)。

枚举最大数之后,变成了求一些\(n\)很大,\(m\)不大的组合数。

组合数可以分治:\(C(n,m)=\sum_{i=0}^mC(x,i)\cdot C(n-x,n-i)\),其中\(x\)可以是任意\([1,n]\)的数。

在这里就是把\(A\)分成两半,递归处理然后fft合并。

由于每次都是除以\(2\)下取整,所以一遍就可以算出所有\(u\)的答案。复杂度\(O(n\log n\log A)\)。


  • 给出\(S[0…5],\)每个数都是“前”/“中”/“后”。有一棵二叉树,定义\(dfs(x,mode)\),其中\(mode\)表示是哪种方式。但是递归左右儿子的时候,会变成\(dfs(l,s[2\times mode]),dfs(r,s[2\times mode+1])\)。给出两种遍历结果,求一种可能的第三种遍历结果。\(n\leq 100\)。

设\(f_{x,y,a,b,i}\)为第一个序列\([x,x+i]\),方式为\(a\),第二个序列\([y,y+i]\),方式为\(b\)是否合法。

如果两个方式相等,直接判串是否完全相等。

如果其中一个是中序遍历,可以递归处理。

否则需要枚举左右儿子分界线。

看似\(O(n^4)\),实际上,确定了第一个序列的区间,第二个序列最多一个对应区间是合法的(点集完全相同)。所以总复杂度\(O(n^3)\)。


  • \(n\)个点\(m\)条边的无向图。\(q\)次操作,每次交换两条边的编号,回答按编号从小到大加边,加到联通时编号为多少。\(n,q\leq 10^5\)。

设\(work(l,r)\)表示处理\([l,r]\)的修改,并回答每次修改完的答案。

把修改涉及的边设为\(\inf\),跑最小生成树,此时不在其中的边(未修改的)已经没用了,直接删掉。此时边数为\(O(\)点数\()\)。

把修改涉及的边设为\(-\inf\),跑最小生成树,此时在其中的边一定有用,直接缩点。此时点数为\(O(r-l)\)。

递归两边处理,每次要对边排序。复杂度\(O(n\log^2n)\)。


  • \(n\)个点,\(m\)条边的无向简单图,每个点度数不超过\(7\),给点四染色,要求每个点最多一个邻居和它相同。输出方案或者无解。\(n\leq 25000,m\leq 10^5\)。

随一个初始解,然后调整。

找一个不满足条件的点,把它换成一个可行的颜色。由于度数不超过\(7\),所以一定可行。

用队列模拟这个过程,每次调整后,两端颜色相同的边都会减少,所以一定会结束。复杂度\(O(m)\)。

原文地址:https://www.cnblogs.com/suwakow/p/11375073.html

时间: 2024-10-09 00:03:09

ZROI 19.08.02 杂题选讲的相关文章

正睿OI DAY3 杂题选讲

正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n\leq k^2\) 暴力 \(n\geq k^2\),找点x,求直线l经过x,且点数最多,点数\(\geq k+1\),递归,否则再找一个 One Point Nine Nine 现在平面上有\(n\)个点,已知有一个常数\(D\). 任意两点的距离要么\(\leq D\),要么\(\geq 1.

洛谷 P1595 信封问题(周五杂题选讲)(错排公式)

题目描述 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都装错信封共有多少种不同情况. 输入输出格式 输入格式: 一个信封数n(n<=20) 输出格式: 一个整数,代表有多少种情况. 题解 本题即为伯努利信封问题 360百科:错排公式 STD 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int b(int n) 5 { 6 if (n==1) return 0; 7 else if (n==2) r

ZROI 19.08.02 计算几何

1.向量基础知识 \(atan2\)可以求极角,但是不是特别精确,在坐标接近\(10^{9}\)时会出锅,安全的做法是叉积. 旋转.反射和平移等都可以抽象为矩阵,即,它们可以复合.(需要一些必修四知识) 给一个序列,每个位置表示旋转.反射.平移中的一种,求\((x,y)\)经过序列\([l,r]\)的点. 线段树维护矩乘就好了,矩阵里需要带个常数位置. Simpson积分 不会积分,告辞. 2.简单题 求点\(p\)在直线\(p_1p_2\)上的投影. 投影就是点积,直接积就行了,必修四怎么学的

「总结」杂题选讲

Bitwise Xor 我们可以发现一个序列中的最小的异或值是两个大小相邻的数的\(xor\)取\(min\). 那么我们对序列排序. 只需要计算相邻的\(xor\)是大于等于\(k\)的方案. \(dp[i]\)是以\(i\)结尾最小\(xor\)大于\(K\)的方案. 然后我们可以类似于用树状数组来搞最长升降转移. 这次用\(trie\)来转移. MOD Problem 大水题 \[\begin{aligned} ans&=\sum\limits_{i=1}^{n}n\ mod\ I\&

5.30杂题选讲

前三题为水题,后面两题更有意思. 然而代码全都咕咕咕了,也许以后会补. Hdu1520 Anniversary party 简单树形DP. Hdu6386 Age of Moyu 简单最短路. bzoj3679 数字之积 简单数位DP. CF Gym 101482G Gathering 首先对于每个点,可行的区域显然是个矩形,那么可以先对这些矩形求交,得到合法区域. 如果不考虑限制,那么最优点显然是\(x,y\)的中位数. 考虑限制之后,只要定下\(x\),那么最优的\(y\)也是确定的. 而且

20190915杂题选讲

T1 设\(b_1=p_1^{a_1}p_2^{a_2}-p_n^{a_n}\),显然答案最大为\(\sum a_i\) 考虑让\(\sum a_i\)最大,那\(b_1\)不能有有超过5的质因子,因为\(2^2<5\).3的个数最多也只有一个,因为\(2^3<3^2\) 于是就可以dp,设\(f[i][j][k]\)表示填到第i个数,gcd可以表示为\(2^j3^k\)的答案,分类讨论转移一下,最后答案为\(f[n][0][0]\) code: #include <bits/stdc+

ZROI 19.08.12模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. "我发现问题的根源是大家都不会前缀和."--敦爷 A 敦爷spj写错了,差点把蒟蒻swk送走 \(50pts:\) 考虑不输出方案怎么做.显然是树形dp. 设\(f_{i,j,\{0/1/2\}}\)表示\(i\)的子树中,有\(j\)条链,根节点状态为:\(\{\)没选\(/\)选了向下的一条链\(/\)选了向下的两条链\(\}\)的最优解. 对于一棵子树,开始时只考虑根节点,依次合并每个儿子.合并时需要枚举父亲和儿子

ZROI 19.08.10模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. A \(20pts:\) 枚举操作序列然后暴力跑,复杂度\(O(6^n)\). \([50,80]pts:\) 枚举改成dfs,每层操作后还原.复杂度\(O(3^n)\). 全0或全1可以直接返回. 写法优秀可以过\(80pts\). \(100pts:\) 类似非递归fft的写法,bitrev后可以位运算优化. 最下面四层可以预处理,复杂度\(O(3^{n-4})\). 然后疯狂卡常就完事了( 然而由于swk人菜常数大,明明所有

ZROI 19.08.09模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. A \(70pts:\) 维护一个栈,从一侧向另一侧扫描,如果新加入的元素与当前栈顶相同,则出栈,否则进栈.显然一个子串是括号序列,当且仅当栈为空. 枚举起点,暴力模拟即可.复杂度\(O(n^2)\). \(100pts:\) 对于一个右端点,考虑哪些左端点可以和它匹配. 发现所有合法的左端点,两者栈的内容都是相等的,可以Hash判断. 实际上考虑每次加入字符时,只会在末尾变动一次,可以用trie树维护.复杂度\(O(\sigma