自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 莫队算法学习报告

一直听说这个神奇的“据说能解决所有区间问题的算法”,今天学习了一下,可能我只做了几个模板题,觉得不是很难。 我觉得这个写的挺好的:点我 莫队算法说起来也是暴力,只不过利用了分块的思想优雅的把n^2变成了n^1.5,太强了,orz。 用一个小栗子解释一下分块的思想: 有一栋楼有100层高,给你两个鸡蛋,让你最快的找出来鸡蛋在那层楼会摔碎(当然是要找第一个能摔碎的楼层,也就是要找一个k,满足鸡

2017-09-03 21:07:59 516 1

原创 HDU 5877 Weak Pair

题意:问一棵树中有多少序数对 < u , v >满足,u是v的祖先节点,并且这两个节点的值相乘小于或等于k。 分析:感觉这个思路还是很妙的。考虑深搜的过程,当搜到一个节点的时候,所有经过的点都是它的祖先节点。所以就可以每搜到一个点就计算经过的点中有多少个点满足和它相乘<=k。这一步可以用树状数组来计算。然后再把这个点加入树状数组。#include<cstdio>#include<algorit

2017-08-27 15:15:48 280

原创 51nod1441 士兵的数字游戏

对于一个数,可以玩的轮数就是它质因子的个数。先预处理出来5e6以内所有数的质因子数,因为给出的是a!/b!的形式,两个数乘除就相当于质因子数的加减,所以可以求一下前缀和。#include<stdio.h>using namespace std;struct p{ int k, tot; } a[5000100];int f[5000100];int s[5000100]; int m

2017-08-25 16:17:12 272

原创 hdu 6170 Two strings

题意:给你两个字符串,第一个是普通的字符串,第二个中含有“点”和 “星”,“点”可以匹配任意一个字符,“星”可以让它前面的字符出现若干次。问你两个字符能不能匹配。 分析:我是用dp 写的,类似于最长公共子序列。状态开了三维,其实开两维就可以。f[i][j][k] 表示 第一个字符的前i个字符和第二个字符串的前j个字符匹配。k = 0 表示 字符和字符匹配,k = 1表示点和字符匹配,k = 3表

2017-08-22 17:32:36 916

原创 HDU-6156 Palindrome Function

题意:定义函数f(n, k): 当n在k进制下为回文串时,f(n, k) = k; 否则 f(n, k) = 1; 给你一个区间 [L, R].对于区间的每一个数i, 计算 j 属于 l 到 r 进制的f(i,j) 的和。分析:因为进制的区间很小,我们可以枚举每一个进制k,计算[L, R]在k进制下有多少回文数。然后结果就是区间长度减去回文串数(这些事函数值为1 的部分)加上回

2017-08-20 20:34:17 422

原创 POJ 3252 Round Numbers

题意:计算区间 l 到 r 中的 round number 数,round number 定义为二进制形式下0的个数不少于1的个数的数。 分析:我开的状态比较麻烦f[i][j][k][l] i 表示i位,j表示是0多还是1多,k表示多多少,l表示有没有前导零。#include<cstdio>#include<cstring>using namespace std;typedef long lo

2017-08-20 17:09:56 191

原创 HDU 4734 F(x)

数位dp水题。#include<cstdio>#include<cstring>using namespace std;typedef long long ll;ll a, b, fa = 0, p = 1, ans;ll dp[12][10000];ll s[12], w[20] = {1};ll dfs(int pos, ll pre, int lim){ if(pos < 1

2017-08-20 15:37:06 204

原创 HDU 6143 Killer Names

题意:每个人的名字由两部分组成,每部分的长度是n,给你m种字符,最多能构成多少个人的名字。 分析:就是一个组合数。如果n个长度用x个字符表达,那就相当于n个不同小球放在x个不同的小球。设其结果为f(x),那么f(x) = x ^ n - C(x, 1) * f(x - 1) - C(x, 2) * f(x - 2) …… - C(x, x - 1) * f(1). 然后就枚举两边各用了多少种字符

2017-08-17 18:21:58 714 2

原创 HDU 6129 Just do it

题意:给你一个序列,让你求n次前缀异或之后的最终序列。 分析:很菜,不知道怎么搞,标程也没看懂,不过看了这篇博客之后才明白怎么搞了。 for(int i = 1; i <= n; i++){ ll nn = m + i - 2, mm = i - 1; if((nn & mm) == mm){ for(i

2017-08-16 16:49:44 375 4

原创 HDU 6121 Build a tree

题意:给你一个n个节点的k叉树,每个节点的值为以其为根节点的子树的节点数。问所有节点的异或值是多少。 分析:算是模拟吧,就从下递推到上面就行。除了最后一层外,每层的节点最多有三种,第一种是以这个节点为根的子树是一颗满k叉树;第二种是不满的k叉树,这种在每一层最多只有一个;第三种是也是满k叉树,但是会比第一种少一层。边推边异或就好了 。#include<cstdio>using namespace

2017-08-16 14:40:50 466

原创 51nod1288 汽油补给

这不是就noip旅行家的预算吗。只不过这个每公里消耗一升油,感觉更简单了些。 贪心,每次找一个点后面第一油价比它低的点,想办法到那里让油全部用完。找它后面第一个比它价格低的点可以用单调栈处理。#include<stdio.h>#include<stack>#include<iostream>using namespace std;typedef unsigned long long ll;

2017-08-12 13:05:34 368

原创 hdu 6044 Limited Permutation

题意:给你n个限制,让你求长度为n的排列列有多少种。每个限制描述为,从li 到 ri这段区间,ai为最小值。分析:对于一个描述为[1,n] 的限制,它所对应的位置一定是1到n的最小值也就是1,那么这个位置就把区间分成了两份。假设这个位置左边有k个,然后从剩下的n-1个数中选出k个放在左边,都是符合题意的。然后把两个小区间做同样的处理。就得到了答案。#include <cstdio>#include

2017-08-11 14:41:22 241

原创 HDU 6105 Gameia(2017多校第6场1010)

题意:给出一颗树,Alice 和 Bob 轮流给树节点染色。Alice将没有被染色的节点染成白色,Bob染成黑色,并且Bob染色的时候会把所有跟他选定的节点相连的节点染成黑色。如果树上的节点都被染色了,那么游戏就结束。结束的时候如果还有白色,Alice就获胜,否则Bob获胜。分析: 首先当有一条长度大于等于3的链的时候,Alice一定可以获胜。可以找出来3 和 4 的时候这个结论是成立的。(3的时

2017-08-10 18:13:29 271 1

原创 hdu6060 RXD and dividing

题意:将节点2到n分成k部分,然后对于每一部分都加上1号节点。在原图中选取一些边,让这一部分内部联通。问怎么分能使花费最大。 分析:如果一个点的子节点被分成各个部分,那么从它走到1号节点的部分就会走k遍,所以尽量让一个节点的子节点分成更多的部分。#include<cstdio>#include<queue>#include<cstring>#include<algorithm>#inclu

2017-08-09 20:20:25 166

原创 hdu 6058 Kanade's sum

题意:给你一个一个数列。问1到n所有子区间中第k大值得和是多少。 分析:可以美枚举每一个数,计算它可以做多少次第k大值。因为k很小,所以可以枚举一个数,找到它前面第k个比它大的数和后面第k个比它大的数,然后计算。找的时候可以用单调栈维护。#include<cstdio>#include<stack>#include<cstring>using namespace std;typedef lo

2017-08-09 19:25:58 160

原创 hdu 6073 Matching In Multiplication

题意:给出一个“二分图”,左边顶点的数目和右边相同,求这个二分图所有完美匹配的权值和。题目保证至少有一组完美匹配。 分析:如果图中存在度数为1的点,那么与这个点匹配的点就是确定的。用拓扑排序去除这些点之后,图中留下的一定是一个环,那么每隔一条边取一条就能构成完美匹配。#include<cstdio>#include<vector>#include<queue>#include<cstring

2017-08-09 18:56:18 215

原创 hdu 6092 Rikka with Subset

自己还是好菜啊。没想到背包。#include<cstdio>#include<cstring>using namespace std;const int maxn = 1e5;typedef long long ll;ll a[maxn];ll f[maxn];ll c[maxn];int main(){ ll T, n, m; scanf("%lld", &T);

2017-08-09 11:44:02 246

原创 1293 球与切换器

很明显从右下角的盒子下面出去的球的个数只与最后一列最下面那个切换器有关。我们可以把每一个切换器看作一个节点。每个节点向它的子节点输送它自身一半的球(如果是奇数个要判断哪个子节点得到的更多)。遍历一遍就能得到结果 遍历是n^2的,所以我们需要o(1) 找它的父节点,否则会超时。 具体看代码吧#include<stdio.h>using namespace std;typedef long lon

2017-08-07 19:12:17 242

原创 51nod1420 数袋鼠好有趣

排序后二分#include<cstdio>#include<algorithm>#include<queue>using namespace std;const int maxn = 1e6 + 50;int a[maxn];int s = 0;int maxi = 0;int n;int judge(int k){ for(int i = 1, j = k + 1; i <=

2017-08-04 16:14:32 222

原创 51nod1076 2条不相交的路径

在环路上的两点一定可以,否则就不行。 用tarjan算法就可以解决#include<cstdio>#include<vector>#include<algorithm>#include<stack>using namespace std;const int maxn = 50500;vector<int> a[maxn];int dfn[maxn];int low[maxn];in

2017-08-04 15:10:43 229

原创 51nod 1205 流水线调度

这个题排个序就好了。就是如果A排在B前面更优就把A放在前面,否则把B放在前面#include<cstdio>#include<algorithm>using namespace std;const int maxn = 1e5;struct p{ int a, b;}a[maxn];int cmp(p a, p b){ return a.a + max(a.b, b.a) +

2017-07-31 16:21:35 351

原创 51nod 1179 最大的最大公约数

这个题也很棒的。虽然最后发现只是个枚举的题目,但是判定的方式很棒,有点像多校那天的容斥。 思路就是从大到小枚举一个数,判定这个数是不是两个数的最大公约数。 判定的时候只枚举这个数的倍数,所以是logn的复杂度吧。再加上枚举是nlogn的#include<cstdio>#include<map>using namespace std;const int maxn = 1e5;map<int,

2017-07-31 15:02:18 213

原创 51nod 1191 消灭兔子(优先队列好题)

一开始的想法是用二分图贪心来做,结果T了。然后想了想,可以用优先队列来做。 先按兔子的血量从小到大排序,同时箭的伤害从小到大排序。枚举每一只兔子i,找出第一支能杀死它的箭,从这支箭往前到第一支能杀死第i-1兔子的箭都能杀死前i-1只兔子。把这些放入优先队列,去前i-1小的值。再把这只箭放入优先队列。#include<cstdio>#include<vector>#include<algorit

2017-07-31 14:49:58 300

原创 51nod 1154 回文串划分

想了好久,突然看到了话题是动态规划,就明白了。 先n^2预处理出来以每个字符结尾的回文串。然后动规,对于每一个字符,要么自成一家,要么接在前面的字符上。#include<cstdio>#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;string s;vect

2017-07-31 13:12:42 278

原创 51nod 1153 选择子序列 (好题)

这个题很不错。 采用贪心的思想:首先考虑到在整个序列中取最大值一定是最优的,也就是说B数组的第一个数是A数组的中最大值的下标。而且通过题意我们发现,一旦选定了某个数就把当前的区间划分成两份。比如说第一次选了9,第二次选了10, 那么下一次肯定不会选8(这几个数字说的都是下标),不会垮区间选数,那么我们就可以每次选一个区间最大值,再把区间划分成两份分别查找最大值就可以了。因为每个元素最多访问一遍,再

2017-07-30 11:20:01 491

原创 51nod 1109 01组成的N的倍数

这个题我是用广搜做的,话题里面的抽屉原理没有想到怎么做。 搜索的时候节点记录两个值,一个是余数,一个是节点的编号,因为这是一颗二叉树,节点编号的二进制形式,刚好是我们需要的结果。对于余数,还要开一个数组去重。#include<cstdio>#include<queue>#include<iostream>using namespace std;const int maxn = 1e6 + 5

2017-07-30 09:40:28 210

原创 51nod1110 距离之和最小 V3

据说可以每个把每个点的权值看作在这位置上有几个点,但我的想法比较简单粗暴:每向右一步就把减去其右边的点的权值和,加上左边所有点的权值和#include<cstdio>#include<iostream>using namespace std;typedef long long ll;const int maxn = 3e5 + 10;ll a[maxn];ll n, m, sum, sub

2017-07-29 16:45:23 280

原创 51nod1108 距离之和最小 V2

我们写一下就可以发现: 假设符合要求的点的坐标为(x, y, z); 那么ans = |x - x1| + |y - y1| + |z - z1| + |x - x1| + |y - y2| + |z - z2|…… 由于求的是曼哈顿距离,x 和 y z坐标之间没有相互制约关系,所以让x y z 分别为xi yi zi(i = 1 2 3 ……)的中间点就好了#include<cstdio>#

2017-07-29 16:14:38 297

原创 51nod 1107 斜率小于0的连线数量

按x坐标排序,求y坐标的逆序对 归并排序求逆序对:#include<cstdio>#include<algorithm>using namespace std;const int maxn = 1e5 + 5;struct p{ int x, y;} a[maxn];int b[maxn];long long ans = 0;int cmp(p a, p b){ retu

2017-07-29 15:00:44 246

原创 51nod 1105 第K大的数

二分法。 二分套二分。很好玩的一个题目。 把两个数组排序 先二分结果,再去判断这个结果是不是第k大。判断时候枚举a数组里面的值,二分查找b数组里面最小可以和当前枚举的a数组里面的值相乘大于第一层二分的结果,比如说a[i] * b[j] > k(二分的结果), 那么j后面的所有数都和a[i]相乘都比k大,最后统计一下有多少个比k大#include<cstdio>#include<algorit

2017-07-29 14:37:06 189

原创 51nod 1070 Bash游戏 V4

博弈论修改 隐藏话题1070 Bash游戏 V4基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量最少1个,最多不超过对手上一次拿的数量的2倍(A第1次拿时要求不能全拿走)。拿到最后1颗石子的人获胜。

2017-07-28 20:28:16 242

原创 51nod 1060 最复杂的数

1060 最复杂的数题目来源: Ural 1748基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6。如果有多个数复杂

2017-07-28 19:40:00 238

原创 51nod 1051 最大子矩阵和

动态规划修改 隐藏话题1051 最大子矩阵和基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。例如:3*3的矩阵:-1 3 -12 -1 3

2017-07-28 19:32:48 252

原创 qduoj 树结构重逢 (两遍深搜)

描述 给定一颗包含n个节点的无根树,并且把节点从1-n编号。现在让你求对于每个点,求出所有点到这个点的距离的和(距离当然是最短距离了..)。输入 第一行包含一个正整数n ( n <= 100000 ),表示节点的个数。 后面(n - 1)行,每行两个整数(u, v)表示树的边u-v。输出 每行一个整数,第i(i = 1,2,…n)行表示所有节点到第i个点的距离之和。(i到i节点的距离为0)样

2017-07-26 16:46:28 428

原创 2017多校第一场1006 function(HDU6038)

题意: 给你一个a序列,代表1到n的排列;一个b序列代表1到m的排列。问你可以找出多少种函数关系,满足f(i)=b[f(a[i])]; 分析:这个主要是找循环节 比如说:如果 a 序列是 2 0 1 那么我们可以发现 f(0) = b[f(a[0])] = b[f(2)] f[1] = b[f(a[1])] = b[f(0)] f[2] = b[f(a[2])] = b[f(1

2017-07-25 17:55:02 1874

原创 LightOJ 1038 Race to 1 Again(概率期望)

题意:给你一个数n,不断的除以它的约数,最终变成1。问变成1的步数的期望是多少。注意:n可以除1变成n。 分析:首先2的期望为什么是2,我想了好久都没想明白,最后虽然算出来了,但我依然不知道为什么是2. 计算的思路和 LightOJ 1027 类似。假设 2 的期望是d,那么 d = 1/2 * 1(1 是 从2直接变为1 的步数的期望) + 1/2 * (d + 1)(从2变成2再变成1 的

2017-07-23 13:25:02 333

原创 LightOJ - 1027 A Dangerous Maze(概率期望)

题意:你在一个迷宫里,面前有n个门,一些门可以让你在x秒后出迷宫,另一些会让你在x秒后返回这个地方,一旦你返回这个地方你的记忆就会全部消失,也就是说一切重新开始。问你从迷宫走出去的期望时间是多少。 分析:假设能出去的期望是d,因为你每次回来,记忆全部消失,所以无论你第多少次走回这里,当前来说,能出去的期望时间都是d,那么,对于第三个样例,我们可以得到一个公式d = 1/3 * 3 + 1/3 *

2017-07-23 13:02:32 317

原创 LightOJ 1030 Discovering Gold(期望)

题意:唔……这是适合男女独处一室时玩的……紧张又刺激的飞行棋。就是飞行棋的规则,n个点,一个六面的骰子,一开始在1这个位置,每个位置都有一个价值,问你走到最后一个点取得的价值的期望是多少。 分析:我们可以算出来走每个位置的概率,用这个位置的价值乘以概率,加起来就是期望了。对于一每个点,都可以从在他前面和它的距离<= 6的点转移过来,但是要考虑到,最后面几个点在转移的时候不是乘1/6。#includ

2017-07-23 10:48:08 302

原创 HDU - 4547 倍增法求最近公共祖先(LCA)

倍增法求LCA的一般步骤:1.建树,确定深度和父子关系。2求出递推数组;即:f[i][j] 表示 i 节点的第 2 ^ j 倍祖先,可知f[i][j] = f[f[i][j - 1]][j - 1];3.对于读入的每对查询进行操作:  .调平,即将两个点调整到同一深度,也就是让深度较大的点跳到和另一个点同一深度的祖先。.j 从零开始 只要 两个点的2 ^ j 祖先不相等,j

2017-07-18 10:12:32 396

原创 codeforces#419 B q

题意:给你n个区间,然后给出m个查询区间,对于每次询问,输出这个区间里多少个点被不少于k个区间覆盖解析:求两次前缀和就好了#include#include#includeusing namespace std;int a[300000];int s[300000];int p[300000];int main(){ int n, m, k; while(~scanf(

2017-06-18 23:53:21 365

空空如也

空空如也

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

TA关注的人

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