优化
河渔船
成长的小垃圾
展开
-
BZOJ 2456mode
内存要求1M,太小了! 分析: #include<cstdio>using namespace std;int n,a,c,x;int main(){ scanf("%d",&n); while(n--) { scanf("%d",&x); if(c==0) a=x,c++; else{ i原创 2017-06-14 16:23:30 · 326 阅读 · 0 评论 -
P1120 小木棍 [数据加强版]
枚举最小长度(从max–>sum),用dfs来判断,如果能成功就可以,退出即可。 dfs中有好多高深的剪枝!! 先将长度降序排序,便于剪枝。剪枝: 判断当前的len时 1).如果在前面已经建造这一根长木棒的一部分的基础上如果这跟小木棒不能成功,那么和它长度相同的一定也不成功。 2).如果正好这跟小木棒再放上能够建成一根长木棒,而且不成功,那么当前枚举的长木棒len就一定不能成功,retur原创 2017-08-07 17:16:09 · 552 阅读 · 0 评论 -
P1092 虫食算
https://www.luogu.org/problem/show?pid=1092好一道搜索题! 一开始我自己写了一个史上最无脑的搜索,结果只得了10分,全部TLE掉。参考了题解,才发现自己的暴力搜方法不太对,我是枚举数的每一位是每一个数。。。就是好无脑,不超时才怪。参考了题解(有些题解有太多太多的剪枝,好像处理得太过繁琐,我参考的题解简单易懂),叙述一下法。 我们可以这样来搜索:我们记录每原创 2017-08-07 21:14:59 · 730 阅读 · 1 评论 -
two point
名字是zhw起的。 有这样一个问题: 解法: 利用两个指针,其中一个从前往后扫a数组,另一个从后往前扫b数组,先固定其中一个,另一个来扫 用可能成为最大值的数来更新答案。 具体看代码吧:#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;i原创 2017-07-23 18:04:54 · 362 阅读 · 0 评论 -
一道搜索好题
给定一个数S,找任意个正整数a1,a2,…,an,使得它们的和恰好等于S,且它们的倒数之和与1的差不超过10^-6。 输出任意一种方案或者输出无解。 S<=65536 解析: 事实上也是简单的搜索。 从小到大枚举每个数,加入试试看。 两个剪枝: ①当前的和加上最大的和到不了1,退出。//这个剪枝怎么写啊 ②当前的和加上最小的和都超过了1,退出。 代码:#include<iostre原创 2017-07-24 08:23:31 · 433 阅读 · 0 评论 -
select(好区间)
寻找最美的你(select) Time Limit:2000ms Memory Limit:128MB题目描述 LYK带着悲伤行走在黑暗里。寂穆的夜空没有星月的点缀,身旁的树木、房屋、万事万物连同你自己,都融于宇宙的虚无缥缈之中。黑暗,压抑、膨胀、严严实实包围整个世界,LYK害怕,彷徨,无奈。突然,眼前出现一扇窗,流漏出点点昏黄的灯光。LYK欣喜地奔去看,原来这里有n个数字,LYK深深地被它原创 2017-07-24 10:43:22 · 402 阅读 · 0 评论 -
number 90分的暴力
数字(number) Time Limit:2000ms Memory Limit:128MB题目描述 LYK定义了一个新的计算。 具体地,一开始它有两个数字a和b。 每一步,它可以将b增加1,或者将a乘上b。 也就是说(a,b)经过一次操作后可以变成(a,b+1)或者(a*b,b)。再经过一次操作可以变成(a,b+2)或者(a*(b+1),b+1)或者(a*b,b+1)或者(a*b原创 2017-07-24 10:46:53 · 261 阅读 · 0 评论 -
Codevs 2594 解药还是毒药
Codevs 传送门我们可以用二进制数来表示状态(状态压缩),1代表患病,0代表不患病。 把每一种药对人的影响分别用两个数记录下来: 对于治病,我们用0代表治病,1代表无影响,我们与当前状态做一下 and运算,就把病治好啦。 对于患病,我们用1代表患病,0代表无影响,我们与当前状态做一下或 | 运算,就把病患上啦。用bfs不断拓展,直到人的状态为一串0就可以啦。#include<iostre原创 2017-08-08 17:00:10 · 409 阅读 · 0 评论 -
P1379 八数码难题
luogu 传送门bfs,像输入一样我们用一个数来表示状态,因为不能开一个9位的数组,又因为如果数的八位确定,那么最后一位就能确定,所以我们可以开一个8位的数组来记录这个状态是否进过队。重点是将0与其它位转换,基于九宫格的特点,我们只能将0与和它相距 1 -1 3 -3 位的数字交换,下面是数位交换的原则: 1. 要得到第x位前面的部分:/10^x 2. 要得到第x位后面的部分:%10^(x-原创 2017-08-08 20:05:16 · 895 阅读 · 0 评论 -
P1197 [JSOI2008]星球大战
https://www.luogu.org/problem/show?pid=1197思路和关闭农场差不多,不过加了一些时间上的优化。 当我们加入一个点时,先假设又加入一个单独的连通块,然后再扫一下与它相连的点如果在图中但是与它不在一个联通块中,那么就将其合并,连通块个数减一。 注:并查集的题果断找祖宗。#include<iostream>#include<string>#include<c原创 2017-08-10 09:42:12 · 458 阅读 · 0 评论 -
游戏game
两人都绝顶聪明,所以一定会选让自己得分最高的。 选的时候有两种情况: 1.两个人分别选了一条边的两个端点。 2.一个人连同边和两个端点都选了。 因为最后结果是两个人的差,所以就可以将每条边的边权平摊到两个端点上(很巧妙的做法呢)。 这样做差时都满足上面两种情况(想一想)。#include<iostream>#include<cstring>#include<cstdio>#inclu原创 2017-07-26 11:18:06 · 652 阅读 · 0 评论 -
小小粉丝度度熊
HDU 传送门 开始肯定是先将区间按照 l 然后 r 升序排序。 我的做法:再合并一下区间(能合并的就合并)。 我一开始想了一种可能会超时的做法,我枚举x区间,计算从第x个区间后面的间隙开始补签,一直更新最大值,貌似真的会超时。然后我又想了用前缀和来优化一下,应该会过的。然后我获悉了一种使用队列的方法,可以做到O(n)。 我们在后面插入下一个区间时: 如果补签数m>=空隙,那么就可以入队,原创 2017-08-17 18:01:18 · 226 阅读 · 0 评论 -
序sort
分析一下我们需要找一个最大的集合,使得集合内的任一成员相互之间没有发生过争吵。 我们知道,两个人没有发生过争吵的条件是小的在前,大的在后。那么一列人不会发生争吵的条件是这是一个上升子序列。 那么题目就是要求我们用nlogn的方法求最长的上升子序列(板子题嘛)。 对于nlogn求上升子序列的算法解释与分析见我的另一篇博客导弹的拦截#include<iostream>#include<cstdi原创 2017-08-17 20:34:01 · 157 阅读 · 0 评论 -
#113. 【UER #2】手机的生产
uoj 传送门 蒟蒻做这个题是一懵一懵的啊。题意就好难懂! 我们以 || 为分界线,分成若干块。因为在每一小块中有0这一块的返回值就是0,在整个表达式中有某一块的返回值为1,那整个式子就是1,剩下的块都不用算了。 只有当手机返回值为1时才能造出手机。而且在当前这块中复制出的手机,在下一块中才能造出其他的手机。#include<iostream>#include<cstdio>#includ原创 2017-08-18 10:10:26 · 332 阅读 · 0 评论 -
P2629 好消息,坏消息
luogu 传送门 题目描述 给出一个 n 个数的序列,为 A0,A1,„„,An-1,循环移动 k 位之后,这个序列就变 成了 Ak,Ak+1,,,,An-1,A0,A1,,,,Ak-1。一种优秀的循环移动是,对于任意的 前 i(1<=i<=n)项和都满足不小于零。请给出这个序列优秀循环移动的个数。 题目有两种非常机智的做法。 第一种:吞噬算法。第一种:吞噬算法。 其实挺好理解,我们用负数原创 2017-08-11 10:44:41 · 353 阅读 · 0 评论 -
生日蛋糕
https://www.luogu.org/problem/show?pid=1731 是一道搜索题,重点在于剪枝。 具体写在代码中#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cstdio>#include<cmath>using namespace std;int n原创 2017-07-27 09:18:05 · 1292 阅读 · 0 评论 -
乒乓球
问题描述 Gob和Michael常在一起打乒乓球。他们是这样决定比赛的输赢的:比赛由若干大局组成;谁最先赢下s大局谁就获得比赛的胜利;在每一大局中,谁先得t分就获得本大局的胜利。在一次比赛中,他们只记录了比赛中的每一分是谁得的,但忘记了记录s和t。现在给出比赛的每一分的得分情况,求出所有可能的s和t。Gob保证,得分表是完整的,也就是在比赛恰好在最后一人,得到最后一分后结束。输入格式(game.i原创 2017-07-27 15:31:06 · 659 阅读 · 0 评论 -
逆序对
https://www.luogu.org/problem/show?pid=1908 做法:O(nlogn) 每次加入一个数,把当前输入进的数中比这个数大的数求和,用树状数组b来维护,b[i]表示的是 i~i+lowbit(i) *的个数和*,每输入进一个数,就把b数组更新.#include<iostream>#include<cstring>#include<cstdio>#incl原创 2017-08-03 18:00:55 · 216 阅读 · 0 评论 -
戏game
按照正解的做法,我只得了80。首先我们要明确这是一张竞赛图。 然后有一个点,在竞赛涂上如果存在环,那么就一定有三元的环。解释如下解释如下 观察一下图,看一下代码。嘻嘻 shipinjiangjie#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<vector>#include<alg原创 2017-08-17 20:51:33 · 237 阅读 · 0 评论 -
P1631 序列合并
https://www.luogu.org/problem/show?pid=1631#sub做法: 将 a 和 b 都从小到大排一遍序。 然后组成这样一个矩阵: a1+b1 , a1+b2 , a1+b3 , …… , a1+bn a2+b1 , a2+b2 , a2+b3 , ……,a2+bn a3+b1…… …… …… an+b1 , an+b2 , an+原创 2017-08-04 15:38:46 · 352 阅读 · 0 评论 -
毁灭
对图染色。但是一个个地染会超时O(n^3),显然我们要用O(n^2)的做法。 因为我们对每一行的染色是一段区间的操作,所以我们可以用差分来做。枚举弦心距(0~r,一定是0~r),求出弦长,根据圆心的坐标,可以求出这一行的左右端点,就可以对这段区间进行差分了。时间复杂度: O(n^2)。#include<iostream>#include<cstring>#include<string>#i原创 2017-08-04 16:12:42 · 192 阅读 · 0 评论 -
P1979 [NOIP]华容道
luogu 传送门 搞了小半天,终于搞了出来。 以前写过一个暴力70分的做法(点这里)在70分的基础上: 注意到只有空格在指定棋子旁边才有意义,所以可以O(n^2)记录状态,记录空格在指定棋子的哪个方向。 因为询问数比较多,所以可以预处理出来【指定棋子不动,空格移动到另一边】和【棋子与空格交换位置】两种情况,以移动步数为边权,以状态为点建图。 代码中有解释#include<cstdio原创 2017-08-11 20:08:43 · 593 阅读 · 0 评论 -
【UR #4】元旦激光炮
uoj 传送门 第一次做交互题,大概明白了是啥意思,就是写一个函数,帮助实现一个操作。 题目中有要求,调用题目中给出的可以用的函数次数越少越好,这就是优化所在。 这道题就是在三个升序数组中找所有数的第K大,我们要尽量少用题目中已给出的函数。 我们每次现在三个数组中找出第k/3大,k-=k/3,那把找出的数的所在数组的前面的数删掉,这样下去,直到k为0就好啦。这样调用的次数肯定很少,就可以拿到原创 2017-08-19 10:08:45 · 613 阅读 · 0 评论 -
电梯(lift)
问题描述(1S, 128M) 无所事事的Cinzo决定用坐电梯的方式来打发时间。他住在一个N层的房子中,最底下为1层,最高处为N层。他从他家所在的第A层出发,并决定连续坐K次电梯。 但由于迷信的缘故,B在中国被视为是不幸运的,所以整座楼并没有第B层。也是因为这个原因,如果Cinzo想从第X层出发到达第Y层,他希望Y能满足|X - Y| < |X - B|。 每次电梯到达后,Cinzo都会将电梯原创 2017-07-27 15:06:41 · 631 阅读 · 0 评论 -
传球接力
50%的做法:枚举每一个点,一直走到尽头,记录长度,更新答案。像这样的有n条边,n个点,每个点都有一条出边的点一定存在环。这样的图叫做 环加外向树。那么对于这道题的满分做法,先求出每颗树的叶子到树根的最长路径记为f[i],再找出环,然后每次枚举环上的点x,(环的长度len),用len-d[x]+f[to[x]]来更新答案就可以了。 求环的时候,有很多种方法,然而用dfs是超时的。 我们可以先求f原创 2017-08-20 15:21:44 · 542 阅读 · 0 评论 -
P1083 [NOIP 2012]借教室
https://www.luogu.org/problem/show?pid=1083#sub一开始容易想到的方法是线段树,每次修改时,如果出现负数,那么当前这个人一定不能满足了。 但是在noip里,这肯定不是正解,所以会超时那么一两个点。#include<iostream>#include<cstdio>#include<cmath>#include<stdlib.h>#define M原创 2017-08-05 15:55:50 · 212 阅读 · 0 评论 -
P2161 [SHOI2009]Booking 会场预约
https://www.luogu.org/problem/show?pid=2161题意简析:你需要写一个数据结构,维护一个时间轴,支持如下操作:1)插入1个新区间,删除所有时间轴上与它有交的区间并输出个数。2)查询当前时间轴上的区间个数。我们可以用线段树来做(借鉴了sxb大神的代码)。离线处理。用线段树存序号的最小值。 当我们倒着插入第i号区间之前,在线段树里取最小值,那么当前插入的这个区间会原创 2017-08-05 21:13:54 · 443 阅读 · 0 评论 -
捡金币
time:3s 难度:Day2 T3 长长的题面 这是一道好难的题。 正解是DP+单调队列。(蒟蒻不会啦,看了题解也迷迷糊糊) 我只写了一个裸的DP,期望值60分,意外惊喜地拿了80分,好开心。 我们枚举时间,f[t][i][j][k]表示第t秒站在(i,j),已经用了k次闪现所获得的最大金币数 转移方程见代码,还是比较容易理解的。(对于 t 我是从零开始存的)#inclu原创 2017-08-20 17:11:30 · 520 阅读 · 0 评论 -
列车调度 manage
问题描述 有N辆列车,标记为1,2,3,…,N。它们按照一定的次序进站,站台共有K个轨道,轨道遵从先进先出的原则。列车进入站台内的轨道后可以等待任意时间后出站,且所有列车不可后退。现在要使出站的顺序变为N,N-1,N-2,…,1,询问K的最小值是多少。对于30%的数据,N≤10; 对于70%的数据,N≤2000; 对于100%的数据,N≤100000。模拟一下这个过程,我们可以发现,要满足题目原创 2017-08-21 11:22:16 · 268 阅读 · 0 评论 -
P1514 引水入城
https://www.luogu.org/problem/show?pid=1514先用dfs搜索,从最上面的一行往下拓展,所有点拓展完后,扫描最后一行是否有没被染上色的,有则说明 不能满足要求; 如果没有,在用dfs,计算出最上面一行的每个点(大于等于两边的点)能拓展到的最左端和最右端,然后就转化成了区间覆盖问题。区间覆盖问题是给你几个区间,然后给你一个大区间,用尽量少的小区间来覆盖大区间。原创 2017-08-06 20:52:31 · 325 阅读 · 0 评论 -
保留道路
50%的做法: 先按照s升序排序。 从小到大枚举maxg,把g小于maxg的边全部选出来,(因为前面已经排过序了),造一棵最小生成树,更新答案。时间复杂度≈O(m*m)。 100分的做法: 按照g升序排序。 维护一个n-1条边的边集,是上一个建造的最小生成树的边集。 从前往后枚举maxg,把这条边按照s用插入排序插入到当前n-1条边的集合中。 在这样的n条边的集合中建造一颗最小生成树,原创 2017-08-21 17:52:17 · 513 阅读 · 0 评论 -
矩阵价值和
60分的做法:O(n^2) 处理出矩阵的前缀和,那么就可以O(1)地查询任意矩阵的大小,O(n^4)枚举所有矩阵,求出答案。100分的做法: 对于1号点和2号点,它们两个结合是对答案的贡献是: 2∗a[i1][j1]∗a[i2][j2]−−−①2*a[i1][j1]*a[i2][j2]---① ++ a[i1][j1]2+a[i2][j2]2−−−②a[i1][j1]^2+a[i2][j2]原创 2017-08-25 08:26:36 · 702 阅读 · 0 评论 -
K`th number
二分答案,check()用two point写#include<iostream>#include<cstdio>#include<algorithm>#define LL long long#define N 200009using namespace std;int n,m;LL k;LL a[N],b[N],num,L,R,mid;bool flag;inline int原创 2017-08-22 10:59:28 · 221 阅读 · 0 评论 -
dwarf tower
【问题描述】Vasya在玩一个叫做”Dwarf Tower”的游戏,这个游戏中有n个不同的物品, 它们的编号为1到n。现在Vasya想得到编号为1的物品。 获得一个物品有两种方式:直接购买该物品,第i件物品花费的钱为ci用两件其他物品合成所需的物品,一共有m种合成方式。请帮助Vasya用最少的钱获得编号为1的物品。【输入格式】 第一行有两个整数n,m(1<=n<=10000,0<=m<=原创 2017-08-22 11:07:51 · 234 阅读 · 0 评论 -
abcd ---多重背包
【数据规模与约定】 对于 20%的数据,N≤10,-2≤a[i]< b[i]≤2; 对于 60%的数据,N≤50, -20≤a[i]< b[i]≤20; 对于 100%的数据, N≤200,-25≤a[i]< b[i]≤25,1≤c[i]≤20,0≤d[i] ≤10000 · · · · 解法: 我一开始拿到这个题是很懵的。 · 原来是一个背包! 我们设A=Σe[i]*c[原创 2017-08-22 14:54:30 · 231 阅读 · 0 评论 -
小Y的问题
30分做法:n^4枚举边. 100分做法: 枚举每一条边,设两个端点为x,y; 我们通过组合公式来计算 Y 的个数,每一次加上C(num[x]-1)*(num[y]-1); 通过记连接一个点的边的最大值,次大值,第三大值。 加上除去枚举的边外x连接的最大的两条边,以及y连接的除去… 之后最大的边。 然后再将x和y换过来,重复一遍。重复上述操作。#include<cstdio>#incl原创 2017-08-15 21:19:12 · 516 阅读 · 0 评论 -
Dinner 点餐
二分答案。 关键在于check()的写法。20分的写法: check(x) 中O(n*n)的写法:直接枚举起点,一直往后加,一旦>x,就加一张菜单,如此枚举。60分的写法: 二分加二分。用一个前缀和来优化。 check(x)中枚举起点s,设当前这一张菜单的起点为L,那么下一个起点就是sum[L]+x的前驱,可以用upper_bound()来找,然后再把找出来的那个位置减 1 ,就是下一个起点原创 2017-08-22 18:01:06 · 297 阅读 · 0 评论 -
石子合并加强版
数据范围 对于 20%的数据,n=5 对于 60%的数据,n<=80 对于 100%的数据,n<=40060分的做法:与石子合并一样,枚举起点,终点,第一个断点,第二个断点。时间复杂度O(n^4)。100分做法: 用另一个数组f2[i][j]来优化,f2[][]是合并两堆最小(不过要用f[][]来更新),就可以降到O(n^4)。#include<iostream>#include<cstr原创 2017-08-23 11:30:19 · 390 阅读 · 0 评论 -
花(cnm加强)
【问题描述】 商店里出售n种不同品种的花。为了装饰桌面,你打算买m支花回家。你觉得放两支一样的花很难看,因此每种品种的花最多买1支。求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值。【输入格式】 一行3个整数n,m,p,意义如题所述。【输出格式】 一个整数,表示买花的方案数。 【输入输出样例1】 4 2 5 1 【输入输出样例1说明】 用数字1,2,3,4来原创 2017-09-13 16:13:27 · 372 阅读 · 0 评论 -
na 斐波那契数列f(f(n))
题目描述: 给出T个n,求斐波那契数列的f(f(n)).(答案取模1e9+7) 数据范围: 100% 1<=n<=10100数据好大,那么这题一定有规律。 首先先要了解一个关于斐波切数列的性质,即斐波那契数列 ( 取模 ) 的周期性。 解释一下:就是斐波那契数列对于Mod取模后构成的数列,具有周期性。对于这道题,我们就可以利用斐波那契数列的这个性质。 f(f(n)),最后要对MOD=1e原创 2017-09-24 17:04:53 · 1755 阅读 · 0 评论