分析
河渔船
成长的小垃圾
展开
-
P1113 杂务
问题的特殊性:John有需要完成的n个杂务的清单,并且这份清单是有一定顺序的,杂务k(k>1)的准备工作只可能在杂务1..k-1中。 即当前任务的杂务都是前面已经完成的,那么就可以在子杂务里找一个时间最长的,加上当前任务的时间,即完成当前任务的时间最后在所有任务里找时间最长的即为答案#include<iostream>#include<cstring>#include<cstdio>#inc原创 2017-04-09 10:33:41 · 707 阅读 · 0 评论 -
游(qbxt)
ans=2*Σw-1号点到图上其他点的最远距离#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cstdlib>#include<algorithm>#include<vector>#include<queue>#define M 50000using namespace std;原创 2017-05-17 16:08:17 · 399 阅读 · 0 评论 -
NOIP 2015[D2 T1] 跳石头
看到这个题,想到了二分答案。用二分的方法枚举最小距离x,和前面石块之间距离(变化)大于这个距离的石块就去掉,把去掉的石块数和m作比较,来变换x,最后找到答案; 但是,第一次写,没有想到如果前面的石块被去掉,那么后面的石块在判断距离时,就会受到影响,并不是一成不变的。结果只得了10 fen ; Besides,写一个正确的二分是很困难的对我来说,因为我记好的板子有时对有时错。如果有大神对二分精通,原创 2017-06-10 15:29:44 · 331 阅读 · 0 评论 -
lowbit
树状数组(lowbit) Time Limit:1000ms Memory Limit:128MB题目描述 这天,LYK在学习树状数组。 当它遇到一个叫lowbit的函数时有点懵逼。lowbit(x)的意思是将x分解成二进制,它的值就是,其中k是最小的满足(x & )>0的数。(&是二进制中的and运算) LYK甚至知道lowbit(x)=(x&-x)。但这并没什原创 2017-07-23 14:57:16 · 964 阅读 · 0 评论 -
P1092 虫食算
https://www.luogu.org/problem/show?pid=1092好一道搜索题! 一开始我自己写了一个史上最无脑的搜索,结果只得了10分,全部TLE掉。参考了题解,才发现自己的暴力搜方法不太对,我是枚举数的每一位是每一个数。。。就是好无脑,不超时才怪。参考了题解(有些题解有太多太多的剪枝,好像处理得太过繁琐,我参考的题解简单易懂),叙述一下法。 我们可以这样来搜索:我们记录每原创 2017-08-07 21:14:59 · 731 阅读 · 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 评论 -
P2327 [SCOI2005]扫雷
https://www.luogu.org/problem/show?pid=2327 对于这道题,我们如果知道了第一个位置有没有雷,就可以根据这个信息来判断下面位置有没有雷。 所以答案只有三种:0 , 1 , 2 根据第i个位置和第i-1位置有没有雷,就可以推出第i+1位置的雷的个数,如果雷的个数不是0或1, 那么这种情况就不符合。#include<iostream>#include<c原创 2017-08-08 15:18:06 · 324 阅读 · 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 评论 -
P1414 又是毕业季Ⅱ
luogu 传送门我们枚举1~maxn每个数 i ,求出它的倍数的个数cnt,那么cnt就是以 i 为最大公约数时数的个数, 那么 i 就可能作为从1~cnt 的答案,对ans取max就可以了。时间复杂度O(inf*√inf).#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algori原创 2017-08-08 21:25:57 · 321 阅读 · 0 评论 -
Codevs 1391 伊吹萃香/虫洞
Codevs 传送门 解法:因为这道题中颜色在一直变化,所以要用到一个分层图的做法。 因为颜色来回变,所以我们用0 , 1 来表示当前的时间。当时间是0时,所有点的颜色与起初一样;当时间为1 时,所有点的颜色就与起始时相反了。 用spfa来跑最短路时,交叉松弛, 我们用dis[ ][0] 来松弛dis[ ][1] , 用dis[ ][1]来松弛dis[ ][0] 。 具体处理方法在代码的注原创 2017-08-09 11:04:32 · 385 阅读 · 0 评论 -
Pyramid of Glasses 酒杯金字塔 [CF-676B]
O(n^2)的做法:一次性地将酒倒入第一个杯子,然后两层循环扫描每个杯子,把酒量超过1的杯子中的酒向左下向右下溢出。 注意要用数组double型。#include<iostream>#include<cstdio>using namespace std;double a[1005][1005];int t,n,ans;int main(){ scanf("%d%d",&n,&t原创 2017-06-14 16:18:20 · 600 阅读 · 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 评论 -
uoj 118 赴京赶考
uoj 传送门 列与行之间单独处理。 对于列之间,我们判断dis只需要看b数组就可以了。 同理对于行只看a数组就可以了。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<vector>#include<algorithm> #include<queue>#define N 200原创 2017-08-17 21:24:35 · 268 阅读 · 0 评论 -
P1134 阶乘问题
luogu 传送门这个题,用O(n)真的可以吗?大概是洛谷数据太弱了。#include<iostream>#include<algorithm>#include<cstdio>#include<cmath> #define LL long longusing namespace std;int n;LL ans=1;LL work(LL x){ while(!(x%10))原创 2017-08-11 08:46:57 · 342 阅读 · 0 评论 -
poj 1850 code
http://poj.org/problem?id=1850首先应该判断一下给出的字符串是否为升序,否则答案为0. 对于长度为L的一串,我们首先应该加上比它短的串的个数,然后再算它是长度为L的里面的第几个。 在算长度为len的串的个数的时候,因为都是升序的,特定的几个字符组成的串没有重复,所以我们可以 用组合数来算,个数为C(26,len)。 然后再算它是长度为L的串的第几个时,一位一位地算原创 2017-08-04 08:36:30 · 183 阅读 · 0 评论 -
#113. 【UER #2】手机的生产
uoj 传送门 蒟蒻做这个题是一懵一懵的啊。题意就好难懂! 我们以 || 为分界线,分成若干块。因为在每一小块中有0这一块的返回值就是0,在整个表达式中有某一块的返回值为1,那整个式子就是1,剩下的块都不用算了。 只有当手机返回值为1时才能造出手机。而且在当前这块中复制出的手机,在下一块中才能造出其他的手机。#include<iostream>#include<cstdio>#includ原创 2017-08-18 10:10:26 · 333 阅读 · 0 评论 -
HDU 6114 Chess
HDU 传送门 很显然,组合数。 输出C(n,m)就可以了。 因为询问比较多,所以用杨辉三角就可以了。#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<cmath>#define LL long long#define MOD 1000000007using namespace s原创 2017-08-18 10:58:23 · 254 阅读 · 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 评论 -
戏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 评论 -
P1979 [NOIP]华容道
luogu 传送门 搞了小半天,终于搞了出来。 以前写过一个暴力70分的做法(点这里)在70分的基础上: 注意到只有空格在指定棋子旁边才有意义,所以可以O(n^2)记录状态,记录空格在指定棋子的哪个方向。 因为询问数比较多,所以可以预处理出来【指定棋子不动,空格移动到另一边】和【棋子与空格交换位置】两种情况,以移动步数为边权,以状态为点建图。 代码中有解释#include<cstdio原创 2017-08-11 20:08:43 · 593 阅读 · 0 评论 -
P3144 [USACO16OPEN]关闭农场Closing the Farm
https://www.luogu.org/problem/show?pid=3144#sub 分析:按顺序去掉点后查询图是否还是联通的,那么我们就可以按照删除的顺序倒着加点。 在加某个点之前判断图是否是联通的,即按顺序去掉这个点后图是否是联通的。 具体的处理方法:根据输出要求,我们可以先把最后一个去掉的点加进图中;然后在倒着放入其它点 (第i个点)之前先判断当前图是否是联通的,将答案存入a原创 2017-08-04 20:41:31 · 474 阅读 · 0 评论 -
P2345 奶牛集会/P2657 低头一族
luogu 传送门 双倍经验! 树状数组题 v[i]只有当和比它小的v[j]一起运算时才对答案有贡献。 我们可以这样来处理,离线来做。将所有奶牛按照v升序排序,然后一个奶牛一个奶牛的查询,再插入。 我们要树状数组来维护一个数组cnt[i],和sum[i]表示i-lowbit(i) ~ i范围内数的个数和这些数的和。 我们查询时,记num1为前i-1头奶牛中小于x[i]的头数,nu原创 2017-08-11 15:36:53 · 309 阅读 · 0 评论 -
业务办理
仔细分析,发现要使最大不满意度最小,排队顺序应该是按照最长等待时间来排。 如果不是这样,交换任意两个人的位置,那么这两个人等待时间的最大值一定比原来大。 所以这样排的正确性显然。#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#define LL long long#define M 10000原创 2017-08-20 15:03:49 · 355 阅读 · 1 评论 -
传球接力
50%的做法:枚举每一个点,一直走到尽头,记录长度,更新答案。像这样的有n条边,n个点,每个点都有一条出边的点一定存在环。这样的图叫做 环加外向树。那么对于这道题的满分做法,先求出每颗树的叶子到树根的最长路径记为f[i],再找出环,然后每次枚举环上的点x,(环的长度len),用len-d[x]+f[to[x]]来更新答案就可以了。 求环的时候,有很多种方法,然而用dfs是超时的。 我们可以先求f原创 2017-08-20 15:21:44 · 544 阅读 · 0 评论 -
P1821 [USACO07FEB]银牛派对Silver Cow Party
https://www.luogu.org/problem/show?pid=1821大体描述一下题意:一张图,边为有向边,给出一个点 s,求其它点最大的从 x 到 s 和从 s 到 x 的最短路之和。机智的做法:我们可以跑两遍spfa,先跑出 s 到其它点的最短路,在将所有边反过来,再对 s 跑一边spfa, 那么第二遍求的就是其它点到 s 的最短路径。 是不是很机智呢 QAQ#include原创 2017-08-05 20:48:06 · 544 阅读 · 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 评论 -
捡金币
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 评论 -
保留道路
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 · 703 阅读 · 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 评论 -
P3818 小A和uim之大逃离 II
luogu 传送门bfs拓展嘛。 不过这里有一点特别之处,就是记录状态时要三维,f[i][j][0/1],代表到了(i , j)这个点是否使用过向量。 在bfs中往四面走,如果没有使用过向量,就再拓展一下使用向量的。(还是比较容易啦)#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<alg原创 2017-08-15 14:21:25 · 346 阅读 · 0 评论 -
count
这题的解法好巧妙。 我们可以通过dfs来处理一个 f 数组。f[i]表示以i为根的子树有多少个节点。 那么当我们从1到n枚举每个块的大小时(n%i==0),然后扫一遍 f 数组,f[]为 i 的倍数的个数如果等于n/i,那么就是一种成功的方案。#include<iostream>#include<cstring>#include<cstdio>#define LL long long#d原创 2017-08-22 16:22:29 · 232 阅读 · 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 评论 -
圆桌游戏
【问题描述】 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号。对1< i< n的i来说,i号的左边是i+1号,右边是i-1号。1号的右边是n号,n号的左边是1号。每一轮游戏时,主持人指定一个还坐在桌边的人(假设是i号),让他向坐在他左边的人(假设是j号)发起挑战,如果挑战成功,那么j离开圆桌,如果挑战失败,那么i离开圆桌。当圆桌边只剩下一个人时,这个人原创 2017-09-13 17:48:41 · 3377 阅读 · 0 评论 -
聚会
把直接认识的人小于d的人删去,然后染色,找最大值就可以了。 一开始删点时,将已经删过的点的临接点的du多次重复地减,导致出错。#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<cstdio>#define N 200009using namespa原创 2017-09-06 17:24:14 · 210 阅读 · 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 评论