自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AC_Arthur的专栏

Always challenge miracles!

  • 博客(58)
  • 收藏
  • 关注

原创 USACO Name That Number(水题暴力)

直接对于字典中的每一个字符串扫描,看看是否等价于输入的数字。   网上有的人做的也太麻烦了。细节参见代码:

2015-09-30 21:16:18 876

原创 HDU 1754 I Hate It(线段树单点替换/区间最值)

简单线段树基本操作。线段树是一种树状结构,每个结点对应了一个区间,由于该结构是一个典型的二叉树,所以每一层最多只会递归两次,假定根结点长度为pow(2,h),那么结点总数容易计算出来,大约区间长度的两倍,很多人说要开四倍的数组,这其实是针对于非递归写法的,如果用递归写只需要开三倍就够了。其实递归手法很巧妙的,用返回值顺带更新了所有祖先结点。细节参见代码:#includeusing

2015-09-29 16:54:43 596

原创 12299 - RMQ with Shifts(线段树单点更新、区间求最值)

该题由于每次操作所改动的数字个数较少,所以直接用单点更新就好了。细节参见代码:#includeusing namespace std;typedef long long ll;const int maxn = 100000 + 10;const int INF = 1000000000;int n,m,a[maxn],q,ql,qr,p,v,minv[3*maxn],b[30];

2015-09-27 09:22:56 637

原创 11992 - Fast Matrix Operations (线段树)

题目链接:点击打开链接该题是线段树的区间更新和区间求和操作, 但是注意区间更新的时候有两个操作:修改值和增加值 。    这两个操作在某些情况下会相互影响 。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;

2015-09-26 09:50:12 566

原创 HDU 1698 Just a Hook(线段树-区间修改|区间查询)

该题是线段树区间修改和区间查询的模板题,需要仔细理解模板中的setv数组和sumv数组,sumv数组定义为:如果只执行结点o及其子孙结点中的setv操作,结点o对应区间中所有数只和。   setv数组就是所谓的懒惰标记,我们不是每次修改值都遍历所有涉及到的区间,而是在查询时用到了哪个setv值之时临时更新。还有一些细节没有搞懂,明白之后再回来补充。细节参见代码:#include#in

2015-09-25 20:29:17 686

原创 Count Color(线段树+位运算)

这是之前比赛的一道题目,HD训练题上又遇到了,直接A了,其实就是将求和操作变成|=运算符,用位运算压缩T种颜色,这样每个结点上维护的就是其所覆盖的颜色种类数。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;const int maxn = 100000 +

2015-09-25 19:11:10 798

原创 HDU 1238 Substrings(KMP)

该题可以用KMP,但是看网上很多人都是直接暴过去的,好像也差不了多少,可见数据之水。找到所给字符串中对短的串,枚举其子串的首尾下标,然后取出来作为子串然后对每一个串做KMP,因为其逆序也可以,所以也要将其逆序单独取出来。细节参见代码:#include#include#include#include#include#include#include#include#incl

2015-09-24 15:44:41 739

原创 HDU 2203 亲和串 (KMP)

最近看了看KMP算法,发现其状态转移图构造的十分巧妙,通过递推计算出返回的地方,以降低时间复杂度。    该题就是一个KMP裸题,不过该题可以循环 移位,那么不妨我们将s1扩充成原来的两倍就行了,但是这样要实现判断两个串的大小,不然扩充后的s1有可能匹配上一个比它长的s2 。细节参见代码:#include#include#include#include#include#inclu

2015-09-23 21:21:07 604

原创 11235 - Frequent values (RMQ)

该题是RMQ的灵活应用。  由于数列非降序排列,所以相同的元素都在一起, 那么我们就可以将每个数出现的个数组成一个新的数组运用RMQ求解,但是该题所给区间有可能会将序列“截断”,所以截断部分单独处理,剩下部分用RMQ,最终答案为三部分只和。细节参见代码:#includeusing namespace std;typedef long long ll;const int INF =

2015-09-23 17:33:14 504

原创 UVA 12086 - Potentiometers(树状数组)

题目链接树状数组裸题。细节参见代码:#includeusing namespace std;typedef long long ll;const int maxn = 200000 + 5;const int INF = 1000000000;int n,m,x,y,a[maxn],kase = 0,bit[maxn];ll sum(int x) { ll re

2015-09-22 22:05:50 629

原创 LA 4329 - Ping pong(树状数组)

