- 博客(14)
- 收藏
- 关注
原创 树状数组(暑假选拔)
Problem Description某天小Y家门前突然多出了两座石塔,这两座石塔妨碍了小X的出行,现在小X想要破坏这两座石塔,假设两座石塔分别由n1与n2块石头构成,每一块石头都有一个破坏顺序的优先级,并且保证这两座石塔中没有两块优先级一样的石头,小X觉得优先级越高的石头应该越早破坏掉,小X可以每次从任意一座石塔的塔顶移动一块石头到另外一座石塔的顶端,若此石头是所有石头中优先级最高的,则
2016-07-15 10:40:43
304
原创 线段树1(带懒惰标记的区间更新和整棵树的查询)
Problem Description皮特的幸运数是2和5。只由幸运数字2和5组成的数列,称为幸运数列。对于幸运数列,有两种操作。1、switch i j表示数列从第i个数到第j个数中,所有的2改成5,所有的5改成2.例如幸运数列25525,执行switch 2 4操作,则数列变成222552、count表示要求输出当前幸运数列的最长不下降子序列(即子序列中
2016-07-13 10:49:58
469
原创 二分
从1到N能整除X的数有【N/X】个从1到N不能整除X的数有【N-N/X】个从1到N能整除X且整除Y的个数有【N/X+N/Y-N/(X*Y)】个 找到一个数V,使从1到V,至少有cnt1个数不能整除x,剩下的数至少有cnt2个数不能整除y解:若一个数mid,有(mid-mid/x)>=cnt1 && (mid-mid/y)>=cnt2 && (mid-mid/(x*y))>
2016-05-05 21:02:06
228
原创 区间相关贪心
给一些区间,选取最多的不相交区间:按右端点优先排序(长度最小),如果待选择区间的左端点大于已选择区间的右端点,则此选择此区间 给一些区间,每次选取一些不相交区间,问最少选几次才能选完所有区间每次选取最少的不相交区间按左端点优先排序(长度最大),如果区间的左端点大于已经选择区间的右端点,则选择此区间 给一些区间,选取几个点,使每个区间上至少有k个点按右端点优先排序,找
2016-05-05 19:38:42
293
原创 博弈论(n堆硬币)
有n堆硬币,每堆分别为k1,k2,k3……..kn个,两个人从中取硬币,每次至少拿一个且只能从一堆里面拿,问谁能赢若k1^k2^k3^……^kn!=0,先拿者必胜,若k1^k2^k3^……^kn==0,先拿者必败能赢策略:将(k2^k3^……..^kn),( k1^k3^……..^kn),( k1^k2^k4^……..^kn),( k1^k2^k3^……..^kn-1)分别与k1,k2,k
2016-05-05 19:38:04
1303
原创 树状数组
树状数组lowbit(x)=x&(-x);//增加某个元素的大小,向上更新,n为数组的长度void plu(int pos,int num){ While(pos { c[pos]+=num; pos+=lowbit(pos); }}//求前a项和
2016-04-24 10:54:23
187
原创 表示图的静态邻接矩阵
int head[MAXN]//以该点为起点的边在数组的哪个位置;struct Edge{ int u,w,next//记录同一起点的下一条边在数组的哪个位置;}edge[MAXM];for(i=0;i { scanf("%d%d %d",&a,&b,&c); edge[num].u=b;//u为终点
2016-04-21 22:58:04
224
原创 单源最短路
/* 1.开一个二维数组记录从点A到点B需要的距离,road[MAXN][MAXN]需要初始化为MAX 开一个vis(记录是否被访问)和dis(记录从源头到该点的最短路)数组,开一个队列 2.spfa 初始化vis为0,dis为MAX,源头vis为1,dis为0,将源头放入队列 当队列不为空时执行循环
2016-04-21 22:55:26
234
原创 多源最短路:floyd
/* 1.创建一个dis[MAXN][MAXN]数组,并初始化,dis[i][i]=0,其余为一个很大的数 2.if(dis[2][3]>dis[2][1]+dis[1][3])dis[2][3]=dis[2][1]+dis[1][3]; */constint MAXN=105; constintMAX=999999999;intdis[MAXN][
2016-04-21 22:54:31
207
原创 最小生成树Kruskal
/* 1.建Edge结构体,储存每条路的端点和距离,建立edge[边数] 2.建立并查集parent,并初始化 parent[i]=-1; 3.输入各个edge,并按照距离的大小从小到大排序 4.遍历每个edge (1).找到两个端点的父节点 (2).如果不相等,将端点连接起来,答案加上这两
2016-04-21 22:52:40
184
原创 并查集
并查集:初始化:memset(parents,-1,sizeof(parents));查询x所在集合int find(int x){returnparents[x]==-1?x:parents[x]=find(parents[x]);}是否属于同一个集合:bool same(int x,int y){ return find(x)==find(y);}
2016-04-21 22:51:49
165
原创 巴什博奕
1.取硬币:给N枚硬币,每次取1~M枚,问谁拿走最后一枚当轮到谁时,硬币剩下k*(m+1)枚,谁就不能拿走最后一枚当轮到谁时,硬币剩下k*(m+1)+s(0 2.给一个N*M的格子,棋子最开始在左上角,每次可以向左,向下,向左下走一个,两个人走,问先手是否必胜当N于M中有一个为偶数是,先手必胜
2016-04-21 22:49:44
235
原创 HDU 1024 MAX SUM PLUS PLUS
题意:给一个长度为n的序列,从中选出m个片段,使这m个片段的总和最小dp[i][j]为前j个序列选出i个片段的最大值,且j被选中dp[i][j]=max(dp[i][j-1],max(dp[i-1][k]))+a[j];//1就是将第j个数加入到之前的i个片段中,或者第j个数自己为一个片段的开头滚动数组:dp[i][j]有MAX*MAX,根据dp的无后效性,若dp[
2016-04-19 22:52:57
335
原创 背包入门
01背包(最大)初始化:memset(dp,0,sizeof(dp)); for(i=1;i for(j=W;j>=w[i];j--)//从大到小,否则会重复 dp[j]=max(dp[j],dp[j-w[i]]+v[i]);完全
2016-04-11 22:17:09
187
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人