上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 25 下一页

bzoj 3343 分块

摘要: 因为询问比较少,所以我们可以将n个数分成sqrt(n)个块,每个块用一颗bst存一下,然后对于修改l,r,我们将l,r区间中整块的直接在bst上打一个标签,对于不是整块的我们直接暴力修改,对于询问l,r,仍然是整块的直接在bst中求大于c的个数(考虑标签),然后不是整块的部分暴力扫一遍更新答案。 我写的sbt,可能是sbt常数比较大什么的,tle了,其实对于每一个块我们可以快排保存,然后询问的时候二分就好了。然后对于不是整块的修改和询问可以直接改完之后再快排,这样常数小了很多。 懒得改了,贴sbt的吧。/*****************************************... 阅读全文
posted @ 2014-02-25 23:36 BLADEVIL 阅读(413) 评论(0) 推荐(0) 编辑

bzoj 1503 平衡树

摘要: 我们可以用一颗平衡树维护每个人的工资,因为工资的变化会影响到后面所有的人,所以我们打一个标签,向平衡树里插入的时候减去这个标签的值,这样代表改变了之后的零点,,这样维护这个标签就好了,输出的时候要加上这个标签。 反思:]后面打了个|,查了半天。。/************************************************************** Problem: 1503 User: BLADEVIL Language: C++ Result: Accepted Time:676 ms Memory:3932 kb******... 阅读全文
posted @ 2014-02-25 23:07 BLADEVIL 阅读(321) 评论(0) 推荐(0) 编辑

bzoj 1006 MCS算法

摘要: 根据陈丹琪的论文弦图与区间图,求出弦图的完美消除序列之后,反向给每个点染可以染的最小的颜色,这样可以使用最少的颜色染色,染色的方案即为队伍数。 那么我们需要求该图的完美消除序列,使用MCS算法,从后向前求完美消除序列,我们设size[i]为i这个点的标号,表示该点与多少个以标记的点相连,选取标号最大且i最大的点(即n)为序列的第n个,然后更新与i相连的点的标号,重复n次,即可得到弦图的完美消除序列,使用动态链表维护可以使时间复杂度达到O(m+n),暴力循环也有n^2,这道题暴力即可过。/***************************************************... 阅读全文
posted @ 2014-02-23 17:47 BLADEVIL 阅读(736) 评论(0) 推荐(0) 编辑

AC自动机讲解

摘要: AC自动机是处理多模式串匹配等一系列问题的工具,可以将它当做一种数据结构。 首先我们考虑一个非常简单的问题,给定两个字符串,询问其中一个字符串在另一字符串中出现的次数,这个问题我们用KMP就可以非常容易的解决了,但是如果给定若干模式串,询问这组串在这个长串中的各个出现次数,这时KMP的时间复杂度就显然比较暴力了,对于这类的问题,我们可以考虑用AC自动机来解决(假设字符串中字符为大写字母)。 定义指针。struct node{ int cnt; node *fail,*child[30]; node(){ cnt=0; fail=NULL; ... 阅读全文
posted @ 2014-02-23 17:40 BLADEVIL 阅读(1123) 评论(0) 推荐(1) 编辑

双关键字LIS

摘要: 首先对于双关键字的LIS有一个比较暴力的方法,就是线段树套平衡树,我们把双关键字的LIS抽象成二维坐标系中的点,这样我们对于当前转移的点i(x,y),需要找的就是在(xx,yy)xx<x,yy<y中的决策点的最大值是多少,这样我们用线段树维护第一维坐标,用sbt或者是线段树维护第二维坐标,这样就可以了。 但是树套树的常数非常大,将线段树改为BIT之后虽然对常数有一些优化,但还是较大,所以我们需要考虑另一种方法。 在求单关键字的LIS的时候,有一种nlogn的二分做法,大概意思是维护一个b[i]数组,对于第i位b[i]代表长度为i的上升子序列的最后一位最小的值,那么在二维的情况下,我 阅读全文
posted @ 2014-02-23 16:02 BLADEVIL 阅读(358) 评论(0) 推荐(0) 编辑

bzoj 1207 DP

摘要: 我们用w[i]表示到第i个地鼠出现的时候,我们选了第i个地鼠,能得到的最大的价值,那么显然有转移w[i]=w[j]+1(time[i]-time[j]>=abs(x[i]-x[j])+abs(y[i]-y[j]))。每次转移为O(1)的,一共转移了Σi(i#include #define maxm 10010using namespace std;int n,m,ans;int time[maxm],x[maxm],y[maxm],w[maxm];int main(){scanf("%d%d",&n,&m);for (int i=1;i=abs(x[i 阅读全文
posted @ 2014-02-23 13:34 BLADEVIL 阅读(257) 评论(0) 推荐(0) 编辑

bzoj 1305 二分+最大流判定|贪心

摘要: 首先我们二分一个答案mid,在判定是否能举办mid次,那么对于每个次我们可以用最大流根据是否满流(流量为n*mid)来判定,对于每个点我们拆成两个点,分别表示这个人要和他喜欢和不喜欢的人一起跳舞,那么添加源点source,汇点sink,设i为男生,j为女生,那么连接表示这个人要跳mid次,同理连接,这样我们保证了每个人都是跳了mid次舞,那么对于每一对儿喜欢关系i,j,连接,对于不喜欢的i,j连接,那么我们保证了每个人都可以和所有人跳舞,对于i中的每个点连接代表这个人最多和k个不喜欢的人跳舞,同理对于j中的每个人连接,因为每次和不喜欢的人跳舞,一定会经过这条边,所以保证了最多不会和超过k的.. 阅读全文
posted @ 2014-02-21 20:33 BLADEVIL 阅读(814) 评论(1) 推荐(0) 编辑

bzoj 1084 DP

摘要: 首先对于m==1的情况非常容易处理(其实这儿因为边界我错了好久。。。),直接DP就好了,设f[i][k]为这个矩阵前i个选k个矩阵的最大和,那么f[i][k]=max(f[j][k-1]+sum[j+1][i]),那么对于m==2的时候类似与m=1的时候,设w[i][j][k]为左面的一行前i个中,右面的一行前j个中,一共选k个矩阵能选取得最大矩阵。 那么转移也比较明显,有一下几种转移 w[i][j][k]=max(w[i-1][j][k],w[i][j-1][k])这种情况代表什么都不选。 w[i][j][k]=max(w[ii][j][k-1]+sum[ii+1][i][0])这... 阅读全文
posted @ 2014-02-21 19:12 BLADEVIL 阅读(378) 评论(0) 推荐(0) 编辑

bzoj 1054 bfs

摘要: 就是bfs,对于每个状态存一个hash为当前状态矩阵的二进制表示,然后搜就行了,写成双向bfs会快很多。 反思:对于C++的数组从0开始还不是特别习惯,经常犯错,对于C++的结构体不熟。/************************************************************** Problem: 1054 User: BLADEVIL Language: C++ Result: Accepted Time:112 ms Memory:1940 kb************************************... 阅读全文
posted @ 2014-02-20 10:42 BLADEVIL 阅读(214) 评论(0) 推荐(0) 编辑

bzoj 1057 单调栈

摘要: 首先我们可以枚举每个一点,然后向下一直拓展到不能拓展为止,然后向下拓展的同时我们可以算出来向左最多拓展的个数,用单调栈来维护一个上升的序列,这样就类似与悬线法找最大01子矩阵了,但是对于这题01交替来说,好多细节比较麻烦,所以我们可以采用另一种转换方法,对于一个01矩阵来说,一定满足一下两个条件中的一个: 1:矩阵中所有0的点(i,j),i与j的奇偶相同,且对于所有1点(i,j),i与j的奇偶不同。 2:矩阵中所有0的点(i,j),i与j的奇偶不同,且对于所有1点(i,j),i与j的奇偶相同。 那么我们把所有满足1条件的点标号为1,满足2条件的点标号为0,这样,我们就求出标号矩阵的01子... 阅读全文
posted @ 2014-02-19 14:19 BLADEVIL 阅读(489) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 25 下一页