zoukankan      html  css  js  c++  java
  • 杂题

    题意

    对于两个长度分别为(n,m)的序列(A,B),初始时指针为((0,0))
    若当前和(>0),两个指针((a,b))随意一个增加(1)
    若当前和(=0),选择下一个位置为(1)的随意一个增加(1)
    一个序列对合法当且仅当任意时刻和(ge 0)
    给定两个有部分位置缺失的序列,给部分位置填({-1,1}),求有多少种方案使得序列对合法。
    (n,mle 5000)

    做法

    结论:令(s_a,s_b)分别为两个序列以(-1)结尾的最小前缀和(若序列无(-1)则取整个序列的前缀和)。若(s_a,s_b)均不为整个序列的和,合法当且仅当(s_a+s_bge -1);否则合法当且仅当(s_a+s_bge 0)

    proof
    (s_a+s_bge 0),则显然合法。
    (1)若均不为整个序列的和,且满足(s_a+s_b=-1)
    首先这是充分的: 在到达((a-1,b))((a,b-1))时,前缀和为(0),此时(b+1/ a+1)必定为(1)(否则不为最小前缀和),那么下一步移动到((a-1,b+1)/(a+1,b-1)),那么合法。
    (s_a+s_b<-1),则不合法:
    由于(s_{a-1}+s_{b-1}le 0),某时刻到达((a-1,b-1))则必定不合法,在当前的指针所在位置(le (a,b)),若大于(0),则在不超过((a,b))的基础上移动,一般的,若某一时刻到达((a-1,x)),当前和(>0),那么移动第二维,否则由于(a)的位置为(-1),也必定移动第二维,故一定能到达((a-1,b-1))
    (2)若存在一个使得为整个序列的和,且满足(s_a+s_bge 0)
    (s_a+s_ble -1),则不合法:
    若两个均为整个序列,显然最后和会(le -1)
    假设(a)为整个序列,(b)不为整个序列,那么到达((a,b-1))则不合法,能到达((a,b-1))同上。

    考虑其中一个序列,(f_{i,j,0/1})为填完([i,n]),以(-1)结尾(若暂时还没有(-1)则最小前缀和为(n-i+1))的最小前缀和(=j),是否(j)等于总和,的方案数。

    初始时(f_{n+1,0,1}=1)

    • (i-1)(1)(f_{i,j,0} ightarrow f_{i-1,j+1,0},f_{i,j,1} ightarrow f_{i-1,j+1,1}).

    • (i-1)(-1)(f_{i,j,0} ightarrow f_{i-1,min(-1,j-1),0},f_{i,j,1} ightarrow f_{i-1,min(-1,j-1),[jle0]})

  • 相关阅读:
    正在找工作/打算找工作的看过来!
    xx星空面试题
    买的书不少,看的书不多,这是病
    公司那么多 我想去面面
    Android设备直接运行java项目?还杀不死?
    node-sass安装失败 解决办法(linux和window)
    Vue + element控制鼠标右键菜单
    Vue.js中Promise、异步、同步、定时器
    选择器&伪类选择器
    根据城市名称获取对应的省份名称
  • 原文地址:https://www.cnblogs.com/Grice/p/14704560.html
Copyright © 2011-2022 走看看