07 2012 档案

摘要:题意:给定n个单词(均为大写字母)和一个文本(均为可见字符),求每个单词在文本中出现的次数。单词数不超过1000,长度不超过50,文本长度不超过2000000分析:AC自动机基础题。一个小的优化:由于单词均为大写字母,所以建字典树时第二维大小可以只开26,这样可以节约时间和空间,在扫描文本时(均为可见字符),碰到非大写字母时,直接将指针指向根结点,继续扫描下一个字符即可。View Code #include <stdio.h>#include <string.h>#include <queue>using namespace std;#define LEN 阅读全文
posted @ 2012-07-31 21:43 BeatLJ 阅读(203) 评论(0) 推荐(0)
摘要:题意:给n个单词和一个文本,求有多少个单词出现在文本中。据说这题是AC自动机的模版题。这题也是我写的第一个AC自动机的题。View Code #include <stdio.h>#include <string.h>#include <queue>using namespace std;#define LEN 55#define N 10010int n,node;int next[N*LEN][26];int cnt[N*LEN];int fail[N*LEN];void init(){ memset(next[0],0,sizeof(next[0])); 阅读全文
posted @ 2012-07-31 17:16 BeatLJ 阅读(211) 评论(0) 推荐(0)
摘要:题意:给定一个n*n的棋盘,棋盘中的'X’代表障碍物,'.'代表空地,问在空地上最多放多少车,使得它们不会互相攻击。分析:由于n比较小,应该可以直接暴力,这里用的二分匹配的方法。建图:先扫描行,连通的格子看成一个结点,这样可以得到二分图的X部,再同样扫描列,得到Y部,有公共方格的结点连边,然后求最大匹配就是结果。正确性分析:扫描行得到的结点之间不可能有公共方格,所以X部的结点内部没有连边,同理Y部的结点内部结点没有连边,所以建立的图是二部图。每个结点内最多只能放一个车,有公共方格的结点最多只能选取其中一个放车,这样就得到一个最大匹配的模型。View Code #incl 阅读全文
posted @ 2012-07-30 20:21 BeatLJ 阅读(628) 评论(0) 推荐(0)
摘要:Description一个每块地板标记着0~9某个数字的迷宫,其中标记1的地板不可以走,标记2~9的地板可以不花时间地跳到任意相同数字的位置,也可以和标记0的地板一样向前后左右任意方向花1个单位时间移动1的距离。给出起点和终点,求起点到终点的最短时间。Input每组数据第一行一个n,表示尺寸,2 <= n <= 100。接下来n行每行n个0~9的字符,或S表示起点,E表示终点,S和E的运动规则与0相同。整个地图只有一个S和一个E。Output每组数据输出一个数,占一行,表示起点到终点可以花费的最短时间。如果无法到达重点,输出"Oh No!"Sample Inpu 阅读全文
posted @ 2012-07-30 17:44 BeatLJ 阅读(213) 评论(0) 推荐(0)
摘要:Description 现在有一个N个整数组成的序列,这N个整数的标号分别为1, 2, ..., N,对这个序列一共进行两类操作: ① 1 x y:表示将第x个和第y个(包括x、y)整数之间的所有整数的二进制的最低位的1变为0,如果某个整数的值为0,则不对这个整数做任何改变。 ② 2 x y :表示你需要回答第x个和第y个(包括x、y)整数之间的所有整数异或的结果。Input 输入包含多组测试数据。 对于每组测试数据,第一行包含两个正整数N(2<=N<=10^4)、M(1<=M<=10^5),表示这个序列一共有N个整 数,你需要处理M次操作。接下来一行一共有N个不超过2 阅读全文
posted @ 2012-07-30 17:40 BeatLJ 阅读(225) 评论(0) 推荐(0)
摘要:Description 在另一个平行宇宙中,有一个神奇的国度名叫天朝。天朝一共有N个城市(标号分别为1, 2, …, N),M条道路,为了方便交通管制,天朝的M条道路都是单行道。 不久前天朝大选,小Q当选了天朝的总统。小Q家住在城市1,但天朝的办公地点在城市N,于是为了便于工作,小Q决定举家从城市1搬迁到城市N去居住。然而小Q惊奇的发现,现在并不存在从城市1出发到城市N路线。 但这点难题是无法阻挡天朝总统的,小Q决定行使总统的权利下令更改一些道路的通行方向,使得至少存在一条从城市1出发到城市N的路线,但为了节省时间和资源,他希望更改通行方向的道路尽可能少,你能帮帮小Q吗?Input 输... 阅读全文
posted @ 2012-07-30 17:33 BeatLJ 阅读(295) 评论(0) 推荐(0)
摘要:Description有很多个棱长为1的正方体货物整齐地堆在一堆。不过有一些是悬空的, 大概是粘上去的吧。。。给出这些货物的相邻关系,求最小的长方体(或正方体)能装下这些货物的集装箱的体积,(集装箱棱长方向与这些正方体三个棱方向平行)。Input每组数据第一行一个n,表示有n个货物。1 <= n <= 1000接下来n行每行6个数,第i行表示以棱方向为轴的x轴正负、y轴正负、z轴正负方向与第i个货物相邻的货物编号(i为1~n),0表示无该位置信息。Output如果描述出现矛盾或者无法确定货物是堆在一起的,输出"What?",否则输出集装箱体积。Sample In 阅读全文
posted @ 2012-07-30 17:29 BeatLJ 阅读(263) 评论(0) 推荐(0)
摘要:DescriptionHarmony is indispensible in our daily life and no one can live without it----may be Facer is the only exception. One day it is rumored that repeat painting will create harmony and then hundreds of people started their endless drawing. Their paintings were based on a small template and a s 阅读全文
posted @ 2012-07-30 17:25 BeatLJ 阅读(391) 评论(0) 推荐(0)
摘要:题目大意:给一个字典和一些单词,根据字典翻译这些单词,若字典中没有就输出"eh"。View Code #include <stdio.h>#include <map>#include <string>using namespace std;#define N 11map<string,string>dic;int main(){ char a[N],b[N]; char c; scanf("%s%c",a,&c); while(c==' ') { scanf("%s&quo 阅读全文
posted @ 2012-07-30 17:17 BeatLJ 阅读(181) 评论(0) 推荐(0)
摘要:跟上一题差不多,就是输入的处理比较麻烦。View Code #include <stdio.h>#include <string.h>#include <queue>using namespace std;#define MIN(a,b) ((a)<(b)?(a):(b))#define N 105int n,ns,nt,m;int g[N][N];int pre[N];void EK(int s,int t){ int u,v,maxflow=0; while(1) { queue<int>q; memset(pre,-1,sizeof( 阅读全文
posted @ 2012-07-27 17:35 BeatLJ 阅读(198) 评论(0) 推荐(0)
摘要:比较简单的网络流。需要注意的地方:1、数据中有重边;2、输入均为单向边。View Code #include <stdio.h>#include <string.h>#include <queue>using namespace std;#define MIN(a,b) ((a)<(b)?(a):(b))#define N 201#define INF 0x3ffffffint n,m;int g[N][N];int pre[N];void EK(int s,int t){ int maxflow=0; int u,v; while(true) { q 阅读全文
posted @ 2012-07-27 17:34 BeatLJ 阅读(226) 评论(0) 推荐(0)
摘要:Description现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在 阅读全文
posted @ 2012-07-27 17:32 BeatLJ 阅读(258) 评论(0) 推荐(0)
摘要:题目大意:给定一个无向连通图,求至少需添加几条边,使得原图双连通(不存在桥)。分析:用tarjan算法找桥,将所有不是桥的边的端点用并查集合并,这题以前写过,至于为什么可以用并查集来合并,可以参考以前那篇博客。需要注意的是,数据中有重边,在判桥时要注意。可以用一个矩阵存储边的数目,若某边数目大于1,则一定不是桥。View Code #include <stdio.h>#include <string.h>#define MIN(a,b) ((a)<(b)?(a):(b))#define N 1001#define M 2002int n,m,e;int g[N][ 阅读全文
posted @ 2012-07-26 22:48 BeatLJ 阅读(199) 评论(0) 推荐(0)
摘要:题意:求一个有向图中所有满足以下性质的结点:从自身出发可达的点均能回到自身。分析:求的就是缩点后出度为0的强连通分量内的点。这题以前写过,当时用邻接表来存储的。今天又试了下矩阵存储,速度慢了一半……用矩阵存储时,要用char或bool,否则会超内存。View Code #include <stdio.h>#include <string.h>#define N 5001int n,m;char g[N][N],vis[N];int dfn[N],id[N],cnt;int dout[N];void dfs(int u){ vis[u]=1; for(int v=1;v& 阅读全文
posted @ 2012-07-26 21:10 BeatLJ 阅读(194) 评论(0) 推荐(0)
摘要:题目大意:有n个牛,已知这些牛之间的崇拜关系,崇拜关系是可以传递的,例如:a崇拜b,b崇拜c,那么a崇拜c。问有多少牛被其他所有牛崇拜?分析:根据崇拜关系建立有向图,已知同属于一个强连通分量的牛互相崇拜,通过求强连通缩点后,若出度为0的点只有一个,那么这一群牛就被其他所有牛崇拜,否则不存在被其他所有牛崇拜的牛。View Code #include <stdio.h>#include <string.h>#define N 10001#define M 50001int first[N],next[M],v[M];int rfirst[N],rnext[M],rv[M]; 阅读全文
posted @ 2012-07-26 20:17 BeatLJ 阅读(203) 评论(0) 推荐(0)
摘要:题目大意:有n个学生和p门课程,每个学生选修了p门课程中的一些,问能否找到p个课代表,一个人最多只能当一门课的课代表。分析:建立二分图,求最大匹配,判断最大匹配数目是否为pView Code #include <stdio.h>#include <string.h>#define N 301int g[N][N];int x[N],y[N],vis[N];int p,n;int path(int u){ int v; for(v=1;v<=p;v++) if(!vis[v]&&g[u][v]) { vis[v]=1; if(y[v]==-1 |.. 阅读全文
posted @ 2012-07-26 17:25 BeatLJ 阅读(150) 评论(0) 推荐(0)
摘要:DescriptionN个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。Input输入有多组样例,大约1000组。每组样例第一行包含两个整数N,M(2<=N<=100),N代表学校的个数,M代表边的个数(M<N*N)接下来M行,每行包含连个整数u,v,代表u可以向v单向发送数据。Output每组样例对应两行,分别是问题一和问题二的解。Sample 阅读全文
posted @ 2012-07-26 17:19 BeatLJ 阅读(190) 评论(0) 推荐(0)
摘要:今天本来是要参加集训队的中期测验的,但是因为要考场外,所以请了一天假,下面就记一下流水账。今天早上6点半就醒来了,平常一般都是7点醒的,可能潜意识里还是有点紧张吧。吃过早饭后,离去驾校的时间(10:30)还早,便看了一个差分约束系统的题,一开始死活TLE,看了discuss后才A的。此时已经9点了,然后在网上随便逛了逛就10点了,搭车到驾校后,看到公告黑板上写的是12点半集合,我hold不住了,还要等2小时,要不要回去呢?纠结了几分钟后我决定呆在驾校。快10点半的时候,我们同车的一个学员来了,他说是10点半还要练车,我当时就庆幸没回去,要不就悲剧了。练车的时候挺顺的,主要是强化一下细节。练完车 阅读全文
posted @ 2012-07-25 23:47 BeatLJ 阅读(248) 评论(2) 推荐(0)
摘要:题意:给定一棵二叉树的先序遍历结点序列和中序遍历结点序列,求其后序遍历结点序列。树的结点不超过26。分析:由于遍历都是递归定义的,所以不难得到以下结论:树的任意子树的遍历结点序列一定是该树的遍历结点序列的一个连续子序列。有了这个结论后,我们的任务就是确定子树遍历结点序列的起点和终点,而这个可以根据preorder和inorder得到。例如,preorder的第一个结点是根,设为root,root这个结点会把inorder分为2部分(可能某部分为空),左边的就是左子树的中序遍历结点序列,右边的就是右子树的中序遍历结点序列,这样也就确定了左子树和右子树的结点数目,根据左右子树结点数目,就可得到左右 阅读全文
posted @ 2012-07-25 21:48 BeatLJ 阅读(845) 评论(0) 推荐(0)
摘要:题目大意:现有n个点,每个结点有一个权值v,给出关于这些点的m条信息,每条信息(i j k)指出v[i]-v[j]>=k,最后求的是在满足以上约束条件的情况下,v[1]-v[n]的最大值是多少?(N and M not exceeding 30 000 and 150 000 respectively)分析:可以根据题意直接建立差分约束系统,然后以1为源点用spfa求最短路。问题:用队列TLE了,看了discuss后改为stack就A了View Code #include <stdio.h>#include <string.h>#include <stack 阅读全文
posted @ 2012-07-25 20:57 BeatLJ 阅读(229) 评论(0) 推荐(0)
摘要:题目大意:给一个字符文本,每行一个字符串,统计不同的字符串出现的百分比。最后按ASCII排序输出不同字符串和出现的百分比。分析:对输入字符串建立字典树,在叶子结点记录该字符串出现的次数。这样的话,最后就可以查找每个字符串出现的次数。另外用一个数组记录不同的字符串,然后对其排序,输出结果。建字典树时要注意,题中没说出现的字符的范围,那就是所有字符都可能出现。数组应开成next[NODE][130].不知道为什么,用C++提交就AC,用G++提交就WA……,确实不太明白这二者有什么区别。View Code #include <stdio.h>#include <stdlib.h& 阅读全文
posted @ 2012-07-25 20:45 BeatLJ 阅读(824) 评论(0) 推荐(0)
摘要:题目大意:已知关于在一条直线上的n个点的m条信息,信息分为两类,1、准确信息:P A B X 表示A在B的北方X光年;2、模糊信息:V A B 表示A在B的北方1光年以北。问所给信息是否自相矛盾?比较裸的差分约束系统。将等式转为2个不等式即可建立差分约束系统,另需添加一个源点。使用memset时尽量计算需要清空的大小,否则容易被多组小数据卡到TLE。View Code #include <stdio.h>#include <string.h>#include <queue>using namespace std;#define N 1010#define M 阅读全文
posted @ 2012-07-24 23:27 BeatLJ 阅读(228) 评论(0) 推荐(0)
摘要:题目描述有点复杂,前面讲了一大堆废话。题目大意:对一个含n个整数的序列进行一些约束:1、整数序列中连续的一段的和大于某个整数;2、整数序列中连续的一段的和小于某个整数。问满足以上约束的整数序列是否存在。分析:首先利用前缀和进行转换,然后将>化为>=,将<化为<=,然后就基本是裸的差分约束系统了。需要注意的是,建立的约束图可能并不是无向连通的,所以需要另外加一个结点作为源点,由于加了一个点,所以判断是否有负环时要注意,条件是某个点进队次数大于n+1View Code #include <stdio.h>#include <string.h>#inc 阅读全文
posted @ 2012-07-24 17:34 BeatLJ 阅读(207) 评论(0) 推荐(0)
摘要:此题是 POJ 1716的加强版。题意:给定n个整数区间,求一整数集合,使得任意区间中至少有ci个数在集合中,求集合中最少包含的元素个数。建立差分约束系统:d[bi+1]-d[ai]>=ci ,0<=d[i+1]-d[i]<=1,d[k]为在区间[0,k-1]中选取的元素个数。View Code #include <stdio.h>#include <string.h>#include <queue>using namespace std;#define N 50010#define M 200010#define MIN(a,b) ((a 阅读全文
posted @ 2012-07-24 17:24 BeatLJ 阅读(213) 评论(0) 推荐(0)
摘要:DescriptionAn integer interval [a,b], a < b, is a set of all consecutive integers beginning with a and ending with b. Write a program that: finds the minimal number of elements in a set containing at least two different integers from each interval.InputThe first line of the input contains the num 阅读全文
posted @ 2012-07-24 17:18 BeatLJ 阅读(180) 评论(0) 推荐(0)
摘要:Description靠各种货币之间的的汇率差不断买入,使自己的财富大于现有财 富的行为叫做套汇。当然,能不能成功,那可不一定。现在,某城市有M家银行,该城市一共流通N种货币,所以这M家银行一共提供N种货币的兑换业务。但是每 家银行只提供两种货币间的兑换业务,且这M家银行之间,没有任何两家银行会提供相同的货币种类间的兑换业务。每次到各个银行兑换的时候,都需要一定的手续 费。比方说,我现在有100美金,我打算将他换成人民币,而他们之间的比例是1:6,手续费按用来兑换的币种收取,比方说是0.5美金,那么,最后我得到的人民币有(100-0.5)*6=597元。现在,某人拥有币种为S的钱,他想套汇,当 阅读全文
posted @ 2012-07-24 17:09 BeatLJ 阅读(180) 评论(0) 推荐(0)
摘要:Description 上次去超市扫荡回来的东西用完了,Staginner又得跑超市一趟,出发前他列了一张购物清单,打算去买K种不同的商品,每种买一件。到了超市,Staginner发现每种商品有N个品牌,每个品牌此商品的价格为Vi,对Staginner的作用值为Wi,他会从这N个品牌里面挑一个品牌买。这时,Staginner突然想起出门时只带了M元钱,又懒得去取钱了,所以不一定能买完K种商品,只好尽可能地让买的东西对自己的总作用值ans最大。Input多组样例。 第一行两个整数K,M代表Staginner想买的不同种类商品的数目和他带的钱 (0 < K <= 30, 0 < 阅读全文
posted @ 2012-07-23 23:41 BeatLJ 阅读(331) 评论(0) 推荐(0)
摘要:Calf FlacIt is said that if you give an infinite number of cows an infinite number of heavy-duty laptops (with very large keys), that they will ultimately produce all the world's great palindromes. Your job will be to detect these bovine beauties.Ignore punctuation, whitespace, numbers, and case 阅读全文
posted @ 2012-07-23 21:55 BeatLJ 阅读(232) 评论(0) 推荐(0)
摘要:DescriptionFarmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He needs your help, of course.Farmer John ordered a high speed connection for his farm and is going to share his connectivity with the other farmers. T 阅读全文
posted @ 2012-07-23 17:18 BeatLJ 阅读(354) 评论(0) 推荐(0)
摘要:题意:求n个非负数中任意2个的异或值的最大值。n数量级为10^5分析:直接暴力肯定超时了。一个非负整数可以看成1个32位的01字符串,n个数可以看成n个字符串,因此可以建立字典树,建好树后,对于任意非负整数x,可以沿着树根往下贪心找到y,使得x异或y最大,复杂度为树的深度。View Code #include <stdio.h>#include <string.h>#define MAX(a,b) ((a)>(b)?(a):(b))#define NODE 3200010#define N 100010int n;int v[N];int node;int nex 阅读全文
posted @ 2012-07-22 23:39 BeatLJ 阅读(3447) 评论(0) 推荐(0)
摘要:题目大意:找出1到300的数中其平方在b进制下是回文的数,并打印这些数数及其平方在b进制下的表示。View Code /*ID: lijian42LANG: C++TASK: palsquare*/#include <stdio.h>#define LEN 20#define N 300char t[20]={'0','1','2','3','4','5','6','7','8','9','A','B 阅读全文
posted @ 2012-07-22 21:22 BeatLJ 阅读(179) 评论(0) 推荐(0)
摘要:题目大意:2到9每个数字对应3字母(对应关系题中已给出),给定一个长度不超过12的数字序列,则可以对应到多个字符串,现给定一个字典(含很多字符串的文件),打印数字序列对应的且在字典中出现过的字符串。分析:每个数字对应3个字母,最坏情况下有12个数字,可对应312=531441个字符串,而且题中字典中的字符串是按字典序给出的,所以可以用二分查找,所以应该可以用暴力+二分过。另一个办法就是建字典树,然后dfs时边搜遍判断,这样效率应该有所提升。我是用字典树过的。需要注意的是当字典中不存在符合要求的字符串时,要输出“NONE”View Code /*ID: lijian42LANG: C++TASK 阅读全文
posted @ 2012-07-22 20:49 BeatLJ 阅读(310) 评论(1) 推荐(0)
摘要:DescriptionIn this problem, you are given a pair of integers A and B. You can transform any integer number A to B by adding x to A.This x is an integer number which is a prime below A.Now,your task is to find the minimum number of transformation required to transform S to another integer number T.In 阅读全文
posted @ 2012-07-22 19:31 BeatLJ 阅读(355) 评论(0) 推荐(0)
摘要:数学模型:在数轴上画n条线段,求最长的连续线段的长度和最长的空白的长度(线段间的空白)。分析:读数据时只读入有效线段,被其他线段完全覆盖的略去,然后根据线段的起点排序,此时相邻线段要么中间有空白,要么相交,若相交则合并为一条线段,经过处理后得到cnt条互不相交的线段,此时统计结果即可。View Code /*ID: lijian42LANG: C++TASK: milk2*/#include <stdio.h>#include <stdlib.h>#define MAX(a,b) ((a)>(b)?(a):(b))#define N 5001int n;struc 阅读全文
posted @ 2012-07-20 23:32 BeatLJ 阅读(247) 评论(0) 推荐(0)
摘要:题目大意:统计从1900年1月1号开始的n年时间内,每个月的13号落在星期一、星期二、星期三……星期日的次数。分析:从今年某个月的13号到明年那个月的13号经过的时间恰好是一年,经过的天数可能是365或366,从今年的1月13到明年的1月13经过的天数是由今年的二月份的天数决定的,也就是由今年是否是闰年决定的,2月也是一样,但从今年的3月13到明年的3月13经过的天数是由明年的二月份的天数决定的,也即由明年是否是闰年决定,4、5、6、……12月也一样。365%7=1366%7=2知道了以上2个算式,便可以从今年每月13的星期数推得明年的每月13的星期数,以后n年的都可以推出。递推的初始边界为1 阅读全文
posted @ 2012-07-20 22:40 BeatLJ 阅读(249) 评论(0) 推荐(0)
摘要:此题是经典树形DP题,没有上司的晚会。公司所有人员之间的关系可以用一个树来表示,任何一个人(除了最大的boss外)都有且只有一个直接上司,现要开一个Party,邀请尽量多的人参加,要求任何人不得与直接上司同时参加。抽象后的数学模型:在一棵树中,最多能选取多少结点,使得任何结点之间没有直接连边。状态设计:d[i][0]表示在以i为根结点的子树中,在不选结点i的情况下最多能选取的结点数目,d[i][1]表示在以i为根结点的子树中,在选取结点i的情况下最多能选取的结点数目。状态转移:d[i][0]=(max(d[j][0],d[j][1])),j为i的儿子结点,d[i][1]=∑(d[j][0]), 阅读全文
posted @ 2012-07-20 17:04 BeatLJ 阅读(273) 评论(0) 推荐(0)
摘要:Description有N个点,有一个商人想经过所有的点恰好一次(商人最终不一定要回到起点),求商人需要走最短路程。Input两个整数N,M表示图的点数和边数,接下去有M行,每行三个整数a ,b ,c 表示从a到b有一条无向边,长度是cN<=15 c<=10000Output输出商人需要走过的最短距离 ,如果不能到达所有的点,输出-1 。Sample Input4 6 1 2 1 1 4 2 4 3 4 2 3 3 2 4 6 1 3 5Sample Output6将已走过的点和未走过的点用二进制编码成整数,然后再DP.例如:共4个点,1和2已走过,3和4未走,此时状态编码为二进制 阅读全文
posted @ 2012-07-20 16:40 BeatLJ 阅读(191) 评论(0) 推荐(0)
摘要:Description听说附近的超市有N种商品打折促销,每种商品的单价为 Ci,实际价值为Wi。你和你的朋友们决定去超市购物,当然你们要买的东西已经包括在这N种商品中。一行A个人就往超市走了,到了超市被促销员告知每种商 品每人限购一件,让大家都有些许遗憾。你们每个人身上都带了一定数额的钱M,每个人都想用自己的钱买到总价值最大的一些商品。现在,你想知道所有人买的商 品总的实际价值是多少?Input多组测试数据直到文件末尾。第一行输入A和N(0 < A <= 50, 0 < N <= 1000)代表人数和商品种数。第二行输入A个数,表示每个人身上带的钱Mi(0 < M 阅读全文
posted @ 2012-07-19 12:57 BeatLJ 阅读(215) 评论(0) 推荐(0)
摘要:Description给出N个长度不超过5000的只含数字的字符串,你需要回答M次形如i j的询问,对于每次询问用一行输出一个整数表示第i个字符串和第j个字符的最长公共前缀的长度。比如两个字符串分别为201212和201112,"2"、"20"和"201"都是它们的公共前缀,但最长的公共前缀是"201",于是就应当输出3。Input输入包含多组测试数据。每组数据的第一行为一个整数N(1<=N<=1000),表示一共有N个字符串。接下来一共有N行,每行均有一个长度不超过 5000的只含数字的字符串,这N行 阅读全文
posted @ 2012-07-18 17:13 BeatLJ 阅读(232) 评论(0) 推荐(0)
摘要:Description有三个无刻度标志的水杯,分别可装 a ,b , c升水,并且a>b , a>c , a,b,c,均为正整数。任意两个水杯之间可以相互倒水。用杯子x给y倒水的时必须一直持续到把杯子y倒满或者把杯子x倒空,而不能中途停止。倒水过程中水量不变。最初的时候只有大杯子装满水,其他两个杯子为空。问能不能量出x升水,如果可以,最少需要多少步?Input输入有多组数据。每组数据为一行,有4个正整数a,b,c,x且满足:a>b,a>c,a>x,a,b,c,x <= 1000。Output输出一个整数。如果可以量出x升水,输出需要的最少步骤,否则,输出-1 阅读全文
posted @ 2012-07-18 17:03 BeatLJ 阅读(187) 评论(0) 推荐(0)
摘要:这题是ZOJ 1008那题。给你n*n个方块,每个方块被对角线划分为4部分,每一部分里面有一个数字,问能否将方块拼成一个边长为n的大方块,使得相邻方块的相邻数字相同。用dfs搜索,需要剪枝,同一层中相同方块只搜索一次。View Code #include <stdio.h>#include <string.h>#define N 26#define T 0#define R 1#define B 2#define L 3int x[N][4],top;int n,id[N],num[N];bool success;int Left(int k){ if(k%n==0) 阅读全文
posted @ 2012-07-18 17:00 BeatLJ 阅读(181) 评论(0) 推荐(0)
摘要:DescriptionYou are in the world of mathematics to solve the great "Monkey Banana Problem". It states that, a monkey enters into a diamond shaped two dimensional array and can jump in any of the adjacent cellsdown from its current position (see figure). While moving from one cell to another 阅读全文
posted @ 2012-07-18 16:54 BeatLJ 阅读(161) 评论(0) 推荐(0)
摘要:经典的线段树的题,线段染色问题。跟“Mayor's Posters”那题差不多,只不过这题有多次查询。需要注意的是给的区间[a,b],a可能会大于b。View Code #include <stdio.h>#include <string.h>#define N 100001int n,m,k,ans;int vis[31];int color[4*N];void pushdown(int cur,int x,int y){ int ls=cur<<1,rs=cur<<1|1; if(color[cur]) { color[ls]=col 阅读全文
posted @ 2012-07-13 10:21 BeatLJ 阅读(208) 评论(0) 推荐(0)
摘要:数学模型:给定一个整数序列(最多10000000个数),初始化为0,一共有n(最大10000)个操作,其中第i个操作是将某个指定区间内的数赋值为i,求在经过n次操作后,序列中有多少个不同的非0数该题可用线段数来做,保存的关键信息为这段的值,最后的查询只有一次。需要注意的是最多有10000000个数,但n不大,所以可以用离散化处理进行优化。View Code #include <stdio.h>#include <string.h>#include <stdlib.h>#define N 10001#define INF 0x7fffffffint a[N], 阅读全文
posted @ 2012-07-12 16:29 BeatLJ 阅读(226) 评论(0) 推荐(0)
摘要:维持一个整数序列,支持2种操作:1、增加一个整数到序列中;2、求序列的第K大的数。思路:建两个堆,一个小堆来保存前K大的数,一个大堆来保存剩余的数,这样的话,就满足小堆中最小的数也会大于等于大堆中最大的数,在插入的过程中,我们仍需维持这种性质,先将插入的数进入大堆,然后比较2个堆顶的数,若不满足上述性质则交换,直到满足为止。建大堆:priority_queue<int> qmax;建小堆:priority_queue<int ,vector<int>,greater<int> >qmin.View Code #include <stdio. 阅读全文
posted @ 2012-07-12 14:51 BeatLJ 阅读(180) 评论(0) 推荐(0)
摘要:数学模型:维持一个01序列,支持2种操作:1、将给定区间内的数取反;2、查询给定区间内1的个数。这题就是“暑假集训每日一题0712”的简化版View Code #include <stdio.h>#define N 100001int n,m,ans;int sum[4*N],rev[4*N];void update(int cur){ int ls=cur<<1,rs=cur<<1|1; sum[cur]=sum[ls]+sum[rs];}void pushdown(int cur,int x,int y){ int mid=(x+y)>>1, 阅读全文
posted @ 2012-07-12 14:12 BeatLJ 阅读(305) 评论(0) 推荐(0)
摘要:维持一个整数序列,支持2种操作:Q a b:查询区间[a,b]内的和;C a b x:将区间[a,b]内的每个数加上x。对于每次查询输出结果。结果可能会超32位。View Code #include <stdio.h>#define N 100001int n,m,a[N];long long ans;long long sum[4*N],inc[4*N];void update(int cur){ int ls=cur<<1,rs=cur<<1|1; sum[cur]=sum[ls]+sum[rs];}void pushdown(int cur,int x 阅读全文
posted @ 2012-07-12 13:15 BeatLJ 阅读(250) 评论(0) 推荐(0)
摘要:维护一个只有0和1的整数序列,支持以下操作:1 x y v : 将区间[x,y]之间的所有整数都变为v(v为0或1);2 x y : 将区间[x,y]之间所有的1变为0,所有的0变为1;3 x y : 查询区间[x,y]内的1的个数。线段数练习:每段保存3个关键信息:和,修改标记,反转标记。需注意的几点:在更新某段时,之前的反转操作将无效,应将其清零,在下传修改标记时,应将左右儿子的反转标记清零。View Code #include <stdio.h>#define N 100001int n,m,ans;int a[N],sum[4*N],val[4*N],rev[4*N];vo 阅读全文
posted @ 2012-07-12 11:41 BeatLJ 阅读(226) 评论(0) 推荐(0)
摘要:维护一个整数序列,支持2中操作:1、修改某个指定数的值;2、查询指定区间的最大值。View Code #include <stdio.h>#define MAX(a,b) ((a)>(b)?(a):(b))#define N 200001int n,m,D;int max[4*N];void init(){ int i; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) max[i]=0; for(i=1;i<=n;i++) scanf("%d",&max[i+D]); for(i=D- 阅读全文
posted @ 2012-07-11 16:56 BeatLJ 阅读(187) 评论(0) 推荐(0)
摘要:维护一个整数序列,支持3种操作:1、将指定的数加上一个值;2、将指定的数减去一个值;3、查询指定区间的和。View Code #include <stdio.h>#define N 50001int t,n,D;int sum[4*N];void init(){ int i; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) sum[i]=0; for(i=1;i<=n;i++) scanf("%d",&sum[i+D]); for(i=D-1;i^1;i--) sum[i]=sum[i< 阅读全文
posted @ 2012-07-11 16:43 BeatLJ 阅读(238) 评论(0) 推荐(0)
摘要:这题可以看成是“集训每日一题0711”的简化版,没有修改操作,只需查询最小和最大的。View Code #include <stdio.h>#define MIN(a,b) ((a)<(b)?(a):(b))#define MAX(a,b) ((a)>(b)?(a):(b))#define INF 0x7fffffff#define N 50001int n,m,D;int min[4*N],max[4*N];void init(){ int i,t; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) { min[ 阅读全文
posted @ 2012-07-11 15:33 BeatLJ 阅读(191) 评论(0) 推荐(0)
摘要:维护一个整数序列,支持以下操作:1 x v : 将第x个整数的值修改为v;2 x y : 查询区间[x,y]之间的最小值;3 x y : 查询区间[x,y]之间的最大值;4 x y : 查询区间[x,y]内的整数和。数据保证查询结果均在int范围之内,但中间结果是否可能溢出呢?我交的程序没考虑这个也AC了。通过这题还发现一个奇怪的现象,用memset初始化的程序跑了2s多,而用for循环初始化的程序才跑468ms……for循环初始化(468ms)#include <stdio.h>#include <string.h>#define MIN(a,b) ((a)<( 阅读全文
posted @ 2012-07-11 13:32 BeatLJ 阅读(209) 评论(0) 推荐(0)
摘要:维护一个整数序列,支持2种操作:1、修改:将给定区间中的每个数增加一个值;2、查询:查询给定区间中所有数的和。View Code #include <stdio.h>#define N 100010#define Node 800000int n,m,x[N];long long sum[N];int left[Node],right[Node];long long incsum[Node],inc[Node];void create(int i,int l,int r){ left[i]=l; right[i]=r; inc[i]=0; incsum[i]=0; ... 阅读全文
posted @ 2012-07-11 11:21 BeatLJ 阅读(236) 评论(0) 推荐(0)
摘要:Description给出的表达式全为合法的四则运算表达式,含括号。Input每行一个表达式,数字全为int型整数,长度不超过100字符Output输出表达式的值,一律保留小数点后4位。Sample Input11+2-1+2-1+(-2) Sample Output1.00003.00001.0000-3.0000 代码写得很混乱……对于括号的处理,我用的是递归调用,对于运算符的优先级的处理,我是通过2遍扫描来完成的,第一遍计算乘除运算,第二遍计算加减运算。View Code #include <stdio.h>#include <string.h>#define N 阅读全文
posted @ 2012-07-10 14:58 BeatLJ 阅读(347) 评论(0) 推荐(0)
摘要:DescriptionDr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N*N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线。走迷宫的取胜规则很有意思,看谁能更快地找到一条路径,其路径上单元格最大难度值与最小难度值之差是最小的。当然了,或许这样的路径不是最短路径。机器人卡多现在在迷宫的左上角(第一行,第一列)而出口在迷宫的右下角(第N行,第N列)。卡多很聪明,很快就找到了 阅读全文
posted @ 2012-07-10 12:41 BeatLJ 阅读(681) 评论(0) 推荐(0)
摘要:Description设S是一个合法的表达式,E为一个数字字符序列,则合法的表达式可以表示为:E, +E, -E, (S),+(S),-(S),S+(S),S-(S),S*(S),S/(S) 等。(E可以是全‘0’的字符串)。请注意+S, -S, S+S等不一定是合法的表达式,因为可能出现如“+-E”运算符相邻情况,另外出现“()”括号中没有元素的表达式也是不合法的。Input每行一个字符串,最长不超过1023个字符。可能有空行。Output如果表达式合法,输入“Yes”,否则输入“No”,然后换行。如果表达式为空,则输出一个空行。Sample Input-1+2+-1+2+(-1+2)()- 阅读全文
posted @ 2012-07-10 10:38 BeatLJ 阅读(186) 评论(0) 推荐(0)
摘要:这题就是裸的最短路,而且边权都为非负,可以直接用dijkstra来求。写这题主要是为了练习一下dijkstra的优先级队列实现,提交后运行时间为63MS,比一般的dijkstra快一点(97MS)。后来又尝试用SPFA写,结果还是63MS。在写dijkstra的优先级队列实现和SPFA的过程中发现,这两个算法非常类似,不过,SPFA用的是一般的队列。SPFA #include <stdio.h>#include <string.h>#include <queue>using namespace std;#define MIN(a,b) ((a)<(b) 阅读全文
posted @ 2012-07-09 14:59 BeatLJ 阅读(219) 评论(0) 推荐(0)
摘要:求欧拉道路的题,可能是回路,也可能不是回路,若存在奇度点,则应从奇度点开始找路径,为保证最后的路径是字典序最小的,找路径时必须遵循小结点优先的原则。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MAX(a,b) ((a)>(b)?(a):(b)) 4 #define N 501 5 int n,m,g[N][N],d[N],path[N],top; 6 void dfs(int u) 7 { 8 int v; 9 for(v=1;v<=n;v++)10 {11 if(g[u... 阅读全文
posted @ 2012-07-09 08:53 BeatLJ 阅读(227) 评论(0) 推荐(0)
摘要:匈牙利算法是用来求二分图匹配的算法,一般有bfs和dfs两种实现,我一般都是写的dfs的实现,感觉这个比较好理解,实现也比较简单。二部图:若一个图的顶点可以划分到2个集合,使得每个集合内的顶点之间没有连边,那么这个图就叫做二分图或二部图。二分匹配问题:求最大边无关集。交替链:二分图的一条路径,路径的起点和终点来自于不同的集合,且均未被标记(未匹配),且路径中的相邻结点来自不同的集合。匈牙利算法:存在交替链<=>存在更优匹配为什么在maxmatch中只需对每个结点一次求一次交替链即可?答:因为每求一次交替链后,可能增加匹配成功的结点,上一次匹配成功的结点不会变(匹配方式可能变了),而 阅读全文
posted @ 2012-07-07 08:33 BeatLJ 阅读(358) 评论(1) 推荐(1)
摘要:该算法也是tarjan发现的,故也叫tarjan算法。这个算法的主体还是dfs,先看算法框架:void make_set(int i){p[i]=i;}int find_set(int i){if(i!=p[i])p[i]=find_set(p[i]);return p[i];}union_set(int i,int j){i=find_set(i),j=find_set(j);p[j]=i;}//tarjan算法主体void dfs(int u){int i,v;make_set(u);for(i=0;i<g[u].size();i++){v=g[u][i];if(p[v]==-1){ 阅读全文
posted @ 2012-07-07 08:32 BeatLJ 阅读(3640) 评论(0) 推荐(1)
摘要:tarjan算法的基本框架就是dfs,其基本原理是有向图至少存在一棵深搜子树,其结点集合构成一个强连通分量,这是显然的,因为必定有一个强连通分量最后被dfs,这个强连通分量的结点构成深搜树的一棵子树。有了以上结论后,求强连通分量就有思路了,我们在每棵子树深搜完成后判断这棵子树是否构成强连通分量即可,关键在于如何判断一棵子树是否构成强连通分量。注意到最先搜索完的子树是那些叶子结点,要判断叶子结点是否构成强连通分量很简单,若存在叶子结点与其祖先结点的连边,则该叶子结点不构成强连通分量,否则构成强连通分量。tarjan算法用pre[V]数组和low[V]数组来判断子树是否构成强连通分量,pre[v] 阅读全文
posted @ 2012-07-07 08:31 BeatLJ 阅读(969) 评论(0) 推荐(0)
摘要:第一遍dfs是对原图进行,求出每个结点的后序遍历顺序,也叫时间戳,注意保存方式,应该是保存每个时间点的访问的结点,而不是保存每个结点的访问时间;第二遍dfs是对逆图进行,根据第一遍dfs的结果,首先在逆图上从时间戳最大的结点开始dfs,可以得到第一个强连通分量,将遍历过的结点标记,然后从下一个时间戳最大的且尚未标记的结点开始dfs,可以得到第二个强连通分量,以此类推,直到所有结点都确定其所在的强连通分量,此时算法结束。首先分析由此算法得到的第一个强连通分量的正确性,易知时间戳最大的是有向图的根结点:1、从根结点出发,可以到达所有结点;2、第二遍dfs是在逆图上进行的,所以第二遍dfs得到的是所 阅读全文
posted @ 2012-07-05 12:15 BeatLJ 阅读(1633) 评论(0) 推荐(0)
摘要:Description在一个8行9列的国际象棋棋盘上,有一名骑士在追杀对方的国王。该骑士每秒跨越一个2*3的区域,如下图所示。而对方的国王慌忙落逃,他先沿着右下斜线方向一直跑,遇到边界以后会沿着光线反射方向继续跑(遇到死角则原路返回),他每秒只跑一格。给出骑士和国王的初始位置,求最快在多少秒的时候骑士能追杀掉对方的国王。骑士和国王每一秒都必须要有行动,而不能原地等待。Input有多组测试数据。对于每组测试数据,输入只有一行:nx,ny,kx,ky,前2个表示骑士的初始坐标,后2个表示国王的初始坐标,以左上角的格子为(0,0),向右为x轴正方向,向下为y轴正方向。(0<=nx,kx< 阅读全文
posted @ 2012-07-03 18:41 BeatLJ 阅读(220) 评论(1) 推荐(0)
摘要:求一棵树中2个点的最近公共祖先。我的做法:用并查集求出每个结点的深度,然后递归求最近公共祖先。View Code 1 #include <stdio.h> 2 #define N 10001 3 int fa[N],p[N],d[N],n; 4 void make_set() 5 { 6 for(int i=1;i<=n;i++) 7 { 8 p[i]=i; 9 d[i]=0;10 }11 }12 int find_set(int i)13 {14 int pi=p[i];15 if(pi!=i) p[i]=find_set(p[i]);16 if(p... 阅读全文
posted @ 2012-07-03 18:29 BeatLJ 阅读(239) 评论(0) 推荐(0)
摘要:Description中南大学ACM的暑期集训马上就要开始了,这次集训会将全体N名集训队员(编号分别为1, 2, …, N)按集训选拔赛的排名分成两组,前K名队员分入A组,其余队员分入B组。但现在助理教练CSGrandeur一不小心把集训选拔赛的排名弄丢了,而之前又没将A组和B组的人员确定出来,于是CSGrandeur打算问一下集训人员他们的名次各是怎样的,以此来确定一下A组的队员。然而集训队员们都视名次如粪土,只是隐约记得某些人排在了自己的后面,最终反馈到CSGrandeur这里的一共有M条信息,每条信息都可以用一个二元组(x, y) (x!=y)表示,含义为第x名队员记得第y名队员的排名比 阅读全文
posted @ 2012-07-02 19:40 BeatLJ 阅读(312) 评论(0) 推荐(0)

点击右上角即可分享
微信分享提示