自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序员充电站(itcharge)

高效率编程,慢节奏生活。

  • 博客(34)
  • 资源 (3)
  • 收藏
  • 关注

原创 HDU2896 病毒侵袭【AC自动机】

题目大意:给你N个模式串(编号为1~N)。接下来给你M个主串。问:主串中出现的模式串的编号。思路:和HDU2222一样。都是求文本串(主串)中出现的模式串。不同的是这道题要求输出的是模式串的编号。用Val[]来保存模式串的编号id。同时注意字符为ASCII码可见字符,即32~127共95个。其实定义95就可以了,我这里定义了128,不过没什么影响。

2015-05-23 00:05:50 1078

原创 POJ3984 迷宫问题【BFS】

题目大意:用一个5*5的二维数组表示迷宫,输出左上角到右下角的最短路径。思路:用BFS求最短路径。用pre[]来记录每个状态之前的状态,然后递归输出路径。

2015-05-18 13:03:30 3210

原创 HDU4152 ZZY’s Dilemma【枚举】

题目大意:ZZY有N个目标,每个目标都有一个分数值,只有达到给定的分数值才算完成目标。他有M个习惯。每个习惯对这N个目标有影响xi,xi >= 0,表示对目标有积极作用,xi < 0表示对目标有消极作用。现在问:如果ZZY想实现这N个目标,他能够有的习惯数目最大是多少,并输出能够有的习惯编号。思路:用0和1来表示选和不选习惯i,则有2^M种情况(最多为2^16 = 65536)。枚举得到结果。用Goal[]存储目标分数,F[i][j]来存储第 i 习惯对第 j 个目标的影响。G[]存储不同习

2015-05-18 11:50:33 1463

原创 HDU1709 The Balance【母函数】

题目大意:现有一个天平和不同质量的砝码,每个质量的砝码只有一个,且令S为这些砝码质量的总和。现在,从1~S中,找到用这些砝码不能称出的物品质量。思路:每种砝码既可以放在右盘,又可以放在左盘,如果视作左物右码的话,砝码放在左边取减号,放在右边取加号。最终将指数看为正数,求得的系数要求绝对值。放在同一端c2[j+k] += c1[j];放在不同端c2[abs(k-j)] += c1[j]。

2015-05-15 10:39:16 1161

原创 HDU2110 Crisis of HDU【母函数】

题目大意:公司有N种价值的资产,每种价值的资产数量已知,问能否得到总资产1/3的分割资产方法。问:分割资产的方案数是多少(mod 10000)。思路:给定N种价值的资产,设每种价值Pi的数量为Mi,则总资产为sum = Σ Pi*Mi (1 <= i <= N)。可得母函数g(x) = Π(1 + x^Pi + x^(2*Pi) + … + x^(Pi*Mi) ) (1 <= i <= N)。找到sum/3的系数即可。

2015-05-15 09:34:09 1031

原创 NEFU776 抓住奥斯卡【母函数】

题目大意:给你面值为1分、2分、5分的硬币,并且这些硬币的数量分别为N1,N2和N5。问:这些硬币最小不能表示的值为多少。思路:母函数问题,通过分析,可得:g(x) = (1+x+x^2+x^3+…+x^N1) * (1+x^2+x^4+…x^(2*N2) ) * (1+x^5+x^10+…x^(5*N5) )这些硬币能表示的最大值Max = N1 + N2*2 + N5*5。考虑1,2,…,Max,Max+1次幂的系数是否为令,找出这些硬币不能表示的最小的值。

2015-05-15 08:54:42 941

原创 HDU1028 Ignatius and the Princess III【母函数】【完全背包】

