ACM之路
文章平均质量分 82
朽弈
这个作者很懒,什么都没留下…
展开
-
hdu 4965 Fast Matrix Calculation【矩阵快速幂】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4965题目大意:给出一个N*K和一个K*N的矩阵A,B(4step 1 :令C=A*B;step 2 :令D=C^(N*N);step 3 :D中所有元素模6step 4 :求出D中所有元素之和首先当然想到的只能是顺着做下来,但是想想,step 2中,我们求一个N*N的矩原创 2014-08-19 23:08:54 · 469 阅读 · 0 评论 -
Codefroces 223A - Bracket Sequence【栈优化】
题目大意:有一串只含有 "(" ")" "[" "]" 的序列,问在该序列的 左右括号能分别配对的 所有子串中的含有方括号的个数的最大值,并输出相对应的子串。做法:利用一个栈来维护,每次如果有能与栈顶的元素配对的右边括号时,将该元素弹出,如果此时弹出的元素代表方括号,那么记录此时出现的下标。否则将该元素压进栈。当然我们压进栈的是当前元素的下标。当处理完整个序列之后原创 2014-08-26 15:46:07 · 617 阅读 · 0 评论 -
Codeforces 132C.Logo Turtle【DP,dfs】
题目大意:在一根数轴上有一只机器龟,它能够听从人们给它的指令做出向前走一步(F)和向后转(T)的操作。给出初始操作,你最开始有修改n步指令的权利(每一个指令可以被修改很多次),问在你修改n次之后,海龟离原点的最大距离。做法:很直观的想法,尽可能的将T转化为F,也算是一种贪心的做法吧。我们用dfs(i,j,t,cur),其中i表示当前遍历的命令的序号,j表示从0~i过原创 2014-08-25 15:18:45 · 878 阅读 · 0 评论 -
hdu 5040 Instrusive【BFS+优先队列】
2014北京网络赛09题,hdu 5040这次网络赛真是惨,也怪做题策略没想好,当时切完签到题之类的水题之后,马上就去看06青蛙那题去了。结果被那只死青蛙给坑惨了T_T。。。搞了四小时没搞出来...跪给那只青蛙了。。。本来当时是准备要做这道题的,题目描述也是好蛋疼,有人说这题不如直接去看Clarification,不看题目了,这也说明这题题目描述确实不清晰,虽然没这么夸张,题目还是得看原创 2014-09-22 16:26:03 · 843 阅读 · 0 评论 -
Codeforces 148E. Porcelain【多重背包】
题目大意:有一个公主一生气就喜欢摔东西。现在有很多个柜子,每个柜子里面装着很多物品,公主每次摔东西只能随机的选择一个柜子,拿出最左边或者最右边的一个物品摔碎,给出公主最多生气的次数,求生完气之后,公主摔掉物品的价值的最大总和。做法:对于每个柜子来说,从左边拿和从右边拿是不一样的,假设最佳方案中,在第i个柜子中需要拿Ki个物品,那么拿着Ki个物品的最大价值我们是可以确定的。一:全原创 2014-08-28 18:45:10 · 875 阅读 · 0 评论 -
Codeforces 371D. Vessels【并查集】
题目大意:给出一堆从上到下叠起来的容器,有两种操作:第一种是在编号为i的容器中加入x的水(保证水溢出之后会流到下一个最近的容器(如果存在)中);第二种是查询编号为i的容器中有多少水。做法:首先,想想暴力?但是如果直接暴力,那肯定超时了。每次的加水操作都必须一步步的推向能够容纳从上面溢出的水的容器,这样来十万次操作,一定是T了。那该怎么办呢?我们面对一个在 i 容器中加水的操作,要是能短原创 2014-08-28 19:06:32 · 807 阅读 · 0 评论 -
Codeforces 156B. Suspects
题目大意:福尔摩斯正在处理一件案子。此时已经抓捕了n个嫌疑人,里面只可能有一个是真正的犯人。福尔摩斯正在审问这些嫌疑人。每个嫌疑人的回答只有两种,一种表明他说编号为i的嫌疑人不是犯人,用-i表示;另一种表明他说编号为i的嫌疑人是犯人,用+i表示。聪明的福尔摩斯已经知道了其中有m个人说的是真话。要求那些人说的是真话,那些人说的是假话。做法:这的确是个很有意思的题啊。但是放在这里的话,我们原创 2014-08-28 18:47:02 · 789 阅读 · 0 评论 -
Codeforces 377B . Preparing for the Contest【优先队列】
题目大意:有m个bug,n个学生,每个bug有自己的复杂值,每个学生有自己的能力值,只能解决复杂值小于自己能力值的bug,且每天只能解决一个bug,但是每个学生处理bug需要报酬,问在报酬不超过s的情况下,在最短的时间内,能将bug全部解决完。做法:首先明确一点,如果能够解决所有bug,那么解决的天数一定在1~m之间。先判断m天能不能解决,如果不能则输出NO,如果可以再进行下面的操作。原创 2014-08-29 02:26:44 · 993 阅读 · 0 评论 -
Codeforces 380C. Sereja and Brackets【线段树】
题目大意:给出一串括号,有m个查询(包含a,b)问区间[a,b]之间有多少个匹配的括号做法:处理两个数组r[i](代表从1到i之间有多少个已匹配的右括号),l[i](代表从1到i之间有多少个没有匹配的左括号)。我们要算[a,b]之间的匹配的括号数,首先用r[b]-r[a-1],但是遮掩更有可能a到b之间的右括号是在[1,a-1]之间被匹配的,那么再减去l[a-1],但是减去的这一部分中原创 2014-08-29 23:36:42 · 920 阅读 · 0 评论 -
Codeforces 354C. Vasya and Beautiful Arrays【DP,暴力】
题目大意:有一组数,你可以对每一个数做减法,减去的数不超过k,问最后你最大能得到的整个数组的GCD是多少做法:最后要求的是GCD(假设为g),那么也就是说,对于数组中的数a[i]来说,减去某个不大于k的值之后,就能被g整除;换句话说,a[i]%g,只要满足该条件即可.首先,由于只能对数进行减法操作,假设m为数组a中的最小值,ma为最大值;那么答案一定不会超过m,也就是说,答原创 2014-08-25 17:01:36 · 1184 阅读 · 1 评论 -
POJ 3691:DNA repair【AC自动机+DP】
题目链接:http://poj.org/problem?id=3691题目大意:给出一些能导致癌症的DNA序列,一个已知序列的DNA片段,问至少得改多少个碱基对才能使这个DNA片段不会致癌。多字符串匹配的话,那首先想到的当然是AC自动机,不过这题中,AC自动机又和别的不一样,因为在这里的trie树中,每个节点只可能有四个儿子节点(A、T、G、C),建立自动机的时候,任一原创 2014-08-11 22:19:37 · 746 阅读 · 0 评论 -
Codeforces 282E. Sausage Maximization【trie树(非指针版)】
题目大意:给出一串数,pre[i](前i个数的异或)为a[0]~a[i-1]的异或,post[i](后缀的异或)为a[i]~a[n-1]的异或,求pre[i]^post[j]的最大值(0做法:利用trie树将后缀或者前缀存储起来,首先从pre[n]开始,往前遍历,对于每个前缀,将此时的后缀添加到trie树中,再在trie中寻找与当前前缀异或之后能得到最大的值。在trie原创 2014-09-08 18:27:59 · 886 阅读 · 0 评论 -
hdu 4970 Killing Monsters 【树状数组(区间修改,点查询)】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4970题目大意:类似于一类塔防游戏。monster只能在一条长为N的直线上移动,有m个塔,每个塔有自己的防守范围以及在范围内每个点的伤害值;有k个monster,每个monster有自己的HP,以及刚开始出现在直线上的位置。问最后有多少monster能活着。此题就是很裸的区间原创 2014-08-19 23:28:24 · 711 阅读 · 0 评论 -
Codeforces 337D Book of Evil 【树,dfs】
题目链接:http://codeforces.com/problemset/problem/337/D题目大意:给出一棵树,在这个树的某个节点存在着魔鬼(有且只有一个),能使所有到该点的距离小于d的说所有点受到影响,现在给出一部分受到影响的点,问可能存在着魔鬼的点有多少个。首先我们需要找出受到影响的点中,两两距离最远的一对点,之后,只需要计算有多少个到这两个点的距离都小原创 2014-08-20 00:59:44 · 1639 阅读 · 0 评论 -
hdu 4961 Boring Sum【构造题】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4961原创 2014-08-19 23:51:13 · 593 阅读 · 0 评论 -
POJ 2828 poj 2828 Buy Tickets 【树状数组,已知前n项和为K,返回n值】
题目链接:http://poj.org/problem?id=2828在一个队列中,一个人想要插队,告诉你每个新来的人会插在i个人后面,求出最后的队列。如果我们用模拟的话,那么时间复杂度肯定是超了;想想,如果我们逆序,那么最后来的人的位置一定是固定的,这样的话,我们将问题转化成逆序扫描给出数据,插在i个人后面这个数据就变成了在这个人前面需要留出多少个空位。如此我们只需要用树状数组记录前n项原创 2014-08-10 00:58:04 · 972 阅读 · 0 评论 -
Codeforces 379D. New Year Letter【动态规划、暴力枚举】
题目大意:给出如下定义: s(n)=s(n-2)+s(n-1),其中s为字符串,+为串联,比如s1="ab",s2="cd",s1+s2="abcd",s2+s1="cdab"。给出k,x,n,m,求满足使字符串s(k)中子串“AC”的个数恰好等于x的s1,s2字符串,如果有多种可能,随意输出。做法:我们将“AC”其分成两个部分,一种是在s1,s2内部的“AC”,一种是在s原创 2014-08-23 22:25:06 · 739 阅读 · 0 评论 -
hdu 5024 Wang Xifeng's Little Plot【暴力dfs,剪枝】
2014年广州网络赛的C题,也是水题。要你在一个地图中找出一条最长的路,这条路要保证最多只能有一个拐角,且只能为90度我们直接用深搜,枚举每个起点,每个方向进行dfs,再加上剪枝。但是如果直接写的话,那一定会特别麻烦,再加上方向这一属性也是我们需要考虑的方面,我们将从别的地方到当前点的方向编一个号:往右为0,如下图顺时针顺序编号(往右下方向为1,往下为2......以此原创 2014-09-20 20:07:28 · 925 阅读 · 2 评论 -
Codeforces 258B. Little Elephant and Elections【数位DP,DFS】
B. Little Elephant and Electionstime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputThere have recently been e原创 2014-08-23 16:00:25 · 1011 阅读 · 0 评论 -
Codeforces 372B. Counting Rectangles is Fun【动态规划,暴力枚举】(lowbit()小用法)
题目大意:给出一个由0,1构成的矩阵,询问(a,b)到(c,d)两个点之间的只含有0的矩形有多少个。方法:由于矩阵不大,最多40*40,而且询问量很大(10^5)由此我们考虑o(1)输出答案,首先用一个四维数组预处理出答案,最后直接输出即可。令dp[a][b][c][d]为(a,b)到(c,d)两个点之间的只含有0的矩形的数量,则递推的公式: dp[a][b原创 2014-08-24 14:22:32 · 1337 阅读 · 0 评论 -
Codeforces 383C . Propagating tree【树状数组,dfs】
题目大意:有一棵树,对这个树有两种操作:1:表示为(1 x val),在编号为x的节点上加上val,然后给x节点的每个儿子加上- val,再给每个儿子的儿子加上-(- val),一直加到没有儿子为止。2:表示为(2 x)查询x节点上的值。做法:由于每次修改操作修改的并不是一个值,而是很多值,那我们将该题抽象成区间修改,点查询的问题。那怎么抽象呢?可以明白的是,每次操作虽然有加有减,但是原创 2014-08-31 01:09:28 · 1225 阅读 · 0 评论 -
Codeforces 144D. Missile Silos【dijkstra】
题目大意:给出一个图,一个源点s,问距离这个源点的最短距离恰好为 l 的点有多少个(这个点可以在边上,可以在节点上)。做法:首先用dijkstra算法求出每个节点到s的最短路d[]数组,然后对于每条边w(u,v)来说有下面三种情况是合法的:1:d[u]l2:d[v]l3:d[v]对于上面每种情况,ans++,另外每个d[i]==l 的原创 2014-08-31 14:07:20 · 787 阅读 · 0 评论 -
Codeforces Round #287 (Div. 2) 507E E. Breaking Good
题目链接:http://codeforces.com/contest/507/problem/E题目大意:在一个有n个城市m条边的国家,有一个犯罪团伙。这个犯罪团伙想要抢银行。犯罪团伙基地在城市1,银行在城市n。有个人Walter想要加入这个犯罪团伙,于是为了过的团伙高层的信任,Walter必须担任一项的任务,那就是在基地到银行之间选出一条最短路。这个国家有若干公路在维修,于是你需要将最短原创 2015-01-27 16:16:43 · 999 阅读 · 0 评论 -
Codeforces Round #286 div.2 D 505D. Mr. Kitayuta's Technology【强连通分量,弱联通分量】
题目链接:http://codeforces.com/contest/505/problem/D题目大意:在一个图中,有n个顶点,给出m对数字(u,v)表示顶点u和顶点v必须直接或者间接相连,让你构造一个这样的图,输出最少需要多少条边。分析:毫无疑问,n个顶点的话,我们最多可以用n条边,使得n个顶点构成一个环,满足所有的情况(任意两点都是联通的),但是这并不一定是最少的边。于是原创 2015-01-28 17:01:03 · 1429 阅读 · 0 评论 -
Codeforces Round #286 div.1 D 506D D. Mr. Kitayuta's Colorful Graph【并查集】
题目链接:http://codeforces.com/problemset/problem/506/D题目大意:给出n个顶点,m条边,每条边上有一个数字,代表某个颜色。不同数字代表不同的颜色。有很多个询问,每个询问问有多少条纯种颜色的路径使得某两个点联通。分析:这个题一看就想用并查集来搞,每种颜色用一个并查集处理。对于输入的每条边,我们只需要将这两个点在这条边的颜色对应的并查集中合原创 2015-01-30 01:40:44 · 2613 阅读 · 0 评论 -
Codeforces 507D (Round #287(div.2))D. The Maths Lecture【数位DP】
题目地址:http://codeforces.com/contest/507/problem/D题意:给出n,k,m,问满足一下条件的数字有多少:1.这个数刚好有n位;2.这个数存在某非空的后缀Si,满足Si%k=0;3.这个数大于0;解法:这个题是个数位DP,我们考虑从数的右边往左边构造的方法。定义这样的DP数组, dp[i][j][0]:表示有i位数位,mod原创 2015-01-25 12:57:19 · 1112 阅读 · 0 评论 -
Codeforces Round #257 div.2 D or 450D Jzzhu and Cities【最短路】
Codeforces Round #257 div.2 D or 450D Jzzhu and Cities【最短路】原创 2015-03-04 01:43:45 · 1344 阅读 · 0 评论 -
【二分图匹配】 最小点覆盖==最大匹配数
先说一下,什么叫做最小覆盖点。 在一个二分图中,一个x部或y部的覆盖点可以覆盖与之相连的所有线段,选择一些点,使得覆盖所有线段,点数最少。 König定理:最小覆盖点数==最大匹配数 我有两个证明。************************************************************************************转载 2015-04-10 17:06:03 · 1082 阅读 · 0 评论 -
数位DP合集
1.HDU 4722 good numbers:题意:给出一个区间【A,B】,求出区间内有多少个数的各位的和加起来模10等于0的数有多少个。解法:这是一个数位DP简单入门题,简单的DFS+数组记忆化搜索就可以。姿势是自己写的。。感觉略搓,做到第三个数位DP题的时候看到了别人的姿势,学习了。代码:#include #include #include #include #inc原创 2015-04-23 21:50:07 · 934 阅读 · 0 评论 -
HDU 5127 Dogs' Candies【CDQ分治+动态凸包】
HDU 5127 Dogs’ Candies【CDQ分治+动态凸包】题意:一个狗国家的狗国王有一个装糖的盒子,每颗糖有两个属性p,q,分别代表甜度和咸度,每只狗对于甜度和咸度的偏爱度不一样,所以每条狗有两个参数x, y,每颗糖对于特定的狗的美味度等于p*x+q*y。现在有50000个操作,分为三种:将新的糖(p,q)放入盒子中将盒子中存在的糖(p,q)吃掉给出一条狗的参数(x,y),询问当前存原创 2015-08-25 16:22:36 · 3401 阅读 · 4 评论 -
Codeforces Round #283(div.2) 496C C. Removing Columns
题目地址:http://codeforces.com/contest/496/problem/C题目大意:给出一个n*m的字符矩阵,你能做的操作是每次删除一列,问能够最少删除几列使得字符串矩阵的每行的字符串从上到下顺序是字典序。做法:这个题很简单,属于那种解法容易想出来,但是写法复杂的题目。这个题的解法很容易想到,遍历每一列,检查这一列是否需要删除即可。那么该怎么判定某一列是否需要原创 2015-01-26 20:23:56 · 594 阅读 · 0 评论 -
HDU 4115 Eliminate the Conflict【2-sat】
转载请注明出处:http://blog.csdn.net/u013912596大体原创 2014-11-10 19:22:22 · 747 阅读 · 0 评论 -
hdu 4819 Mosaic【二维线段树】
题目大意:给出一个矩阵,有一种操作:x,y,l,将(x,y)元素修改为,以(x,y)为中心,尺寸为l*l的矩阵中(min+max)/2。就是一个裸的二维线段树,一维是普通线段树,二维每个区间都有一个线段树。#include #include #include #include #define L(x) (x)<<1#define R(x) ((x)<<1)|1原创 2014-09-30 16:24:40 · 704 阅读 · 0 评论 -
Codeforces 319B. Psychos in a Line【栈】
题目大意:一串数列,每一个值如果大于相邻右一位的值的话,那么就可以把右边这个值“吃掉”(右一位消失,原来的值不变),问需要吃多少次才能到达无法再吃的状态。做法:利用栈。遍历一遍数组,处理每个值的时候,如果栈顶的元素小于该值,那么将其弹出,知道栈顶元素大于该值或者栈为空,栈内的每个元素记录下一个属性:他是在第几次被“吃掉”,进栈的新元素的被吃次数就是它弹出去的元素中的属性的最大值原创 2014-08-31 14:48:56 · 1419 阅读 · 0 评论 -
Codeforces 463D. Gargari and Permutations【DP】
题目大意:给出1~n的k个排列(2做法:算是不难的DP,dp[i]表示以i为结尾的最长公共子序列的长度,由于每个数在一个排列中只可能出现一次,我们用一个二维数组pos[i][j]表示数字j在第i行出现在第几个位置,再用一个数组cnt[i] 记录i出现了多少次;当第i个数出现了k次之后,说明能够以该数为结尾构成公共子序列,那么dp[i]=max(dp[j]+1),其中i,j满足p原创 2014-08-31 14:52:41 · 868 阅读 · 0 评论 -
Codeforces 463C. Gargari and Bishops
题目大意:给出一个n*n的棋盘,要在这个棋盘上放两个象(能将以自己为中心的两条斜对角线上的子全部吃掉),要求两个象不能吃到相同的子,问最后最大能够吃到的价值,和需要在哪两个点上放置这两个象。做法:首先我们需要知道在每个点上防置象能吃到多少,怎么解决这个问题?我们可以将左斜方向和右斜方向的每一行编号,然后分别计算出每一行的价值,最后将每个点对应的左斜右斜的伤害加起来再减掉当前点的原创 2014-08-31 15:16:07 · 570 阅读 · 0 评论 -
Codeforces 85B. Embassy Queue【线段树、贪心】
题目大意:每个人要办理签证都必须到大使馆中办理三种手续,而且这三种手续办的顺序是固定的。给出办理每种手续的窗口有多少个,办理每个手续花费的时间,有多少人会来办理手续,一级每个人会在什么时间来。要求的是所有人分别在大使馆待的最长时间是多少。做法:一种贪心的做法,由于只有三种手续,那么每个人进入办理的时候,保证选办理同种手续的所有窗口中最早等待的那一个窗口(为什么会有等待?因为该窗原创 2014-09-01 14:05:28 · 894 阅读 · 0 评论 -
hdu 4965 Fast Matrix Calculation【矩阵快速幂模板】
此题只是需要对某个矩阵进行变换相乘之类的,换一下两个矩阵相乘的顺序,利用矩阵快速幂求解即可。#include #include #include #include #include #include #define N 1010using namespace std;int** mul(int** A,int** B,int n,int m,int l)//A原创 2014-09-15 17:58:35 · 819 阅读 · 0 评论 -
hdu 5015 233 Matrix(西安网络赛1009)【构造矩阵】
说起这题简直醉了。。当时愣是没想到该怎么做,搞了好久,虽然有想过构造矩阵,但是没仔细想下去。此题构造两个矩阵,假设a[]数组为题目给出的数据,最多有10个元素,我们可以构造一个矩阵A:a={a[1],a[2],a[3],...a[n],23,3} 大小为1*(n+2)要得到题目需要的计算结果,那么在构造一个矩阵B,大小为(n+2)*(n+2):(假设n=3)b= 1原创 2014-09-15 18:49:24 · 941 阅读 · 0 评论 -
Codeforces 362C. Insertion Sort【构造】
题目大意:给出一个排列,问交换某两个数之后,该排列的逆序数最小为多少,并找出可以交换多少对数能够得到这样的逆序数。做法:由于数据范围只有5000,那么直接暴力O(n^2)也是可行的,既然如此,我们暴力枚举两个交换的元素的下标,思考一下交换之后,整个序列的逆序数会怎么改变。假设我们交换的是a[i],a[j](由于需要得到的是逆序数最小,那么交换的两个数满足,a[i]>a[j]),原创 2014-09-02 13:23:48 · 1139 阅读 · 0 评论