题目链接该题非常经典,我们可以枚举每一个当裁判的人,将问题转化为求某个数左边和右边比他小的数有多少。怎么办呢?我们先来求某个数左边比他技能值小的数字个数c[i],d[i]数组类似  我们知道树状数组可以快速求前缀和单点修改。 那么我们不妨将技能值作为bit数组下标,那么我们只需要从左向右扫一遍,每次单点更新,将当前技能值a[i]的个数+1,那么sum(a[i]-1)就是比当前能力值

2015-09-22 21:06:13 644

原创 HDU 3874 Necklace(树状数组离线处理)

想了一下午没有想到好办法,看了一下别人思路,该题需要离线处理。这个方法可以很好的处理重复数字的问题,用来求解无重复数字的区间和问题。将询问的区间按照右端点排序,每次记录上一个区间的右端点R,然后遍历R到当前区间右端点,用一个数组记录每一个数字出现的位置,如果该数字出现过,那么删除上一次出现的位置的值,并更新到当前位置。   这样就可以有效的去重 。   由于整个过程只是遍历了一遍数组,所以

2015-09-22 19:45:51 669

原创 POJ 1990 MooFest(树状数组)

题目链接: 点击打开链接该题是一道很巧妙的树状数组的应用,一开始初学ACM的时候曾经看别人题解做过,然而一丝作用也没有,完全没有理解该题,以至于现在见到和没做过一样。个人认为学习树状数组还是去看一下lrj的蓝书吧,讲出了树状数组维护数据的原理,以及那个bit数组的含义,理解了数据结构原理之后才能随心所欲的运用。该题求任意两个牛的吼叫值只和。    由于两头牛的吼叫值取最大的,所以一

2015-09-22 16:08:34 775

原创 HDU 3743 Frosh Week(树状数组求逆序数)

模板题,有一个坑点,学生编号并不一定是老老实实的1、2、3、.....n这个排列,可能很大,所以一开始RE了。    给编号另分配一个编号,只要满足大小关系就行。细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace st

2015-09-22 09:46:23 838

原创 11136 - Hoax or what(multiset)

题目地址该题就是一个stl应用,我们需要快速维护数列中最大值和最小值,而多重集合恰好满足这个条件,自动对每次插入的元素排序,其插入、删除、排序的复杂度都是logn,非常的快,当然你也可以手写最大、最小堆,不过没有必要在比赛时放着现成的数据结构不用吧。注意会爆int细节参见代码:#includeusing namespace std;typedef long long ll;

2015-09-20 19:13:09 590

原创 11987 - Almost Union-Find(并查集删除操作)

该题的难点就在于删除操作,  对于删除操作是有一个通用方法的 。     首先我们要明确,由于并查集是一个树状结构,内部关系复杂,所以如果将其中的一个点直接拆出来,势必会导致树状结构解体。   那么怎么办呢? 我们其实可以不必改变其原有结构,而是用一个id[i]数组表示元素i的编号,每次的删除操作即给元素i分配一个新的编号。因为要求输出集合的元素个数和他们的和,所以我们需要维护这个信息,因为并查集

2015-09-20 11:09:50 1392

原创 1329 - Corporative Network(并查集)

题目链接该题是比较经典的并查集题目,经典在需要在路径压缩时维护一些量。    由于每棵树除了根结点不能换之外,其他结点的位置可以任意改变,这恰好符合并查集的特点。但是如果用最朴素的方法维护每个结点到根的距离,那么每次新加入的结点就要向上遍历一遍所有结点,时间复杂度难以承受(因为无法路径压缩) 。 所以我们可以在路径压缩的时候顺便求出d值 。   在每次返回某个结点的祖先之前先将当前结点的d

2015-09-20 09:52:07 609

原创 UVA 1160 - X-Plosives(并查集)

题目地址很经典的并查集题目,一开始我们或许觉得无从下手,但是仔细观察可以发现,他的规定很有意思: 如果存在k个化合物,正好包含k种元素 。似乎不能简单的判断所有元素种类是否在一个集合中 。但是如果我们把每个元素看成顶点,则一个简单化合物就是一条边, 不难发现,当整个图存在环的时候,组成环的边对应的化合物恰好是危险的。所以就像最小生成树算法一样维护图的联通分量就行了。细节参见代码:

2015-09-20 09:01:09 586

原创 1203 - Argus(优先队列)

很简单,用优先队列维护即可。  注意在优先队列中优先级高的先出队,所以定义小于运算符的时候和排序相反。细节参见代码:#includeusing namespace std;typedef long long ll;const int maxn = 10 + 5;const int INF = 1000000000;int k,id,p;struct node{ int

