
ACM_技巧
羁绊残阳
四川大学计算机科学与技术
展开
-
Codeforces Round #274 (Div. 2) d Long Jumps 尺取法 + set
题意:给一个长度为l(l < 10910^9)的尺子,上面有n(n < 10510^5)个已经存在的刻度标记,给定两个长度x和y,问你至少要添加哪些标记才能度量出x和y? 分析:显然最坏的情况是上面的刻度既不能度量出x也不能度量出y,这里应该先判断一下能否出x和y,如果都能就直接输出0,只有x就直接输出y,只有y就直接输出x.如果都没有进一步讨论了. 开始想得是对于每一个已经存在的刻度i,分别考原创 2015-08-17 20:29:45 · 628 阅读 · 0 评论 -
hihocoder #1095 二分
注意这里有一个坑点就是上界应该设置为k+1k+1,而不是kk。 因为当掷骰子的结果全是kk的时候,每次加kk也会输。 二分闭区间模板写法: //这个值越大越能满足,(最小化最大值) int l = mins, r = maxs; while (l < r) { int mid = l + (r - l) / 2; if (judge(mid)) r =原创 2016-06-14 20:46:05 · 237 阅读 · 0 评论 -
SCU2016-05 G题双重二分
Analyse: 先二分中位数,然后用二分去判断这个中位数是不是可以成立,双重二分。/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 三 7/13 17:17:20 2016**Problem**:**Get**:**C原创 2016-07-14 08:09:13 · 360 阅读 · 0 评论 -
hdu 5745 dp+bitset优化
分析: 这题实际上是一个dp[105][103][3]dp[10^5][10^3][3]的空间和时间优化,由于其是一个bool的形式,我们可以让第一维存在bitset中,第二维滚动数组实现,来优化空间。至于时间就是bitset进行逻辑运算是按照字节来的常数优化了很多。#include <cstdio>#include <cstring>#include <iostream>#include原创 2016-07-26 11:21:28 · 664 阅读 · 0 评论 -
SCU2016-01 K找规律
Analyse: 很明显这个题是固定的,所以需要预先打表。 Get: 找规律递推就可以了。/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 一 7/ 4 13:59:02 2016**Problem**:**Code原创 2016-07-05 22:04:19 · 334 阅读 · 0 评论 -
SCU2016-02 K 双指针
Analyse: 最小满足某种条件的最小区间,典型双指针应用.Get: 双指针的模板写法,最外层循环不是右边界小于n,而是true因为之后还可能有更优的出现,里面先更新右边界,然后取值,然后更新左边界。/**********************jibancanyang************************** *Author* :jibancanyang *Cre原创 2016-07-07 00:06:07 · 349 阅读 · 0 评论 -
hdu 5734 LIS变形
分析: 一个数前面有多少个零,就用它来减去这些零数,这样做的目的是尽量多选0,但是压缩当前值.对于两个数,他们的差距减小了,它们之间的0的个数,这不影响先后的值. 去掉所有的零后,再对当前序列求LIS,最后再加上0的个数. 总得来说,这种策略让所有的0的被用到了.#include <iostream>#include <algorithm>#include <cstdio>#includ原创 2016-07-30 15:21:16 · 288 阅读 · 0 评论 -
hdu 5785 manacher回文处理 + 扫描线
分析:首先考虑遍历所有的两头的i,ki,k,然后去找他们中间的一个点cc,让这个点把str[i...k]str[i...k]且成两段回文串。 这样是可行的,但是复杂度枚举两头已经是O(n2)O(n^2)了。然后考虑换一个思路,枚举所有的中间的隔代cc,然后以cc为隔代的满足条件的所有回文串的两头。 这样发现,用所有以cc左边元素为结尾的回文串的左边界和乘以以cc右边元素为开始的所有回文串的右原创 2016-08-04 11:05:56 · 428 阅读 · 0 评论 -
hdu5787 数位dp 数位压缩
分析: 大概是比较经典的数位dp,需要维护连续的kk个数字不相同,所以我们的状态记录里需要记录前k−1k-1个数字是哪些,扩展下一位的时候不能出现前k−1k-1位的数字。 这样就来设计状态:dp[len][k][ban]dp[len][k][ban],表示前长度为lenlen,连续的kk个字符禁止出现相同,前k−1k-1个数字为banban。 这里的banban用了数字压缩的技巧,比如前33个原创 2016-08-03 12:47:14 · 605 阅读 · 1 评论 -
SCU2016-02 I题 (反转技巧)
分析:挑战上的精选技巧。 由于区间翻转具有以下性质: - 一个区间要么翻转一次要么不翻转 - 最左边的必须翻转 如此递推。。。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " <<原创 2016-09-10 16:18:06 · 263 阅读 · 0 评论 -
SCU2016-02 J题 (开关反转)
分析:先确保最左上角的正确,然后确保第一行,最后一次递推接下来的行。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout <<原创 2016-09-10 16:23:44 · 295 阅读 · 0 评论 -
poj 3276 开关反转
分析:通过性质分析,把本来很复杂的问题简化了。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout << #x << ": "原创 2016-09-14 00:14:23 · 415 阅读 · 0 评论 -
hdu 5884 二分 + 前k优化
分析:大多数人都可以直接想到二分, 然后用优先队列维护每次取前kk大的合并。 但是这样复杂度多了一个lognlogn会TLE。这里想到一个很好的性质,就是合并之后的数,一定比之前合并的数大,所有就把合并之后的数加入一个队列。对原数组也排序处理,这样就得到了两个有序数组,每次在头尾取前kk大即可。#include <cstdio>#include <cstring>#include <iostr原创 2016-09-18 11:26:14 · 416 阅读 · 0 评论 -
SCU2016-02 G题 (技巧)
分析:蚂蚁相撞的时候位置可以看做互相通过。 所有蚂蚁的相对位置不变。 初始位置排序,计算出T时间之后初始位置处于的位置和运动方向。 根据原来的相对位置套进去,位置和方向皆得到。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(原创 2016-09-05 20:57:59 · 285 阅读 · 0 评论 -
SCU2016-05 F题二分最大化平均值
Problem: 最大化平均值,限制是选k个物品。 Analyse: 平均值的式子具有特殊性很容易去贪心地判断平均值是否大于一个数。 复杂度n∗logn∗log1012n *log^n *log^{10^{12}} Get: 这题很容易去想dp,但是显然复杂度太高。看数据范围应该是nlognnlogn这样的算法。/**********************jibancanyang***原创 2016-07-13 15:58:45 · 280 阅读 · 0 评论 -
SCU2016-05 E题二分
Analyse: 就是二分+贪心判断,强行加eps不要。。/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 三 7/13 09:56:34 2016**Problem**:**Get**:**Code**:******原创 2016-07-13 10:18:31 · 287 阅读 · 0 评论 -
hdu5727 枚举排列 + 二分图匹配
可以先枚举阴珠子的排列,因为是环,所以起点无所谓,最多8!8!然后再让阳珠子去插空,对于不损坏的建立边,求最大匹配就是了。 这里二分图最大匹配的无向图,两边的节点编号不是一样的,竟然搞混淆了。。。 这样复杂度是O(n!∗n∗n2)O(n!*n*n^2)#include <cstdio>#include <ctime>#include <set>#include <iostream>#原创 2016-07-23 16:25:04 · 354 阅读 · 0 评论 -
Codeforces 479D Long Jumps (set + 迟取法)
@(K ACMer) by 题解工厂题意:给你一个已有刻度的尺子,求要量出x,y两个长度,最少需要添加多少个刻度.分析:显然如果存在的刻度已经可以量出x和y就直接输出0. 这里判断尺子的刻度是否能量出x(y),是非常典型的尺取法,O(n)的时间内解决.然后就要判断能否只用一个刻度就可以?这里去暴力的搜索是很超时的方法,正确的是用map去查是否直接由目标值….做的时候没有多想能否继续降低复杂度就原创 2015-09-09 22:20:56 · 427 阅读 · 0 评论 -
Codeforces 460C Present (贪心 + 二分)
@(K ACMer) by 题解工厂 [TOC]题意:有一排花,你有m次浇花的机会,每次浇花的范围是w,且浇一次,花长高一个单位.问m次浇花之后,最矮的花,高度最大为多少.分析:这题是比较典型的最大化最小值问题,如果直接去求最后的最小最大高度是多少,是决没有一点可行法的. 这类问题的解决办法就是对最小值进行二分 ,对可行性进行贪心, 这里二分的思想很容易理解,主要是说明贪心的正确性.根据二分函原创 2015-09-08 11:43:04 · 838 阅读 · 0 评论 -
poj 2456 Aggressive cows (二分+贪心) (最大化最小值)
@(K ACMer) by 题解工厂题意:给n个数,让你选择其中m个数,让相邻数的最小值最大.(即最大化最小值问题).分析:典型的贪心 + 二分组合.注意这个组合的出现,对于不容易直接得出结果的问题,二分的查找结果,贪心得验证结果是标配!Code:#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>原创 2015-09-15 22:21:44 · 523 阅读 · 0 评论 -
poj 3111 Status List (二分 + 贪心 最大化平均值)
@(K ACMer) by 题解工厂题意:有n个东西,每个东西的价值为x重量为y,从中选取k个东西,求价值重量比得最大值t.分析:典型的最大化平均值问题.如果不仔细思考容易按照贪心的思想去做,贪心是简单但是要基本确定他是对的再做!这里贪心就不对. 要满足:∑x / ∑y>=t\sum x \ / \ \sum y >= t 有:∑x−y∗t>=0\sum{x - y * t} >= 0 这里在原创 2015-09-16 00:54:50 · 482 阅读 · 0 评论 -
poj 3320 Jessica's Reading(尺取法 + Hash) Problem
[TOC] @(K ACMer) by 题解工厂题意: 给你一个数x,问他最少是由多少个细菌分裂而来的.分析: 尺取法 + 其中要记录种类用map来类Hash维护. 那么问题来了,为什么这个可以想到用尺取法呢? 其核心原因是,区间的长度越大,所覆盖的页数要么增加要么不变.所以区间越大越容易满足要求,然而我们要求的就是这个满足要求的最小的区间只需要一旦区间内元素满足了,就增加尺子头以减小区间原创 2015-09-18 17:37:53 · 367 阅读 · 0 评论 -
Leetcode 4.Median of Two Sorted Arrays(递归截断)
题意:给两个已经排序的数组,求它们合并后的中位数,要求复杂度是O(log(n+m))O(log(n + m)). 分析: - 首先很容易想到利用归并排序合并两个数组的方法来合并这两个有序数组,时间复杂度是O(n)O(n) - 然后继续想可以以第一个数组为基准,来进行二分.一旦第一个数组中的元素选定,由于中位数就是中间的数字,那么第二个数组中数的对应位置也就确定了.二分第一个数组的位置,然后判断原创 2016-03-17 17:58:14 · 292 阅读 · 0 评论 -
Codeforces E. Bear and Contribution(枚举维护)
@(E ACMer)题意:有n个人都有自己的初始成就值,对每个人可以有发博客(成就+5)和评论(成就+1).两种操作各自的花费时间分别为b和c.要求任意对任意人操纵,让最终至少有k个人有相同的成就值. 分析: 首先分两种情况讨论,如果(c∗5<=b)(c * 5 <= b),那么b操作就没有存在价值,需要执行A操作.排序之后,肯定是连续的k个(贪心一下容易理解),维护固定k长度的和即可求原创 2016-03-29 23:43:23 · 638 阅读 · 0 评论 -
hdu 5643 (约瑟夫环加强版)
@(E ACMer)一循环链表暴力打表法二递归实现约瑟夫环一.循环链表暴力打表法:在比赛中竟然没有调试正确,把函数里面分配的局部变量来作为链表的内容了显然函数一结束这块内存就被回收了.code:#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stac原创 2016-03-13 18:15:34 · 524 阅读 · 0 评论 -
hdu1029 技巧
/************************************** *Author :jibancanyang *Created Time : 二 4/ 5 22:00:39 2016 *题目类型:很好的利用了过半的特性,记录当前最大频率数和他的频率. ***************************************/include incl原创 2016-04-07 09:59:52 · 256 阅读 · 0 评论 -
Codeforces Round #352 (Div. 2) D 二分贪心两头 + 细节
Problem: Analyse: - 好的思维就是把左右端点分开来考虑. - 显然对左端点和右端点,都来二分答案贪心判断的求解,找到k步操作它们各自能到达的位置. - 有一个细节就是k很大的时候,左右端点会交叉,这时候我们就要判断在相交点是否可以差值为0了…./**********************jibancanyang************************** *Au原创 2016-05-12 14:56:47 · 332 阅读 · 0 评论 -
cf670d2 二分贪心
Problem: cf670d2 Analyse: 经典的二分加贪心模型,我太高估了暴力的复杂度了…. 先考虑最坏情况,就是只缺一个物品,而且这个物品缺1e9个,这里面明显需要一个logklogk的算法, 二分答案,然后贪心地去判断,最后要消耗小于k,贪心就满足,注意这里会爆ll,要提前跳出判断函数. 复杂度nlogknlogk.二分闭区间的模板化写法:int l = 0, r = INF原创 2016-05-06 14:14:20 · 522 阅读 · 0 评论 -
Codeforces Round #353 (Div. 2) C 思维
Problem: 给你一个数列,本身是一个环且和为0,每次可以执行一个操作就是相邻的成员之间传递值, 问让该环所有成员的值都变为0,需要执行最少多少次操作?Analyse: 可以转化为求环中最多和为0的块的个数. 然后因为没一个块的和都为0,所以在两个相邻的和为0的块之间该数列的前缀和是相同的,我们要求最多的块数, 只需要求最大的相同前缀和的频率即可 Get:原创 2016-05-18 00:01:25 · 339 阅读 · 0 评论 -
Codeforces Round #354 (Div. 2) D
题意: 给你nn个数,用这nn个数来建立二叉搜索树,问你每次插入一个数时,它的父亲节点是哪一个? 分析: 首先要注意本题的nn个数都是不同的。 容易观察到每次插入节点时,它的父亲节点要么是比它大的数中,距它最近的节点rr的左儿子,要么是比它小的数中距离它最近的节点ll的右儿子。 这里的主要问题是到底是rr和ll哪一个的儿子? 首先我们应该知道这rr和ll一定是相互连接的,因为假设它们不相原创 2016-05-23 21:16:27 · 391 阅读 · 0 评论 -
Codeforces Round #371 (Div. 2) E. Sonya and Problem Wihtout a Legend(技巧 + 离散化dp)
分析:首先,如果只是改变成非严格递增子序列,我们可以用离散化dp来做。 dp[i][j]dp[i][j]表示:前ii个数,第ii个数以原序列中第jj大的数结尾的最小花费。转移的时候维护一个前缀最小值,就可以实现O(1)O(1)转移,O(n2)O(n^2)状态的dp。 但是这里是严格单调递增。我们看看序列严格单调递增的充要条件:对于任意Ai−Aj≥i−j对于任意A_i-A_j \ge i - j原创 2016-09-18 20:49:44 · 489 阅读 · 0 评论