
算法设计-高效算法
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
hdu 4920 Matrix multiplication(高效)
题目链接:4920 Matrix multiplication题目大意:给定两个n阶矩阵,求矩阵相乘后模3.解题思路:因为矩阵模掉3后只有0,1,2三种情况。所以对于矩阵A,记录每一行中1,2的位置,借助bitset。矩阵B中每一列1,2的位置。然后对于结果中每个位置,只要考虑1∗1,1∗2,2∗1,2∗2的个数即可。#include #include #include原创 2014-08-05 22:39:08 · 1324 阅读 · 0 评论 -
hihoCoder 1236 Scores(bitset+分块)
题目链接:hihoCoder 1236 Scores解题思路将5维分开考虑,对于每一维,将n分成sqrt(n)长度为一块,用bitset维护,S[i]表示0~i这些中包含的元素id。对于每次查询,用二分找到对应为值,处理出对应的二进制位。然后5维结果取且。代码#include <cstdio>#include <cstring>#include <cmath>#include <bitset>原创 2015-10-07 12:20:50 · 1059 阅读 · 0 评论 -
hihoCoder 1232 Couple Trees(LCA)
题目链接:hihoCoder 1232 Couple Trees解题思路用倍增求出每个节点的LCA值,f[u][i]f[u][i]表示u节点的第2i2^i个父亲节点。然后将其排序,用作二分。每次两个节点向上移动,因为节点编号小的一定层数低,所以可以判断哪一个节点移动。代码#include <cstdio>#include <cstring>#include <algorithm>using na原创 2015-10-07 12:12:32 · 897 阅读 · 1 评论 -
hdu 5453 Dividing This Product(分块打表)
题目链接:hdu 5453 Dividing This Product解题思路分块打表,按照1e7的长度,先用程序打出一张ans[300][50]ans[300][50]的表。然后对于每组数据,最多在用素数筛选法求一遍1e7即可。还有一个用记忆化搜索的在线做法,复杂度为o(n0.75)o(n^{0.75}),但是因为用了map维护dp,所以TLE了。连接代码AC代码#include <cstdi原创 2015-10-08 13:42:23 · 3070 阅读 · 2 评论 -
hdu 4669 Mutiples on a circle(高效)
题目链接:hdu 4669 Mutiples on a circle代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 50005;int N, K, A[maxn<<1], C[maxn<<1];int dp[2原创 2015-11-06 21:47:29 · 639 阅读 · 0 评论 -
Codeforces 496D Tennis Game(高效)
题目链接:Codeforces 496D Tennis Game代码#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 2 * 1e5 + 5;const int inf = 0x3f3f3f3f;typedef pair<i原创 2015-11-10 13:20:49 · 782 阅读 · 0 评论 -
hdu 5481 Desiderium(高效)
题目链接:hdu 5481 Desiderium代码#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;typedef pair<int,int> pii;typedef long long ll;const int maxn = 1e5 + 5;cons原创 2015-10-11 21:48:18 · 584 阅读 · 0 评论 -
hdu 5497 Inversion(高效)
题目链接:hdu 5497 Inversion解题思路先处理出每个位置与前后面形成的逆序对数L[i],R[i]。然后维护一段长度为M的区间,从起始为值为1到N-M,维护删除该段区间会破坏多少逆序对数,保留最大值,用总的减去即可。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const i原创 2015-10-11 22:40:51 · 605 阅读 · 0 评论 -
hdu 5496 Beauty of Sequence(高效)
题目链接:hdu 5496 Beauty of Sequence解题思路考虑每个位置的贡献度。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e5 + 5;const int mod = 1e9 + 7;struct Element { int原创 2015-10-11 22:32:21 · 545 阅读 · 0 评论 -
hdu 4647 Another Graph Game(高效)
题目链接:hdu 4647 Another Graph Game解题思路P[i]维护的为前缀取模M为i最早出现的位置。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 1e5 + 5;int N, M;ll W[原创 2015-10-30 23:20:37 · 561 阅读 · 0 评论 -
hdu 5524 Subtrees(高效)
题目链接:hdu 5524 Subtrees解题思路如果这棵树高为d,那么从2d,n,2d+1−12^{d}, n, 2^{d+1}-1三个节点向根移动,路径上的点的值放入set中去重。代码#include <cstdio>#include <cstring>#include <set>#include <algorithm>using namespace std;typedef unsig原创 2015-11-02 10:16:48 · 757 阅读 · 0 评论 -
hdu 5510 Bazinga(高效)
题目链接:hdu 5510 Bazinga解题思路先从后向前遍历每个字符串,每个字符串判断一下是否包含它前面一个字符串,找到i最大的不包含串。如果找不到,则为-1;否则用两个指针,p=i+1,q=i-1,每次判断q是否是p的子串,是的话q–,不是的话p++,直到有一方走到头位置。这样的理论复杂度为o(nm),m为字符串的总长度。代码#include <cstdio>#include <cstrin原创 2015-11-01 23:18:53 · 840 阅读 · 0 评论 -
hdu 5570 balls(高效)
题目链接:hdu 5570 balls代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1005;int N, M;double A[maxn][maxn];int main () { while (scanf("%d%d", &N, &M) ==原创 2015-12-03 20:54:25 · 577 阅读 · 0 评论 -
Codeforces 601B Lipshitz Sequence(高效)
题目链接:Codeforces 601B Lipshitz Sequence代码#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>using namespace std;const int maxn = 1e5 + 5;typedef long long ll;int N, M, A[maxn]原创 2015-12-03 21:27:49 · 1048 阅读 · 0 评论 -
hdu 5587 Array(高效)
题目链接:hdu 5587 Array代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 55;typedef unsigned long long ll;ll N, cnt[maxn+5], sum[maxn+5];ll solve (ll n) {原创 2015-12-03 21:07:25 · 661 阅读 · 0 评论 -
hdu 5583 Kingdom of Black and White(高效)
题目链接:hdu 5583 Kingdom of Black and White代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e5 + 5;typedef long long ll;char str[maxn];int L[maxn][2], R[原创 2015-12-03 21:00:28 · 827 阅读 · 0 评论 -
hdu 4657 Find Permutation(高效)
题目链接:hdu 4657 Find Permutation代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e5 + 5;int N, A[maxn], B[maxn], C[maxn], P[maxn];int main () { int ca原创 2015-11-06 21:29:14 · 1314 阅读 · 0 评论 -
hdu 5414 CRB and String(贪心)
题目链接:hdu 5414 CRB and String减掉两串开头部分相同的地方,并且如果开头部分不一样或者是t串的要比s串的长即为不可行(s=aabb,t=aaabb),后面部分分情况匹配,最后s串有剩即为不可行。#include #include #include using namespace std;const int maxn = 1e5 + 5;原创 2015-08-21 22:36:15 · 830 阅读 · 0 评论 -
hdu 4961 Boring Sum(高效)
题目链接:hdu 4961 Boring Sum题目大意:给定ai数组;构造bi, k=max(j|0ji,aj%ai=0), bi=ak;构造ci, k=min(j|ij≤n,aj%ai=0), ci=ak;求∑i=1nbi∗ci解题思路:因为ai≤105,所以预先处理好每个数的因子,然后在处理bi,ci数组的时候,每次遍历一个数,就将其所有的因子更新,对于bi维护最原创 2014-08-19 23:05:15 · 1523 阅读 · 0 评论 -
hdu 4970 Killing Monsters(高效)
题目链接:hdu 4970 Killing Monsters题目大意:在长度为N的路上,有M个攻击塔,给定M个攻击台的攻击范围和伤害,现在有Q只怪物,给出Q只怪物的HP和出现位置,怪物固定向右进攻,问所有有多少只怪物活着。解题思路:对于攻击台,l,r,val,在v[l]处加上val,v[r+1]处减掉val。然后遍历一遍v数组递推出各个点的伤害。并且处理处伤害的前缀和。然后对于每只原创 2014-08-19 23:46:07 · 756 阅读 · 0 评论 -
Codeforces 455A Boredom(高效)
题目链接:Codeforces 455A Boredom题目大意:给定一个序列,每次从序列中选中一个数ak,获得ak的得分,同时删除序列中所有的ak−1,ak+1,求最大得分。解题思路:开一个数组记录各个数有多少个,然后遍历一遍 ,维护两个值,一个是前一个不选的最大值,一个是前一个选的最大值。#include #include #include #include us原创 2014-08-09 11:44:34 · 2626 阅读 · 0 评论 -
uva 10228 - Star not a Tree?(模拟退火)
题目链接:uva 10228 - Star not a Tree?题目大意:给定若干个点,求费马点(距离所有点的距离和最小的点)解题思路:模拟退火算法,每次向周围尝试性的移动步长,如果发现更优点,则转移。每次操作之后减少步长后做同样的操作,直到步长小于指定精度。#include #include #include #include #include #include原创 2014-08-21 23:24:27 · 1364 阅读 · 0 评论 -
hdu 4972 A simple dynamic programming problem(高效)
题目链接:hdu 4972 A simple dynamic programming problem题目大意:两支球队进行篮球比赛,每进一次球后更新比分牌,比分牌的计数方法是记录两队比分差的绝对值,每次进球的分可能是1,2,3分。给定比赛中的计分情况,问说最后比分有多少种情况。解题思路:分类讨论:相邻计分为1-2或者2-1的时候,会对应有两种的的分情况相邻计分之差大于3或者原创 2014-08-21 21:56:09 · 1581 阅读 · 0 评论 -
Codeforces 464C Substitutes in Number(高效+快速幂)
题目链接:Codeforces 464C Substitutes in Number题目大意:给定一个字符串,以及n中变换操作,将一个数字变成一个字符串,可能为空串,然后最后将字符串当成一个数,取模1e9+7。解题思路:将操作倒过来处理,这样维护每个数来的val,len两个,val表示对应数值取模1e9+7,len表示对应有多少位,再计算的过程中要使用。#inc原创 2014-09-08 17:07:34 · 1819 阅读 · 2 评论 -
hdu 4941 Magical Forest(hash映射)
题目链接:hdu 4941 Magical Forest题目大意:给定N,M和K,表示在一个N*M的棋盘上有K个棋子,给出K个棋子的位置和值,然后是Q次操作,对应的是:1 a b :交换a和b两行2 a b : 交换a和b两列3 a b :查询a b这个位置上棋子的值,没有棋子的话输出0解题思路:一开始X[i]=i,X[j]=j,如果需要交换i和j,那么就令X[i]=j,X原创 2014-08-12 18:50:23 · 1733 阅读 · 0 评论 -
hdu 5037 Frog(高效)
题目链接:hdu 5037 Frog题目大意:给定N,M,L,表示有一只条宽为M的河,青蛙要从0跳到M,青蛙的最大跳跃能力为L,现在已经存在了N块石头,现在要放任意数量的石头,使得说青蛙需要用最多的步数跳到M。解题思路:维护两个指针,pos表示青蛙当前的位置,mv表示青蛙在前一个位置能跳到的最远位置。然后周期L+1的长度可以让青蛙需要跳两次。但注意每一段长度的最后一个周期需要特判,原创 2014-09-22 13:59:53 · 1186 阅读 · 0 评论 -
hdu 4986 Little Pony and Alohomora Part I(递推)
题目链接:hdu 4986 Little Pony and Alohomora Part I题目大意:给定若干个箱子,每个箱子中装着一把钥匙,问最少要敲开多少个箱子才能打开所有箱子。解题思路:需要敲开的次数即为整个序列循环的个数,知道这点就很容易得到f(i)=f(i−1)+1i,然后对于n小的情况,用递推即可,对于n大的情况,用log函数近似处理。#include #incl原创 2014-08-31 22:01:18 · 1044 阅读 · 0 评论 -
Codeforces 467E Alex and Complicated Task(高效)
题目链接:Codeforces 467E Alex and Complicated Task题目大意:给定一个长度为n序列,然后从中挑选尽量多的4元组(不能重叠)。解题思路:每次找的四元组的左端肯定是要尽量小的。所以用一个单调栈维护,如果新加入的数x在栈中出现过,那么就将两个数之间的数标记为在x。如果一个数的标记不为空,就意味着找到对应的四元组。有因为序列是从左遍历过去的,所以找到原创 2014-09-26 20:25:54 · 1953 阅读 · 1 评论 -
uva 1471 - Defense Lines(高效)
题目链接:uva 1471 - Defense Lines题目大意:给定一个序列,删除一段连续的序列后,使得现在序列中连续的递增序列尽量长。解题思路:维护单调即可,即连续长度最长的情况下结尾的小值,然后对于新的一段,用二分找到满足的连接处。#include #include #include using namespace std;const int maxn = 2原创 2014-09-15 20:19:20 · 1365 阅读 · 0 评论 -
Codeforces 466C Number of Ways(高效)
题目链接:Codeforces 466C Number of Ways题目大意:给定一个序列,要求分成三段,每段和相同,问有多少种拆分方法。解题思路:将所有前缀和为sum3的位置全部记录下来,然后在逐个计算后缀和,然后对应如果和为sum3,计算该位置前有多少个前缀和sum3。#include #include #include #include using names原创 2014-09-24 15:46:19 · 1502 阅读 · 0 评论 -
hdu 5073 Galaxy(数学)
题目链接:hdu 5073 Galaxy题目大意:给定N个点,可以移动其中的K的点,问说最后I的最小值可以是多少。解题思路:因为质量都为1嘛,所以就是求方差,可以移动K个,所以即选连续的n=N-K个使得方差最小。注意N=K的情况。S表示n个数的和,T表示n个数平方的和,那么这n个数的方差即为T - S * S / n,然后扫描一遍数组维护S,T,并且计算方差原创 2014-10-23 20:08:31 · 1333 阅读 · 0 评论 -
Codeforces 484B Maximum Value(高效+二分)
题目链接:Codeforces 484B Maximum Value题目大意:给定一个序列,找到连个数ai和aj,ai%aj尽量大,并且ai≥aj解题思路:类似于素数筛选法的方式,每次枚举aj,然后枚举k,每次用二分找到小于k∗aj并且最大的ai,维护答案,过程中加了一些剪枝。#include #include #include using namespace std;原创 2014-11-06 23:54:59 · 1921 阅读 · 0 评论 -
hdu 5419 Victor and Toys(暴力+组合)
题目链接:hdu 5419 Victor and Toys枚举每个位置被多少段区间包含。#include #include #include using namespace std;typedef long long ll;const int maxn = 50005;int N, M, A[maxn], C[maxn];void init () {原创 2015-08-31 23:27:14 · 547 阅读 · 0 评论 -
hdu 5875 Function(高效)
题目链接:hdu 5875 Function/************************** * Author: Jerakrs* Time: 2016.10.01* Problem: 给定一个数组,每次查询区间[l, r],* 输出A[l] % A[l+1] % ... % A[r]* Solve: 按左区间大小顺序遍历询问,维护优先队列,* 每次取出val原创 2016-10-01 22:47:45 · 795 阅读 · 0 评论