2015-09-19 21:57:00 606

原创 11991 - Easy Problem from Rujia Liu?(抽象数据结构)

该题m很大,要求我们可以快速的求出第k个v的下标。   我们最先想到的肯定是用数组下标直接访问d[k][v] , 但是n和m都太大了,数组开不下。

2015-09-19 18:52:39 627

原创 1394 - And Then There Was One(约瑟夫问题变形)DP

约瑟夫问题模板题。细节参见代码:#includeusing namespace std;typedef long long ll;const int maxn = 10000 + 3;const int INF = 1000000000;int n,m,k,d[maxn];int main() { while(~scanf("%d%d%d",&n,&k,&m) && n

2015-09-18 16:58:29 608

原创 10891 - Game of Sum(DP)

一开始自己尝试着写,将状态表示成d[i][j][k]表示当前区间i~j,轮到k取数时的最优解,但是我并没有定义清楚这个最优解的含义,导致出现了错误。 其实状态方程的意义应该是固定的,所以要定义一个统一意义的含义。    所以我如果仍然要这样表示状态,那么它的含义应该是:当前区间i~j,轮到k取数时k能获得的最大和。那么可以发现,其实这个第三维是没有意义的,因此可以省略 。  并且这可以等价

2015-09-18 09:51:32 514

原创 10132 - File Fragmentation

网上很多人用的什么矩阵,没看懂,其实该题n最大75,估算了一下复杂度,直接四重循环枚举矩形的两个对角线顶点暴过去就OK了。   不过一开始WA了是因为该矩形不仅可以行旋转和列旋转,还可以即行旋转又列旋转,不过可以发现,旋转完之后,其实就等于前三种情况剩下的部分。  由于有负数,要注意排除一些答案为0的情况。细节参见代码:#includeusing namespace std;typ

2015-09-17 14:52:33 561

原创 NEERC 2014 Problem B. Burrito King

简单的贪心,很容易证明,先尽量多的买b/a小的比较划算。比赛时YY了一下就想出来了,可是WA到比赛结束,估计是精度导致的,换了int输入然后省略了一些浮点数相等的比较之后就AC了。 以后一定要注意。细节参见代码:#include#include#include#include#include#include#include#include#include#include

2015-09-16 20:50:38 829

原创 10730 - Antiarithmetic?(水题)

题意: 问在给定序列中是否存在三个数按照顺序成等差数列。如果直接套循环找的话,复杂度比O(n^2)还要大,接受不了。那么我们不妨换个思路,从小到大枚举等差级数d,等到第三个数不再1~n-1的范围内时退出枚举下一个数就行了。至于为什么我没有枚举负数值d,我猜测是如果存在递减的等差数列,那么一定也存在一个递增的,要不然就是数据有漏洞,希望知道答案的朋友能够告诉我。细节参见代码:#i

2015-09-15 20:49:11 600

原创 10810 - Ultra-QuickSort(求逆序数)

该题实际上就是求所给排列的逆序数个数。 因为最快的排序方法一定是先将最大的数放到最后,再将第二大的数放到最后...... 该贪心算法很容易证明。方法有两种: 归并排序或者树状数组(线段树)。下面用归并排序实现的:细节参见代码:#includeusing namespace std;typedef long long ll;const ll INF = 1000000000

2015-09-15 19:51:53 565

原创 10125 - Sumsets(折半枚举+二分)

该题和挑战上一道题很类似,如果枚举四个值的话,复杂度太高。  那么我们可以想办法将复杂度分开。 方法是: 先用O(n^2)预处理出来a+b,然后枚举c和d,二分查找ab中有没有恰好等于d - c的值。细节参见代码:#includeusing namespace std;typedef long long ll;const ll INF = 1000000000;const in

2015-09-15 16:01:05 581

原创 585 - Triangles(简单题)

很简单的题目,通过观察可以发现,每一行的奇数个都是尖头向下的三角形,偶数个都是尖头向上的。 所以我们不妨分一下类,对于尖头向上的就向下扩展,反之向上扩展。如果可以拓展就更新答案。细节参见代码:#includeusing namespace std;typedef long long ll;const ll INF = 1000000000;const int maxn = 100+

2015-09-15 15:26:31 667

原创 10670 - Work Reduction(水题)