题目大意:给定正整数N,定义N = a[1] + a[2] + a[3] + … + a[m],a[i] > 0,1 <= m <= N。对于给定的正整数N,问:能够找出多少种这样的等式?思路:对于N = 4,4 = 4;4 = 3 + 1;4 = 2 + 2;4 = 2 + 1 + 1;4 = 1 + 1 + 1 + 1。共有5种。N=4时,结果就是5。其实就是整数分解问题,可写出母函数g(x) = (1+x+x^2+x^3+…)*(1+x^2+x^4+…)*(1+x^3+…)*(

2015-05-14 22:45:38 1108

原创 HDU1398 Square Coins【母函数】

题目大意:Silverland居住的人们使用方币,这种硬币的价值都是平方数。硬币的价值分别为1分、4分、9分,…,最大为289(17^2)分。要得到10分钱,共有四种硬币组合10个1分硬币、1个4分硬币和6个1分硬币、2个4分硬币和2个1分硬币,1个9分硬币和1个1分硬币。现在给你一个数,问:得到这个值,共有多少种不同的硬币组合方式。思路:典型的母函数问题。可列出母函数 g(x) = (1+x+x^2+x^3+…)*(1+x^4+x^8+…)*…*(1+x^289+x^578+…),用母函

2015-05-14 22:33:14 828

原创 HOJ1867 经理的烦恼【树状数组】

题目大意:有C家连锁店,编号1~C,有N条指令,每家店初始的商品数目都是M。接下来N行是命令。命令0:0 x w,连锁店x的商品数量变化为w,w > 0商品数量增加,w < 0商品数量减少。命令1:1 x y,询问编号区间为[x,y]的连锁店商品为素数的商店有多少家。思路:因为区间比较大,所以用树状数组来做。用一个数组Shop[]来存放每家店的商品数目,Tree[]表示树状数组。如果初始商品数量m是素数的话,则每家商店商品都为素数,遍历更新每家店。对于命令0,如果该店铺x的商品数Shop[x

2015-05-14 22:18:23 952

原创 POJ1195 Mobile phones【树状数组】【二维】

题目大意:给出一个N*N的矩阵,初始化都为0,坐标从(0,0)开始。有三个操作:命令1:1 x y w;将坐标为(x,y)处的点值增加w命令2:2 x1 y1 x2 y2;询问左下角坐标为(x1,y1)、右上角坐标为(x2,y2)的矩阵和是多少命令3:3;不需要操作,退出。思路:二位树状数组单点更新,区间求值的简单题。直接做就可以了。最后求矩阵和的时候考虑容斥定理。即ans = Query(x1-1,y1-1)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x2,y

2015-05-14 12:52:11 710

原创 POJ3067 Japan【树状数组】【逆序数】

题目大意:有两排的城市,一排N个城市,编号为1~N,一排M个城市,编号为1~M。这两排城市之间有K条路。路都是直线连接,问:这些路,有多少道路是相交的,并且焦点不是城市所在的点,求出交点个数。思路:树状数组的思想。参考网上的图,先将所有边(u,v)按u升序排列,如果u相同,则按v升序排列。可以看出来,路(u1,v1)和路(u2,v2)如果有交点的话,u1 > u2 并且 v1 < v2,或者 u1 < u2 并且v1 > v2,为了不重复计算,忽略后一种情况。如果排序完之后,可以发现:结果就是

2015-05-13 22:22:35 904

原创 POJ2299 Ultra-QuickSort【树状数组】【逆序数】

题目大意:给你一个包含N个整数的序列,只能通过交换相邻的数字,最终变为升序顺序,问:最少需要多少次交换。思路:其实就是问冒泡排序的交换次数。其实就是求原序列的逆序数。用归并排序、线段树、树状数组都可以做。但是如果用线段树和树状数组来做的话,因为元素个数是500000,但是元素值范围却是999999999,需要先离散化。这里用间接排序的方法。用一个数组Arr[]存放原序列的值,另一个数组Id[]存放原序列编号(1~N),对Id[]按Arr[]元素值的从大到小排序,得到Arr[]数组元素的相对大小

2015-05-13 15:24:14 943

原创 HDU1541 Stars【树状数组】

题目大意:按顺序给你N颗星星的坐标,y是从小到大给出的。每个星星有一个等级,该等级为它左下角的星星的个数。求每个等级的点有多少个。思路:因为y是从小到大给出的,那么可以直接忽略y,只记录x,求出(x,y)左边有多少个点就可以了。用Ans[]数组表示每个等级的星星数。求(x,y)左边有多少个点用树状数组来做,每给一个点,就求出x左边的点个数。作为Ans数组下标,累加个数,最后输出Ans[]数组。

2015-05-13 13:32:59 909

原创 HDU3584 Cube【树状数组】【三维】

题目大意:给定一个N*N*N多维数据集A,其元素是0或是1。A[i,j,k]表示集合中第 i 行,第 j 列与第 k 层的值。首先由A[i,j,k] = 0(1 <= i,j,k <= N)。给定两个操作:1:改变A[i,j,k]为!A[i,j,k]。2:查询A[i,j,k]的值。思路:三维树状数组区间更新、单点查询。更新区间(a,b)时,在 a 和 b+1 处都加1,前边表示增加1,后边是抵消加1操作,最后询问时,用Query(x) % 2 即为单点的值(0或1)。三维区间更新,要注意区

2015-05-13 12:38:05 1340

原创 母函数【模板】

普通母函数 1.根据题目要求得到母函数(生成函数) 2.把第一个括号的表达式的系数赋值到c1中。 3.从第二个括号开始计算每一项乘积。 4.迭代得到最终母函数结果。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;int c1[1100],c2[1100]

2015-05-07 22:02:33 1183

原创 容斥原理【模板】

容斥原理:在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。LL Q[100010],factor[110],num;//Q数组存放的就是右边边各项的因子数以及正负情况,f

2015-05-07 19:49:19 2264

原创 二分查找、三分查找求极点、二分求等比数列【模板】

二分查找:int a[110],N;int BinarySearch(int *a,int x){ int Left = a[1]; int Right = a[N]; while(Left <= Right) { int mid = (Left+Right)>>1; if(a[mid] == x) retu

2015-05-06 15:36:39 1138

原创 网络流最大流EdmondKarp、SAP【模板】

EdmondKarp算法:const int MAXN = 220; //最大点个数int Map[MAXN][MAXN],pre[MAXN]; //Pre[]前驱数组int N,NP,NC,M;bool EkBFS(int start,int end) //宽度优先搜索寻找增广路{ queue<int> Q; //宽度优先搜索队列 bool vis[MAX

2015-05-05 22:42:32 933

原创 二分图【模板】

二分图:原图G的顶点可以分类两个集合X和Y,所有的边关联的两个顶点恰好一个属于集合X,另一个属于集合Y,则称该图为二分图。 二分图匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,即一个顶点最多只有一条边。则称M是一个匹配。 二分图最大匹配:图中包含边数最多的匹配称为图的最大匹配。 二分图完美匹配:如果所有点都在匹配边上,则称这个最大匹配是完美匹配。 二

2015-05-05 22:12:18 960

原创 2-SAT【模板】

摘自http://www.cnblogs.com/kuangbin/archive/2012/10/05/2712429.html 现有一个由N个布尔值组成的序列A,给出一些限制关系,比如A[x] && A[y] = 0、A[x] || A[y] || A[z]=1等,要确定A[0..N-1]的值,使得其满足所有限制关系。这个称为SAT问题,特别的,若每种限制关系中最多只对两个元素进行限制,则称为

2015-05-05 18:37:28 1225

原创 强连通分量Kosaraju、Tarjan【模板】

强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量。 把一个图变为一个强连通图需要添加边数:先求出原图的强连通分量,缩点后变为有向无环图,计算新图入度为0的点的个数SumIn和出度为0的点的个数SumOut,

2015-05-05 13:06:47 1143

原创 差分约束系统【模板】

差分约束系统:如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如 xj - xi例如如下的约束条件: X1 - X2 X2 - X5 X4 - X1 X5 - X3 全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于)。这样的不等式组就称作差分约束系统。 差分约束系统求解过程: 1.新建一个图,N个变量看作N个顶点,M个约束条件作为

2015-05-05 11:45:00 1979

原创 树状数组【模板】

Tree[N] = A[N-2^k+1] + … + A[N] 单点更新,区间求值:树状数组代表区间的和。const int MAXN = 100010;int N,Tree[MAXN];int Lowbit(int i){ return i & (-i);}void Update(int i,int x){ while(i <= N) { Tree

2015-05-04 22:46:52 1164

原创 K短路【模板】

A*+SPFA算法: (1)将有向图的所有边正向、反向分别存入两个不同的边集(Edges,Edges1)中。用反向边集,以所求终点t为源点,利用SPFA或Dijkstra求解出所有点到t的最短路径,用Dist[i]数组来表示点i到点t的最短距离。 (2)建立一个优先队列,将源点s加入到队列中。 (3)从优先队列中取出最小的点p,如果点p == t,则计算t出队的次数。如果当前路径长度就是s到t

2015-05-04 22:06:16 1873

原创 多源最短路径Floyd、Floyd求最小环【模板】

Floyd算法:用来找出每对点之间的最短距离。图可以是无向图,也可以是有向图,边权可为正,也可以为负,唯一要求是不能有负环。 1.初始化:将Map[][]中的数据复制到Dist[][]中作为每对顶点之间的最短路径的初值,Pre[i][j] = i 表示 i 到 j 路径中 j 的前一节点。 2. k 从 1 到 N 循环 N 次,每次循环中,枚举图中不同的两点 i,j,如果Dist[i][j]

2015-05-04 21:58:04 1344

原创 单源最短路径Dijkstra、BellmanFord、SPFA【模板】

Dijkstra算法: 将所有点分为两个集合。如果源点s到u的最短路径已经确定,点u就属于集合Va,否则属于集合Vb。 1.将源点s到图中各点的直接距离当做初始值记录为s到各点的最短距离,不能到达的记为INF。S到S距离为0。 2.在集合Vb中的点中找一个点u,使得源点s到该点u路径长度最短,将u从Vb中除去,加到V1中。这时候求出了当前S到u的最短路径。 3.把新确定的点u更新s到集合Vb

2015-05-04 19:20:43 1063

原创 树的最小支配集、最小点覆盖、最大独立集【模板】

最小支配集:指从所有顶点中取尽量少的点组成一个集合,使得剩下的所有点都与取出来的点有边相连。顶点个数最小的支配集被称为最小支配集。最小点覆盖:指从所有顶点中取尽量少的点组成一个集合,使得集合中所有的边都与取出来的点有边相连。顶点个数最小的覆盖集被称为最小点覆盖。最大独立集:指从所有顶点中取尽量多的点组成一个集合,使得这些点之间没有边相连。顶点个数最多的独立集被称为最大独立集。

2015-05-04 11:46:42 2449

原创 最近公共祖先LCA【模板】

Tarjan-LCA算法: 对于每一点u: 1.建立以u为代表元素的集合。 2.遍历与u相连的节点v,如果没有被访问过,对于v使用Tarjan-LCA算法,结束后,将v的集合并入u的集合。 3.对于与节点u相关的询问(u,v),如果v被访问过,则结果就是v所在集合的所代表的元素。求(u,v)的最近公共祖先节点,则询问时调用QEdges[k].lca = find(QEdges[k].to);

2015-05-04 11:17:58 1282

原创 KMP【模板】

当字符串匹配失败时,模式串的指针并没有指向0从头比较,而是指向了一个特定的位置,因为这个Next[j]指向的位置pos前长度为Next[pos]的子串,同模式串第j位前的长度为Next[j]的子串是相同的。 即S[0]~S[Next[j]]一定与S[len-1-Next[j]]~S[j-1]匹配。 1.既能做前缀又能做后缀的子串长度 ans[0] = len; int id

2015-05-03 22:53:42 885

原创 最小树形图【模板】

基于贪心和缩点的思想。 假设根的顶点是V0。 (1)除了根结点外,所有的点Vi,找到以Vi为终点的最短的边,加入集合中 (pre[v]存放的是终点v的起点,In[v]存放终点为v的最短的边) (2)检查集合中有没有有向环和收缩点。若没有有向环和收缩点,结束计算;若没有有向环、但含收缩边,则跳至步骤(4);若含有有向环,则跳至步骤(3)。Ps:如果出现重边,将忽略权值较高的 (3)含有有向环

2015-05-03 22:22:37 1526

原创 次小生成树【模板】

给一个图,判断图的最小生成树是否唯一。 End[]记录邻接表尾节点的位置。MST表示最小生成树的大小,SecMST表示次小生成树的大小。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int MAXN = 1010;const int MAXM

2015-05-02 23:49:53 1291

原创 最小生成树【模板】

Kruskal算法struct Edge { int from; int to; int w; }; Edge Edges[200200]; int father[200200],N,M; int find(int x) { if(x != father[x]) father[x] = find(father[x]

2015-05-02 23:46:52 1209

原创 拓扑排序【模板】

拓扑排序【模板】1.普通判断拓扑排序、输出路径:queue<int> Q 2.满足字典序的拓扑排序:priority_queue<int,vector<int>, greater<int> > Q; 保证了权值小的优先级高,取出的时候保证序号是队列中最小的。 3.满足最小的尽量在前面(不保证是字典序):priority_queue<int> Q;反向建图,用优先队列存储将入度为0的点,再遍

2015-05-02 23:30:40 1286

原创 动态规划总结【模板】

最长递增子序列最大连续子序列和最大连续子矩阵和最大M个连续子段的和最大不连续子序列和最长公共子序列最长回文子序列最长回文子串最小编辑距离01背包完全背包多重背包二维费用背包切割钢条最大矩形问题

2015-05-01 23:49:13 4511 2

Flask Web开发

本书共分三部分,全面介绍如何基于 Python 微框架 Flask 进行 Web 开发。 第一部分: Flask 简介,介绍使用 Flask 框架及扩展开发 Web 程序的必备基础知识 ; 第二部分:给出一个实例,真正带领大家一步步开发完整的博客和社交应用 Flasky, 从而将前述知识融会贯,付诸实践。 第三部分:介绍了发布应用之前必须考虑的事项,如单元测试策略、性能分析技术、Flask 程序的部署方 式等。

2018-05-29

2014年北大ACM暑期培训资料、讲义

北京大学的ACM国际大学生程序设计竞赛(ACM/ICPC)水平在国内处于领先地位,自2005年至2013年每年均参加总决赛,名次分别为11(铜牌)、13、14、13、20、14、13,13,13,13。北京大学多次承担ACM/ICPC亚洲区预选赛命题,广获好评。近几年负责命题的赛区有:2008年北京赛区,2009年宁波赛区,2010年杭州赛区,2010年福州赛区,2011年北京赛区,2011年福州赛区,2012年金华赛区,2012年杭州赛区。2013年杭州赛区。均由此课程主讲教师郭炜负责命题。北京大学的Online Judge --- POJ 更是国内最有影响力的ACM/ICPC竞赛训练平台之一,在国际上也有较高知名度和较多用户。

2014-08-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除