zoukankan      html  css  js  c++  java
  • NOI2010~NOI2018选做

    [NOI2010]

    [NOI2010]海拔

    高度只需要0/1,所以一个合法方案就是一个割,平面图求最小割。

    [NOI2010]航空管制

    反序拓扑排序,每次取出第一类限制最大的放置,这样做答案不会更劣。
    考虑如何求每一个的最早时间,同上述拓扑排序,该元素不入队,当无点可拓展时就是最早时间。

    [NOI2010]超级钢琴

    对每一个左端点维护当前取出了前几大的右端点,用堆+主席树维护。

    [NOI2011]

    [NOI2011]兔农

    不难发现数列模意义下的进程是:斐波那切数列,首项回归0(减一操作),斐波那切数列......
    也就是说每一段中分别是一个斐波那切数列,故可以分段矩乘。
    而模(K)意义下斐波那切数列循环节不超过(6K),所以处理出循环节后暴力。

    [NOI2011]Noi嘉年华

    区间离散化,设(w_{l,r})为区间([l,r])权值,设(f_{i,j})表示前(i)个点场地一答案为(j),场地二的最大答案。
    考虑算第二问的答案,对于询问区间,枚举包含它的大区间。类似(f)先处理好后缀答案(g)
    预处理大区间答案:(ans_{l,r}=max_{x,y}{min(w_{l,r}+f_{l-1,x}+g_{r+1,y} , x+y)})
    可以发现(x)上升(y)一定不降(为了平衡两边权值),所以只用枚举(x)(y)用一个指针维护,复杂度(O(n^3))

    [NOI2011]阿狸的打字机

    (AC)自动机,相当于询问一个点跳(fail)能跳到一条(dfs)链上的几个点。
    离线(dfs),然后用树状数组实现子树加计算答案。

    [NOI2011]兔兔与蛋蛋游戏

    把网格图转为二分图博弈,需要支持移动一步维持匹配、判定匹配必须点,找交替路即可。

    [NOI2012]

    [NOI2012]美食节

    暴力,每道菜建点(v o T),每个厨师建点(S o u)
    对每个厨师,按天数分层建点,第(i)层表示做倒数第(i)道菜,并把该点向每道菜连边,跑费用流。
    可以动态加边,当一个厨师被增广后,再给他建新菜的边,复杂度(O(nmsum_{j=1}^p j))不满,能过。

    [NOI2012]魔幻棋盘

    扩欧差分后矩阵修改变成单点修改,拿线段树套线段树分四个象限维护。

    [NOI2012]骑行川藏

    套拉格朗日最小乘子法公式:(F(x_{1sim n},delta)=f(x_{1sim n})+delta g(x_{1sim n}))
    那么问题变为求一组解((x_{1sim n},delta))满足每个变量的偏导都是(0)(x_i)显然是很好求的,二分即可。
    不难发现(delta)(F'(x_{1sim n},delta)=g(x_{1sim n}))呈反比关系,所以乘子(delta)也可以二分求解。

    [NOI2012]迷失游乐园

    对于一棵树,从根出发最后一定是到一个叶子。当经过一个度数为(p)的点时,概率乘上(frac{1}{p})(frac{1}{p-1})
    考虑每条边的贡献,换根(dp)即可。基环树由于环很小所以没什么区别,大力讨论起终点的位置然后暴力。

    [NOI2013]

    [NOI2013]向量内积

    目前最喜欢的一道(NOI)题。
    先考虑(k=2),显然可以构造两个矩阵(A,B),满足([c_{i,j}]C=A imes B)(vec_i,vec_j)的向量内集。
    我们现在的目标是判断(A imes B)是否为除对角线外全(1)的矩阵。
    随机化,通过(rand)几个行向量与原矩阵向量相乘优化矩乘复杂度,然后判断结果是否相同。
    关于(k=3),把矩阵(C)的每一项平方即可变为(k=2)的问题。
    发现(c_{i,j}=(sum_{k=1}^n a_{i,k}b_{k,j})^2=sum_{k=1}^nsum_{t=1}^n(a_{i,k}a_{i,t})(b_{k,j}b_{t,j})),所以扩域即可。

    [NOI2013]快餐店

    考虑计算快餐店落在每条边上的答案,变为求基环树上到某条边的最长路径,随便(dp)一下。

    [NOI2013]树的计数

    问题变为(bfn)序期望分多少层,考虑在一棵树上(dfs)的过程,不难发现:
    (dfn_{bfs_{i}}>dfn_{bfs_{i+1}}),则(i,i+1)必须分一层,贡献为(1)
    (bfn_{dfs_{i}}<bfn_{dfs_{i+1}}),则(bfn_{dfs_{i}},bfn_{dfs_{i+1}})最多分一层。剩下的未定点贡献均为(0.5)

    [NOI2014]

    [NOI2014]购票

    可以写出一个斜率优化的式子,然后上有根树点分治就行了。

    [NOI2014]动物园

    (next)树,然后(dfs)一遍用栈维护即可。也可以先求(next),然后类似求(next)的把答案求出来。

    [NOI2015]

    [NOI2015]品酒大会

    建后缀数组,按照(Height)从大到小合并,带权并查集维护答案。

    [NOI2015]寿司晚宴

    按照(>sqrt{n})的质因子分层状压(dp)

    [NOI2015]小园丁与老司机

    暴力(dp),然后把所有路径抠出来后变为(DAG)覆盖问题,跑上下界网络流。

    [NOI2016]

    [NOI2016]区间

    枚举(r)(l)显然随着(r)的增长单调递增。双指针后用线段树判合法,实时更新答案。

    [NOI2016]循环之美

    纯循环小数满足:(x(K^t-1)equiv y(mod K)),由于(xperp y)(K^tequiv 1(mod y)),有解时(Kperp y)
    所以(Ans=sum_{x=1}^nsum_{y=1}^m [xperp y][Kperp y]=sum_{y=1}^m[Kperp y]sum_{d|x,d|y}mu(d))
    (Ans=sum_{d}mu(d)lfloor frac{n}{d} floorsum_{y=1}^{lfloor frac{m}{d} floor} [ydperp K]=sum_{d}lfloor frac{n}{d} floor(sum_{y=1}^{lfloor frac{m}{d} floor}[Kperp y])mu(d)[dperp K])
    (f(d)=mu(d)[dperp K]),问题变为求(sum_{i=1}^n f(d))
    (g(d)=[dperp K]),可以发现(f(d)*g(d)=e),然后上杜教筛就行了。

    [NOI2016]优秀的拆分

    使用(SA)的顶标法解决。

    [NOI2016]国王饮水记

    把水位低于首都水位的地方先扔掉,把城市按水位升序排序。然后疯狂找(cai)性(jie)质(lun)。
    (1)一个水池只会被合并一次,显然。
    (2)最终合并的水池一定是一段后缀且分成若干连续段合并,反证法显然。
    (3)把水池分开合并比一起合并更优,感性理解手玩一下的确是这样的。
    (f_{i,j})表示前(i)个水池合并(j)次的最优解,(f_{i,j}=min_kfrac{s_i+(f_{k,j-1}-s_k)}{i-k+1}),其中(s_i)为水位前缀和,左式显然斜率优化。
    (4)斜率优化的决策单调,即(k)随着(i)的增加而不降。利用(s_{i+1}ge s_{i}+i),带入暴力验证即可。
    (5)合并水池长度单调不升,若两段(l_i <l_{i+1}),把(l_{i+1})的第一个元素移到(l_i)会更优,列式子暴力验证即可。
    (6)长度大于(1)的段不会很多,不超过(log(frac{nh}{min(h_i-h_j)})),即不超过(14),打表可得。
    然后利用上述性质,我们只用求解(f_{i,jleq 14}),最后(dfs)一遍,用高精小数类求出精确答案。

    [NOI2016]旷野大计算

    造计算机神题,题解令开一份:戳这里

    [NOI2017]

    [NOI2017]整数

    先考虑(|a|=1,b=1)的暴力,线段树模拟二进制,加法就是向高维找(0),减法就是向高维找(1)
    可以发现(b>1)其实并没有什么不同,压位即可。

    [NOI2017]蚯蚓排队

    用链表模拟,每次(O(K^2))暴力合并/删除即可。考虑每个点的贡献可以分析出复杂度为(O(nK))

    [NOI2017]泳池

    先把问题转为求面积(leq K)的方案数。预处理长度为(i(ileq K))的合法方案数,剩下的就是线性递推。
    考虑最低点,设(f_{i,j})表示长度为(i),最低点高度为(j)的合法方案数,其中(ijleq K)故状态数调和级数。
    转移枚举最低点在哪(强制选最小最低点):(f_{i,j}=q^j(1-q)sum_{k=1}^j (sum_{l=k+1}^{1000}f_{k-1,l})(sum_{r=k}^{1000}f_{i-k,r}))

    [NOI2017]游戏

    搜一下未确定点的选择,然后上(2-sat)

    [NOI2017]蔬菜

    首先第(i-1)天的蔬菜集合一定是第(i)天的子集,所以实际上只用求最大的那天的结果。
    建网络流模型,(S o)每种蔬菜,每种蔬菜按时间建一条链,链的容量限制按变质递减,链上每个结点向对应那天连边。
    考虑每次增广,可以发现反悔边没有鸟用(每种蔬菜只用一个增广方向),所以考虑模拟费用流。
    不难发现找最长路等价于每次取出价值最大的蔬菜增广,拿个堆维护即可。
    最后的问题在于链上递减的容量限制。
    因为每种蔬菜对每一天的贡献都是一样的,所以贪心的先增广较晚的天就行了,用并查集搞下。

    [NOI2018]

    [NOI2018]归程

    (Dij)预处理(1)到每个点的最短路。建(Kruskal)重构树,问题变为子树最小值,随便维护下。

    [NOI2018]冒泡排序

    合法的充要条件为:不存在长度为(3)的下降序列。
    稍加思考可以得到(dp):设(f_{i,j})表示前(i)个的最大值为(j),转移(f_{i,j}=sum_{k=1}^j f_{i-1,k}),其中(jge i)
    加了字典序的限制,考虑数位(dp),即我们需要直到一个后缀的方案数。
    (g_{i,j})表示还有(i)个数要放,前面放的数的最大值为(j)的方案数,转移(g_{i,j}=sum_{k=j}^nf_{i+1,k}),其中(jge n-i+1)
    用网格图优化一下(g)的求解,然后用树状数组维护合法性,从前往后数位(dp)求出答案。

    [NOI2018]你的名字

    先求(T)有多少不同子串,然后求(T)的每个前缀在(S)上的匹配长度,这个放在(S)(SAM)上跑一下即可。
    为了防止算重,对(T)也建(SAM),然后在这个(SAM)上跑一遍把答案跑出来。

    [NOI2018]屠龙勇士

    (set)把每次战斗的剑搞出来,用扩欧把式子化为同余方程,然后上(EXCRT)

    [NOI2018]情报中心

    (Len_{(u,v)})表示路径((u,v))的长度。根据部分分的提示,分(S_1,S_2)两种情况讨论:
    (1)两条路径的(lca)不同:
    我们可以把路径((u,v))拆成两条直上直下的路径((u,z)),其中(dep_u>dep_z)
    那么路径的交是一条从上往下的链,设为((a,b)),其中(dep_a>dep_b)
    考虑枚举(a),那么就是选两条路径((u_1,z_1),(u_2,z_2))满足(u_1,u_2)(a)的不同子树中。
    这组选择的答案为:(Len_{(u_1,v_1)}+Len_{(u_2,v_2)}+val_1+val_2-dis_a+max(dis_{z_1},dis_{z_2}))
    (f_{x,j})表示(u)(x)子树内,(dep_z=j)的最优信息,用线段树合并维护一下这个值并求答案。
    (2)两条路径的(lca)相同:
    首先对每个(lca)建虚树。对每个虚树分别求一遍。
    ((u_1,v_1),(u_2,v_2))的路径交为((a,b)),其中(u_1,u_2)(a)子树中。
    一个关键的转化:答案的两倍=(Len_{(u_1,v_1)}+Len_{(u_2,v_2)}+val_1+val_2+dis(u_1,u_2)+dis(v_1,v_2))
    考虑枚举(a),那么令(W_{(u_1,v_1)}=Len_{u_1,v_1}+val_1+dis_{u_1})
    答案变为(dis(v_1,v_2)+W_{(u_1,v_1)}+W(u_2,v_2)-2dis_{a})(-2dis_a)扔掉,就是一个集合直径问题。
    额外挂的边权值可能为负,但分析可知这张图依旧满足正权直径定理,所以暴力合并即可。
    结合两部分就是正解,第一部分为(O(nlogn)),第二部分为(O(n+m)),需要注意实现细节。

  • 相关阅读:
    使用Mxnet基于skip-gram模型实现word2vect
    【快学springboot】SpringBoot整合Mybatis Plus
    面试官:说说Spring中的事务传播行为
    「快学SpringBoot」配置文件的加载顺序和配置项默认值设置
    「快学springboot」SpringBoot整合freeMark模板引擎
    「快学springboot」SpringBoot多环境配置文件
    为什么阿里规约手册要求谨慎使用Arrays.asList方法
    「快学Docker」Docker简介、安装和Hello World实现
    Java中的transient关键字
    IDEA设置窗口标签换行显示
  • 原文地址:https://www.cnblogs.com/GuessYCB/p/10753622.html
Copyright © 2011-2022 走看看