自定义博客皮肤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!

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

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

题目链接:点击打开链接题意: 输入一个n表示一段长度为n的区间,有n个编号为1~n的点,初始值全部为1。 有q个操作, 每个操作有3个数:l,r,v表示将区间l~r的所有元素修改为v。求经过q次修改后的整个区间的值之和。该题是最典型的线段树区间修改问题, 需要用到所谓的懒惰标记。   听起来挺难的,其实非常简单, 其原理如下:因为修改很多值, 如果还是按照原来的更新方法, 每个结点

2016-01-01 20:24:42 4446

原创 POJ 2886 Who Gets the Most Candies?(树状数组+二分)

对于可以被i整除的数的个数, 我们可以通过枚举每一个数的倍数, 预先处理出来。该题直接模拟就好, 因为每次都一定有一个人出队, 所以要枚举n次 , 对于每次, 要计算具体是哪个人出队, 这个可以用数学推导很快的算出来是当前队列的第几个人, 要找到这个人我们可以用二分+树状数组来优化算法。 复杂度O(n*logn*logn)细节参见代码:#include#include#incl

2015-12-26 10:43:05 934

转载 《完全版线段树》- NotOnlySuccess

转载自:点击打开链接【完全版】线段树很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要给集训队讲解线段树,所以决定把这些题目重新写一遍,顺便把近年

2015-12-26 09:28:11 6423 4

原创 POJ 2828 Buy Tickets(树状数组)

题目链接:点击打开链接题意:给n个人依次插队的情况, 要求求出最终的队伍情况。该题可以用树状数组很方便的维护。如果从前向后扫的话, 每次插队都会影响这个人后面的情况, 所以我们可以倒着进行, 那么最后一个人的位置就是最终位置, 对于前面的人的位置, 只受后面人的影响, 所以等价于其最终位置是第pos[i]+1个空位。   那么也就是说要快速的找到第pos[i]+1个空位。   显然,

2015-12-24 20:47:36 864

原创 HDU 2795 Billboard(线段树)

题目链接:点击打开链接题意: 原始序列全为w, 找到最左边的>=a的位置。该题利用线段树递归特点来求其最左边的大于等于a的位置。线段树递归的特点是从祖先结点开始自顶向下递归,访问各个元素的顺序一定是从左到右, 并且在递归之后可以顺便维护区间结点的值。利用这个特点, 我们可以直接查询到>=a的最左边的位置。该元素变成v - a,  然后顺便维护改变了的值。 所以该题就成了维护区间最大

2015-12-24 19:51:23 1418

原创 HDU 1394 Minimum Inversion Number(树状数组||线段树)

题目链接:点击打开链接对于求逆序数的问题, 通常用线段树或者树状数组来维护, 树状数组代码短,好写, 还是尽量写树状数组吧。首先求出原始排列的逆序数,  那么对于每一次操作, 因为都是将当前排列的第一个数拿到最后一个位置, 所以答案就增加了所有比他大的数字个数,减小了所有比他小的数字个数。细节参见代码:#include#include#include#include#inc

2015-12-24 15:50:47 1953

原创 HDU 1754 I Hate It(线段树-区间求最值&&单点修改)

线段树基础题,区间最值,单点修改细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define Max(a,b) ((a)>(b)?(a):(b))#de

2015-12-24 11:58:59 815

原创 HDU 1166 敌兵布阵(线段树版)

该题之前用树状数组写过, 最近在学习线段树, 用线段树重新写了一遍。在学习一种新的数据结构之前, 最重要的是要理解其结构是什么样子的, 这个可以参照《算法竞赛入门经典》P199页。 比较重要的是理解好几个变量:1. 每个结点有一个编号。   这个编号对应了其所统治的区间, 我们从线段树的祖先结点开始从上到下, 从左到右的顺序给所有结点编号,这样, 编号为i的结点其左右结点的编号就是2i

2015-12-24 10:57:46 1152

原创 HDU 5493 Queue(二分+树状数组)