对于每一个代理。我们直接模拟就行了,看看是A方案好还是B方案好。细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 100000000;const int maxn = 100 + 5 ;int T,n,m,l,kase = 0;struct node{ char name[

2015-09-15 11:46:24 918

原创 10026 - Shoemaker's Problem(贪心)

该题是说有n个任务,每个任务都有一个需要的时间,还有一个价格,这个价格的意思是:在开始处理该任务之前的每一天都亏损这个价格,问最小亏损的安排是什么样的。YY了一下,发现样例是按照:价格/时间 进行了排序,其次按照编号排序。大概的原理类似于性价比之类的吧,从样例就可以看出来,不一定要先处理价格高的就好,还有完成天数的限制。至于这个贪心方法的证明,网上搜到一个:对于为什么贪心策略是这个样子

2015-09-14 19:51:25 641

原创 10020 - Minimal coverage(水题)

区间覆盖裸题。   按照左区间端点排序,每次贪心的选取覆盖最长的那个区间。细节参见代码:#includeusing namespace std;typedef long long ll;const ll INF = 1000000000;const double eps = 1e-6;const int maxn = 100000+5;int T,n,m,l,r;struct

2015-09-13 21:56:41 585

原创 10382 - Watering Grass(水题)

通过观察可以发现,为了使得选出的两个圆完全覆盖草地,前面的圆的与草地的交点小于后面圆与草地的交点。    所以我们可以简单的计算出圆与草地的交点,然后按照左交点排序,扫一遍即可。   我们在遍历的时候用两个变量维护当前已经选择的圆的右边和即将选得圆的左边,这是为了选出覆盖面积最大的符合要求的圆。另外值得一提的是,UVA上的Debug上的答案是错误的。。。细节参见代码:#include

2015-09-13 19:26:33 895

原创 10970 - Big Chocolate(水题)

好水,因为不能同时切两块,所以答案其实是确定的:n*(m-1) + n - 1;细节参见代码:#includeusing namespace std;typedef long long ll;const ll INF = 1000000000;const int maxn = 100000+5;int n,m;int main() { while(~scanf("%d%

2015-09-13 16:38:58 520

原创 11636 - Hello World!(水题)

用贪心的思想,每次都复制尽量多的语句,最后一次按需复制即可。细节参见代码:#includeusing namespace std;typedef long long ll;const ll INF = 1000000000;const int maxn = 100000+5;int n,m,kase = 0;int main() { while(~scanf("%d",

2015-09-13 15:48:17 563

原创 1121 - Subsequence (滑动窗口)

很简单的一道题,用滑动窗口秒过,每个数字进出窗口各一次,所以复杂度O(n) 。细节参见代码:#includeusing namespace std;typedef long long ll;const ll INF = 1000000000;const int maxn = 100000+5;ll T,n,m,s,a[maxn];int main() { while(~

2015-09-13 11:40:38 633

原创 11549 - Calculator Conundrum(水题)

很简单的水题,显然是有循环的,只要循环回出现过的数字就不必再继续平方了。细节参见代码:#includeusing namespace std;typedef unsigned long long ll;const int maxn = 1000;ll T,n,m,k;int main() { scanf("%d",&T); while(T--) {

2015-09-08 19:27:36 559

原创 11078 - Open Credit System(简单题)

一道简单题。细节参见代码:#includeusing namespace std;const int INF = 100000000;int T,n,m,a;int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); int maxv = -INF, ans = -INF;

2015-09-08 17:31:07 652

原创 11729 - Commando War(贪心)

一道简单的贪心,很容易想到,为了使得所有人执行完任务的总时间最短,需要先安排执行任务时间长的,所以按照J从大大小排序即可。细节参见代码:#includeusing namespace std;const int maxn = 1000 + 5;int n,m,kase=0;struct node{ int a,b; bool operator < (const no

2015-09-08 15:37:39 785

原创 11292 - Dragon of Loowater(贪心)

我的《训练指南》第一题,开始刷训练指南了,接下来会踏踏实实的独立刷题,远离题解。例题也尽量自己做。  刷题的内容大致就是lrj的两本书和另外的训练题。 其他的题库待我能力达到了再说吧。该题很简单,排序、贪心即可。 很容易证明选厉害的骑士不如选差一点的好。细节参见代码:#includeusing namespace std;const int maxn = 20000 + 5;in

2015-09-08 14:46:22 551

原创 HDU 1217 Arbitrage(Flody)

Flody的变形,初始化所有d[i][i] = 1,其他为0。 这样在Flody的时候取大就行了。   然后检查所有点d[i][i]是否有大于1的。细节参见代码:#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;

2015-09-07 20:53:50 540

空空如也

空空如也

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

TA关注的人

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