摘要: 思路:首先容易想到二分答案,但如何去check呢,对于一段区间[l,r],把所有小于答案的都赋值为-1,大于等于它的都赋值为1,然后求左端点在[a,b],右端点在[c,d]的最大子串和即可(也就是区间[a,b]的最大右子串和加上(b,c)的子串和加上区间[c,d]的最大左子串和)这样既可,用个线段树 阅读全文
posted @ 2016-10-28 14:23 DUXT 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 思路:可持久化线段树,利用权值线段树,把建树过程看成插入,插入第i个元素就在第i-1棵树的基础上新建结点然后得到第i棵树,那么询问区间[l,r]就是第r棵树上的信息对应减去第l-1棵树上的信息,然后再利用权值线段树的职能找第k大,这里就巧妙地利用了可持久化线段树不修改原来线段树上的信息而是新建结点来 阅读全文
posted @ 2016-10-28 12:04 DUXT 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 思路:树套树,我写了两种,一种是线段树套splay,线段树维护区间信息,splay维护第k大,一种是树状数组套权值线段树(并不是什么可持久化线段树,只不过是动态开点罢了,为什么网上一大堆题解都是可持久化线段树。。。。。明明可以直接修改的,不过可持久化线段树应该也是可以写的),树状数组维护前缀和,权值 阅读全文
posted @ 2016-10-28 11:55 DUXT 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 思路:折半搜索,每个数的状态只有三种:不选、选入集合A、选入集合B,然后就暴搜出其中一半,插入hash表,然后再暴搜另一半,在hash表里查找就好了。 阅读全文
posted @ 2016-10-28 11:36 DUXT 阅读(265) 评论(0) 推荐(3) 编辑
摘要: 思路:插入、修改操作是splay的模型,然后询问的话就可以二分答案,然后再用splay去判,关键就在于怎么去判断。 可以用字符串hash,splay每个节点维护一个hash域,然后就可以定义一个进制去hash即可二分判断,hash值让其自然溢出即可。 阅读全文
posted @ 2016-10-28 11:29 DUXT 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 思路:设f[i][j]表示前i位后j位与不吉利串前j位相同的方案数,然后f[i][j]+=f[i-1][k]*trans[k][j],trans[k][j]表示串s后k位与不吉利串前k位相同,添加一个字符后后j位与不吉利串前j位相同的方案数,显然这个矩阵是可以用kmp求的,然后因为只能由i转移到i+ 阅读全文
posted @ 2016-10-28 11:23 DUXT 阅读(208) 评论(1) 推荐(0) 编辑
摘要: 思路:首先所有情况就是m^n,然后不可能发生越狱的情况就是第一个有m种选择,第二个要与第一个不同就是m-1种选择,第三个要与第二个不同也是m-1种选择,然后不可能发生越狱的情况数就是m*(m-1)^(n-1),然后用总方案数减去它即可。 阅读全文
posted @ 2016-10-28 11:10 DUXT 阅读(270) 评论(3) 推荐(0) 编辑
摘要: 思路:首先按斜率排序,如果斜率相同就取截距最大的,显然截距小的会被覆盖而对答案没有贡献,然后考虑斜率不同的如何统计答案,可以用一个单调栈维护,当前新插入的直线显然斜率是要比当前栈顶斜率要大的,然后如果新插入的直线l[i]与stack[top]的交点在stack[top]与stack[top-1]的交 阅读全文
posted @ 2016-10-28 11:04 DUXT 阅读(162) 评论(0) 推荐(0) 编辑
该文被密码保护。 阅读全文
posted @ 2016-10-28 10:42 DUXT 阅读(7) 评论(0) 推荐(0) 编辑
摘要: 思路:将关键点按dfs序排序,然后显然就是dfs序中相邻的两个点的距离之和加上最后一个点到第一点的距离(YY一下很显然),动态维护就用splay就好了(我是一个不会用set的蒟蒻。。。。。) 阅读全文
posted @ 2016-10-24 17:16 DUXT 阅读(181) 评论(0) 推荐(0) 编辑