题目链接: 点击打开链接题意:有n个人排队,每个人都有一个独一无二的身高,告诉你每个人的身高和他前面或者后面的比他高的人的个数(到底是前是后是未知的)。  要求你还原原来的队列,并且字典序最小。思路: 因为要求字典序最小, 我们可以先按照身高从小到大排序,假设当前到了第i高的人, 他前面或者后面有k个人, 那么他前面的所有人都比他矮, 比他高的还有n-i个人,那么假设他前面还有p个空位,

2015-12-23 22:39:29 1497

原创 HDU 3450 Counting Sequences(DP + 树状数组)

题目链接:点击打开链接题目大意: 统计满足相邻两个数之差不超过d的子序列个数。我们不难想到一个O(n^2)的DP算法 : 对于每一个i, d[i]表示 以i结尾的子序列个数。  那么它将转移到所有满足(j >= 1 && j 但是由于n太大了, 这样显然会超时, 那么我们来想想如何优化这个算法:  可以发现,  对于每个d[i], 其累加的部分是一个(a[i] - d, a[i] +

2015-12-22 20:36:58 1032

原创 FZU 2159 WuYou(贪心)

该题算是比较简单的贪心了, 只要理顺思路, 不是很复杂的。我们可以按照这样的规则进行:从前向后扫一遍, 将?和a[i] == b[i]的情况忽略,  当第一次出现a[i] != b[i]的时候, 分情况讨论如下:1. 如果a[i] 2.如果a[i] > b[i]   , 如果a[i]前面没有? 那么显然是输出-1, 如果a[i]前面有?, 那么从i向前扫, 将?变成b[i]-1,

2015-12-22 10:10:35 862

原创 Codeforces Round #299 (Div. 1) A. Tavas and Karafs(二分)

该题数据量很大, 需要用二分加速算法。题意比较难懂:   给你一个无穷项等差序列, 有n个查询,  对于每个查询, 有三个数 l, t, m, 每次从第l个数之后的数种选择最多m个数使得他们的值减一, 经过最多t次, 求一个最大的r, 使得从l到r所有数都减为0。显然这是一个递增序列, 那么我们直接二分答案就行了 。 如果满足这段序列求和 另外还学到了一个二分上界的好姿势。细节参见

2015-12-21 10:40:51 792

原创 HDU 5207 Greatest Greatest Common Divisor(暴力)

和很多题目的思路是一样的, 因为如果直接二重循环枚举的话时间复杂度是承受不了的, 所以我们不妨换个思路, 先预处理出来没个数出现的次数, 然后从1枚举到最大值i, 对于每个i , 我们找它的倍数, 那么它的倍数肯定以它为最大公约数(因为是从大到小枚举的), 如果超过两个, 则存在以i为最大公约数的两个数, 那么这个i也就是最大的。细节参见代码:#include#include#incl

2015-12-21 09:14:49 783

原创 HDU 5596 GTW likes gt(multiset)

该题其实只需要利用multiset维护一下就可以了。根据题意,  利用题目特点, 可以发现, 如果正着枚举的话, 前面的对后面的会产生影响,  但是, 如果我们倒着枚举就可以避免这个情况。所以我们不妨先记录每个时间点释放魔法的次数, 然后倒着枚举,  这样当前这个数的能力值就是v+res   (res为当前附加的魔法值, 因为后面时间增加的魔法,对于前面时间也一定增加了)。    所以,

2015-12-13 11:30:42 820

原创 HDU 5212 Code(容斥)

题意: 输入n个数, 求这n个数的n^2个两两组合的最大公约数x,x(x-1)之和 。换个思路, 我们如果求出了最大公约数为x的对数cnt, 那么答案就增加x(x-1)cnt^2那么怎么求以x为最大公约数的对数呢?我们枚举x的整数倍, 这样就可以知道这些数中是x的整数倍的数有多少个。

2015-12-12 15:09:34 809

原创 Codeforces Round #320 (Div. 1) C. Weakness and Poorness(三分)

对这个数列中的每一个数减去一个相同的数字, 其最大连续和会呈现出单峰函数的现象, x过大或者过小都不行, 那么处理方法显然是三分。由于该题不是直接三分的答案, 因此三分出的x虽然精度在答案范围内, 但是求出的最大连续和却不一定满足精度。二分或三分浮点数时, 最稳妥的方法是根据数据范围自己设置二分或三分的次数, 这样使得精度可以最大化的精确。细节参见代码:#include#incl

2015-12-07 20:17:44 842

原创 HDU 5592 ZYB's Premutation(二分+树状数组)

昨晚有事没打BC,今天补一补, 这是昨晚第三题,对于一个1~n的序列, 告诉我们每个数前面有多少个比他大的数, 要求我们还原序列。不难发现, 如果我们倒着看的话, 假设当前第i个数是ans[i], 它前面有a[i]个比他大的数, 那么他就是删除后面已经求出的数字后的数组中第a[i]+1大的数。不难想到,将原序列的数当作树状数组的下标, 值为1, 这样就能利用bit快速求出比当前数大的数字还

2015-12-06 13:25:40 1357 4

原创 HDU 5591 ZYB's Game(博弈)

该题是昨晚的BC第二题, 一道挺简单的博弈题。对于博弈题, 关键是要找出必败态或者必胜态。 不难发现, 当所选择的数字是当前数组的中间数字时, 无论怎么选, 对手都能恢复到这个局面,那么当前选手必败。所以所选择的数字不是原数组的中间数字, 那么先手必胜。细节参见代码:#include#include#include#include#include#include#inc

2015-12-06 10:47:29 819

原创 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest F. Gourmet and Banquet(贪心+二分)

该题是一道比较典型的贪心+二分,  题目中已经加深提示了吃每个菜的时间要一样, 那么这个时间到底是多少呢?   我们很自然的想到了要用二分来加速算法。所以主体框架就是二分这个吃每道菜的时间, 然后问题的关键是如何判断到底能不能满足要求。 处理区间问题, 我们可以采取贪心的思想,为了给后续的菜留出尽量多的空间,我们可以按照区间右端点从小到大排序, 但是区间覆盖情况很复杂,所以我们不妨牺牲一些时间

2015-12-05 20:33:48 961

原创 HDU 3085 Nightmare Ⅱ(双向BFS)

经典的双向BFS, 可以使得世间复杂度大大降低。因为男生和女生每秒走的步数不一样,所以我们可以利用BFS的特点,以每一层作为一个单位来BFS细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#include

2015-12-02 21:29:45 851

原创 HDU 2337 Escape from Enemy Territory(BFS+二分优化)

该题比普通的BFS多加了一些限制条件。  一个是:首先要满足在这条路径上距离敌人的最近距离尽量大。 第二个是:路程尽量最短。最短路当然是BFS求, 可是怎么确定这个最近距离呢?   我一开始搞了个优先队列, 按照这个值从大到小排序, 可是后来yy了一下,发现是不对的, 因为当前最大,不一定后来还是最大的路径, 所以会丢失最优解 。后来想了一个方法:再开一个数组记录之前经过这个点的最近距离,

2015-11-27 22:41:56 843

原创 Codeforces Round #297 (Div. 2) E. Anya and Cubes (双向DFS)

首先思考最暴力的方法: 我们用DFS直接搜索所有可能解, 那么对于每一层,有3种决策: 不选这个数, 选择这个数, 选择这个数的阶乘。  递归深度最大25, 时间复杂度O(3^25), 太大了, 要想办法降低时间复杂度。   还记得之前的简化版吗?  我们在四个集合中每个集合选择一个数字相加,问是否等于一个数S, 我们的方法是预处理两个集合中所有的情况,然后二分。  该题也可以采取相同的策略: 进

2015-11-25 22:20:54 841

原创 Codeforces Round #317 A. Lengthening Sticks(组合+容斥)

之前也遇到过好几次这种类型的题目了, 但是这次还是没有在比赛中做出来。因为输入只有4个数, 可变化的状态很少, 但是数据范围又很大, 所以不可能是DP之类的, 一定是一道数学题。   这种特点的题目我们很容易想到排列组合, 然而排列组合往往又会带来重复计数的问题, 所以往往这类题目又需要夹杂容斥定理, 可以说是约定俗称的题目类型。那么不难想到, 用总的组合情况减去不成立的情况(不成立的情况

2015-11-25 19:37:21 727

原创 HDU 2874 Connections between cities(LCA离线算法)

该题用离线算法的时候要注意会MLE, 内存卡的很紧, 所以要想办法优化内存, 利用存储边的数组就行了。 LCA是利用了并查集在树上进行的操作, 由于该题可能不形成一棵树,所以要对所有子树进行LCA。 然后不在一个集合中的两个点不能联通。细节参见代码:#include#include#includeusing namespace std;typedef long long ll;

2015-11-20 16:57:39 956

原创 HDU 2586 How far away ?(LCA)

该题是一道比较基础的LCA(最近公共祖先),也就是快速求出树上任意两个点的最近公共祖先, 然后顺便维护边权值(每个结点到root的距离),就可以快速求出任意两个结点的距离了。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;typedef long long

2015-11-17 22:41:54 620

原创 ACM 2015 亚洲区域赛北京赛区A题(二分)

该题方法就是二分, 二分R,然后在判断函数中判断在枚举点左边的绿洲面积。  这样做的复杂度是O(nlogR)。但是一开始WA了一发,后来才发现原来是因为有这样的数据:一块很大的沙漠中只有一个边长为1的小正方形绿洲。这样的数据答案是R。  所以我二分出来之后再向右推一下,直到不符合条件为止。下面是我AC代码, 二分求的上界,求下界应该更快,请读者自己实现。细节参见代码:#includ

2015-11-16 22:42:20 1175

原创 Asia Regional Contest, Tokyo,Problem C Shopping

贪心。不难证明,如果两个区间有交集,那么最好的方法是走完这些区间的并再掉头。  也就是说,处理出所有相交的区间组成一个更大的区间,然后对于这些区间,答案要加上两倍的区间长度。  然后最后再加上整条街的长度即可。细节参见代码:#include#include#include#include#include#include#include#include#include#

2015-11-16 22:32:55 510

原创 CodeForces 483B Friends and Presents(二分+容斥定理)

该题比赛的时候没能想到用二分优化,一直超时。    其实答案是一个单调函数, 对于一个答案m,如果m不符合条件,那么小于m的都不符合,反之亦然。所以我们可以直接二分答案,然后关键是判断。    通过观察,可以发现,对于答案m,能被x除尽的个数是m/x,能被y除尽的个数是m/y。 那么可以用来给f1(朋友1)的个数就是m-m/x,用来给f2的个数就是m-m/y。但是还要注意两者都能除尽的个数是m

2015-11-14 10:02:21 662

原创 HDU 4739 Zhuge Liang's Mines(DP)

该题一开始没想出怎么暴力, 其实我们可以先预处理出来所有的可能正方形,存到一个vector里,然后用dp的思想就行了。因为最多只有20个点,所以我们可以状态压缩一下,然后状态转移就是d[S] = max(ans,dp(ss)+4);   如果当前这个正方形所组成的点完全在S中,那么ss就是S去掉这四个点后的状态,如此转移就可以了。细节参见代码:#include#include#in

2015-11-10 22:39:23 608

原创 HDU 5497 Inversion(树状数组)

树状数组好题。   我们都知道可以用树状数组求一个序列的逆序数,但是之前一直没有深刻理解为什么要用树状数组,通过该题可以知道,我们正确的思维应该是先面对一个问题,然后思考如何解决问题,然后才能对其中遇到的困难有一个深刻的认识,然后就能知道为什么需要这样解决,为什么要用树状数组。因为我们需要这样的数据结构。该题要求删去一个长度为m的连续序列后逆序数最小值。由于长度是固定的,所以由滑动窗口我们

2015-11-09 22:16:03 862

原创 HDU 4455 Substrings(递推+优化)

该题是一道极好的递推+优化的题目(有很多人喜欢把递推归为DP,其实递推不具备DP的特点)。因为对于每一个序列都要多次查询,每次查询长度为w的连续子序列中不同元素之和。  一开始确实没想到用递推,经验太少吧。  如果我们用d[i]表示长度为i的答案,那么由于子序列是连续的,所以d[i]和d[i-1]是有很大关系的。 首先很容易看出,d[i]的子序列比d[i-1]少一个,很容易发现,少了d[i-1

2015-11-09 20:45:43 560

原创 UESTC 1132 酱神赏花 (用数据结构优化DP)

该题和紫书上的一道题很相似,都是用滑动窗口来优化DP。  紫书上题目见这里:点击打开链接      该题链接:点击打开链接该题也是需要利用滑动窗口优化的。   首先我们很容易想到这样的状态表示:d[i][j]表示第i朵花展出时,酱神在位置j处时的最优解。  那么我们首先按照时间从小到大排序,这样相离两个时间差乘以速度,就可以知道每次酱神能走的位置范围,然后状态转移过去就行了d[i][j] =

2015-11-05 15:03:02 1577

原创 UESTC Pick The Sticks (背包变形)

该题是15年CCPC的D题,背包变形,昨天队内组队赛和队友搞了出来 。 各种超时,能优化的地方都搞了才勉强过,应该是姿势不太对。细节参见代码:#include#include#includeusing namespace std;typedef long long ll;const double eps = 1e-6;const int INF = 1000000000;co

2015-11-01 10:54:48 932

原创 Codeforces Round #279 (Div. 2) B. Queue(链表)

仔细观察可以发现,用链表的方法我们可以很容易的将偶数位和奇数位的答案补充完整。   只需要记录一个数的前驱和后驱就行了。细节参见代码:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#in

2015-10-31 10:54:01 705

原创 HDU 2438 Turn the corner(三分)

昨天个人赛的题目,没有做出来,今天学了一下三分,其实很简单,就是用来求一个凸函数或凹函数的最值的方法。大家可以看这个博客,讲的很清楚 :点击打开链接然后该题就是设拐的角度为自变量,范围0~pi/2 。 然后三分就行了。   这样就可以求出最大值是多少了,然后如果最值比y小,就可以过去,否则不可以。值得一提的是,队里有人用暴力过了,他将拐点设在了车的中间(l/2处),然后暴力的转角,每次

2015-10-31 10:49:48 677

原创 POJ 1651 Multiplication Puzzle(区间DP)

一道比较经典的区间DP,和这题一样:点击打开链接用dp[i][j] 表示消掉区间[i,j]内所有数字后的最优解。   那么状态转移为ans = min(ans,dp(i,k-1)+a[k]*a[i-1]*a[j+1]+dp(k+1,j)); 表示

2015-10-31 10:35:36 811

原创 HDU 1043 Eight(BFS打表+状态去重)

该题是一道经典的八数码问题,难点在于对状态的定义和判断该状态是否访问过。   紫书上列举了三种方法:set存,hash,编码解码。编码解码的原理是利用了康托展开,我们都知道,对于一个长度为n的序列,其全排列一共有n!种,利用康托展开我们可以快速的求出一个排列是按照字典序的第几个排列。这样我们就将每个排列(状态)与一个n!内的整数对应起来了。  但是这样还是会超时,无奈我想到了既然终点状态固定,

2015-10-29 14:01:58 723

原创 HDU 2181 哈密顿绕行世界问题(水DFS)

该题乍看很难的样子,其实就是个水DFS,因为要打印所有可能方案,所以无法剪枝,直接遍历所有可能情况就行。细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;cons

2015-10-28 16:11:51 740

原创 ACM竞赛常用头文件模板

哈哈#include//C的输入输出#include//字符串操作函数#include//STL各种算法 比如 swap sort merge max min 比较#include//数据输入输出流#include//c++中的string类 他不能用strcpy等c函数去操作#include#include#include//bitset可按位定义串#include

2015-10-28 16:05:51 5789 2

原创 HDU 5115 Dire Wolf(区间DP)

一道非常经典的区间DP。  一开始没有想明白状态到底该如何表示,因为杀掉一只狼会影响其他狼的攻击力,所以看起来貌似非常难以解决。 但是如果看出了是区间DP之后,就可以展开DP的常规推理了。   首先,是状态的表示,如何表示状态,这是最重要的一步。   表示出状态以后,还要看他是怎么转移的,以及转移过去的子问题是不是和原问题具有相同的结构和意义。    我们套用区间DP常规的状态表示:d[i][

2015-10-21 19:49:31 767

空空如也

空空如也

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

TA关注的人

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