摘要: 考虑b的两种情况,一种是p的祖先,这种点有min(k,de[p] 1)个,然后每个这种b都有si[p] 1个c点可选; 另一种是p的子孙,要求是在p的子树内且deep在de[p]+1~de[p]+k之间,然后一个这样的b点贡献是si[b] 1,也就是在他的子树内选c点,考虑怎么算这个,用dfs序维护 阅读全文
posted @ 2019-04-22 15:39 lokiii 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 第一、二问: 就是最小的最长公共长度+1,设f[i][j]为a匹配到i,b匹配到j,第一问的转移是f[i][j]=(a[i]==b[j]?f[i 1][j 1]+1:0),第二问的转移是f[i][j]=(a[i]==b[j]?f[i 1][j 1]+1:f[i][j 1]),注意这里更新最小公共长度 阅读全文
posted @ 2019-04-22 14:30 lokiii 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 整体二分: 对于每一个修改操作,标记为1,并且加一个标记为 1的这个位置原来值,并且对于a数列每个点都当成修改操作 然后整体二分,扫当前操作区间lr,把在值域区间标记为1和 1的操作都在树状数组对应位置上加/减出来,然后询问操作根据k和询问答案大小决定放在哪部分传下去 cpp include inc 阅读全文
posted @ 2019-04-22 10:27 lokiii 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 脑子一抽开始写主席树,敲了一会发现不对…… 整体二分,用二维树状数组维护值为当前区间的格子个数,然后根据k的大小和当前询问的子矩阵里的值和k的大小关系来决定这个询问放在哪一部分向下递归 cpp include include include using namespace std; const in 阅读全文
posted @ 2019-04-22 08:01 lokiii 阅读(153) 评论(0) 推荐(0) 编辑