zoukankan      html  css  js  c++  java
  • 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),问变成不上升序列的最少代价。(nleq 5 imes 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,kleq 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,kleq 2 imes 10^5,a_ileq 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_dcdot d =0 ]

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

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


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

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

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

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


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

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

    问题转化为判定是否存在([l,r]geq m),使得区间内的任意元素满足(L_igeq l)(R_ileq 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(nlog^2n))


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

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

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

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


    • 给出(A,N,p),对于所有(u),求从(1)(lfloorfrac{A}{2^u} floor)中选出(n)个数,(1leq n leq N),且(n)是奇数,且选出的最大数是奇数,求方案数&求和。对(p)取模。(Aleq 10^9,Nleq 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(nlog nlog A))


    • 给出(S[0…5],)每个数都是“前”/“中”/“后”。有一棵二叉树,定义(dfs(x,mode)),其中(mode)表示是哪种方式。但是递归左右儿子的时候,会变成(dfs(l,s[2 imes mode]),dfs(r,s[2 imes mode+1]))。给出两种遍历结果,求一种可能的第三种遍历结果。(nleq 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,qleq 10^5)

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

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

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

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


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

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

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

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

  • 相关阅读:
    按顺序触发事件LazyMan deepcopy
    requirejs学习,demo下载学习
    滑动删除demo
    jquery1.7.2的源码分析(四)$.Deferred(2)
    jquery1.7.2的源码分析(三)$.Deferred
    jquery1.7.2的源码分析(二)
    jquery1.7.2的源码分析(一)
    解码H264文件的一些基础知识
    和 的区别
    Jmeter Cookie管理器 获取JSESSIONID
  • 原文地址:https://www.cnblogs.com/suwakow/p/11375073.html
Copyright © 2011-2022 走看看