- 博客(246)
- 资源 (46)
- 收藏
- 关注
原创 我的Hexo使用实践(二)
一 设置主题下载NexT使用NexT二 配置信息同步建立hexo分支恢复配置将Blog成功搭到Github后就要考虑一些配置问题了,需要更加美观的主题,换了电脑或者重装系统后还需要快速的从以前的配置恢复,下面就解决这些问题。一. 设置主题Hexo官网就提供了很多主题,我是用的是NexT主题,简单大方且不失美观,以下以NexT主题为例,其余主题也类似。1. 下载NexT推荐使用最新稳定版本
2017-03-11 10:20:31 741
原创 我的Hexo使用实践(一)
一 安装Hexo安装Nodejs和Git安装Hexo二 部署到Github创建你的Github Pages repository初始化Hexo部署到Github我的新博客是由Github Pages和Hexo搭建的,分享以下我的使用实践。一. 安装Hexo1. 安装Node.js和Git必须安装了Node.js和Git才能安装使用Hexo,按照Hexo官方提供的教程安装即可,Windo
2017-03-11 10:00:05 708
原创 HDU 3374 String Problem(最小表示法·KMP)
题意 给你一个环形串 输出其最小表示法的首字母位置 最大表示法的首字母位置 以及和对应位置等价位置的个数最小表示法指一个循环串以某一位开始时对应的串的字典序最小 这个串就是该循环串的最小表示法 先看一下求字符串最小表示法的过程 可以看2003年国家集训队论文集中周源的论文令 p 表示字符串 s 的最小表示法的下标, l = strlen(s) s = s + s
2015-10-06 10:43:25 1220
原创 HDU 2328 Corporate Identity(Trie·最长公共子串)
题意 输出n个串的字典序最小的最长公共子串可以枚举第一个串的所有子串 然后对每个串kmp匹配 比较复杂 而且慢 发现和HDU2846(求模式串在n个串中出现的次数)有类似之处 都可以用Trie来处理 一个串的子串肯定是其某个后缀的前缀 我们把第一个串的所有后缀都插入到Trie中 最长公共子串肯定是在这个Trie里面的 因为它肯定是第一个串的子串 在插入后面的串的后缀时
2015-10-05 16:03:25 797
原创 HDU 1074 Doing Homework(DP·状态压缩)
题意 有n个作业要做 给你每个作业的最后期限 和做完这个作业需要的时间 作业每超过最后期限一天就会扣一分 只能把一个作业做完了再做另一个作业 问做完所有作业至少扣多少分作业最多只有15个 看到这个数字容易想到是状态压缩 dp[i]表示i对应状态的最小扣分 i转换为二进制后为1的位表明该位对应的作业已经做了 为0的位没做 那么dp[i] = min{dp[k] + c
2015-08-28 14:47:03 2035
原创 HDU 1024 Max Sum Plus Plus (DP·滚动数组)
题意 从n个数的数组中选出不相交的m段 求被选数的和的最大值Max Sum 的升级版 不只是要选一段连续的了 而是选m段 思想还是类似 依旧dp状态和状态转移方程不是很难想 在 Max Sum 这个问题中 dp[i] 表示的是以第i个数结尾的一段的 Max Sum 由于这里还有一个多少段的状态 于是这里令 dp[i][j] 表示在前 i 个数中选取 j 组 且第 i 个
2015-08-27 10:02:55 1013
原创 POJ 1128 Frame Stacking(拓扑排序·打印字典序)
题意 给你一些矩形框堆叠后的俯视图 判断这些矩形框的堆叠顺序 每个矩形框满足每边都至少有一个点可见 输入保证至少有一个解 按字典序输出所有可行解和上一题有点像 只是这个要打印所有的可行方案 建图还是类似 因为每个矩形框的四边都有点可见 所以每个矩形框的左上角和右下角的坐标是可以确定的 然后一个矩形框上有其它字符时 就让这个矩形框对应的字符和那个其它字符建立一个小于关系 由
2015-08-20 10:29:13 1105
原创 POJ 2585 Window Pains(拓扑排序·窗口覆盖)
题意 有一个4*4的显示器 有9个程序 每个程序占2*2个格子 他们的位置如图所示 当你运行某个程序时 这个程序就会显示在顶层覆盖其它的程序 给你某个时刻显示器的截图 判断此时电脑是否死机了(出现了不合法的覆盖关系)拓扑排序的应用 关键是建图 当一个程序A的区域上有其它程序B时 说明A是在B之前运行的 那么我们可以建立一个A#include #include #
2015-08-19 16:11:44 1098
原创 POJ 1094 Sorting It All Out(拓扑排序·判断+实现)
题意 由一些不同元素组成的升序序列是可以用若干个小于号将所有的元素按从小到大的顺序 排列起来的序列。例如,排序后的序列为 A, B, C, D,这意味着 A 每来一个小于关系就进行一次拓扑排序 直到出现冲突(也就是出现了环)或者已经能确定顺序 当结果已经确定时 后面的小于关系也就没有必要处理了 因此可以用一个flag标记结果是否已经确定#include #include #i
2015-08-19 14:59:12 2255
原创 HDU 2871 Memory Control(线段树·区间合并·Vector)
题意 模拟内存申请 有n个内存单元 有以下4种操作 Reset 将n个内存单元全部清空 New x 申请一个长度为x的连续内存块 申请成功就输出左端 Free x 将x所在的内存块空间释放 释放成功输出释放的内存始末位置 Get x 输出第x个内存块的起始位置Reset 和 New 都是基本的区间合并知识 比较简单 Free和Get需要知道内层块的
2015-08-16 21:32:22 908
原创 POJ 2991 Crane(线段树·向量旋转)
题意 有一个Crane由n条线段连接组成 每个连接点处均可以任意旋转 给你n条线段的长度 然后又m次旋转操作 给你p和r 将第p和第p+1条线段之间的角度旋转为r 即第p条线段绕p的终点逆时针旋转r度后能够与第p+1条重合 问每次旋转后最后一条线段的终点坐标可以发现 旋转第p+1条线段时 p+1后面的所有线段也一起旋转了 可以把Crane分解为n个向量 这些向量
2015-08-16 15:16:48 977
原创 HDU 3265 Posters(线段树扫描线·矩形框面积并)
题意 把一些矩形海报挖去一部分小矩形贴在指定位置 问最后海报覆盖的面积一个矩形框可以分割成4个独立的小矩形 然后就能用扫描线求面积并了#include #include using namespace std;const int N = 100005, M = N << 2;typedef long long ll;struct SLine{ int x, y1
2015-08-15 17:56:37 871
原创 HDU 1828 Picture(线段树扫描线·周长并)
题意 给你一些矩形的左下和右上的坐标 求这些矩形的周长并也先来看点图 和面积并类似 求周长并也可以对每条竖边从左往右进行扫描 每次周长增加了多少呢 可以发现y方向上对周长增加的量就是扫描线上线段的总长度的改变量 x方向增加了线段段数 * 2 倍的与下一条竖边间的距离 因为每一段都会对应两个横边那么我们需要维护线段的总长度len和线段的段数num len和
2015-08-14 14:04:24 1447
原创 HDU 3634 City Planning (离散化)
题意 给你n个矩形 每个矩形都有自己的value 你可以任意改变矩形的表里关系 被覆盖的地方的value取最表层的 求总value的最大值刚看了扫描线 感觉这个可以用扫描线做就直接写了 其实直接离散化就行了 因为最多也就20个矩形 那坐标最多也就40个 那我们对坐标进行离散化 然后将矩形按value从小到大一个个的放 暴力更新覆盖格子的value 最后直接将2n
2015-08-14 09:32:37 930
原创 HDU 1542 Atlantis(线段树扫描线·面积并)
题意 给你一些矩形的左下和右上的坐标 求这些矩形的面积并最基础的扫描线 理解了就是个水题了 先看一些图吧 恩 看完了有什么感觉没有 那些红色的线就可以当作传说中的扫描线 就像从左到右扫描嘛 可以发现 矩形有竖直边的地方就有这些线 这些线把把拼在一起的矩形切
2015-08-12 21:10:56 1060
原创 HDU 3397 Sequence operation(线段树·成段更新·区间合并·混合操作)
题意 给你一个只有0, 1的数组 有这些操作 0. 将[a, b]区间的所有数都改为0 1. 将[a, b]区间的所有数都改为1 2. 将[a, b]区间的所有数都取反 即与1异或 3. 输出区间[a, b]中1的个数 即所有数的和 4. 输出区间[a, b]中最大连续1的长度对于所有的3, 4操作输出对应的答案单个的操作都很简单 但搞在一起就
2015-08-12 10:12:46 889
原创 HDU 3308 LCIS (线段树·单点更新·区间合并)
题意 给你一个数组 有更新值和查询两种操作 对于每次查询 输出对应区间的最长连续递增子序列的长度基础的线段树区间合并 线段树维护三个值 对应区间的LCIS长度(lcis) 对应区间以左端点为起点的LCIS长度(lle) 对应区间以右端点为终点的LCIS长度(lri) 然后用val存储数组对应位置的值 当val[mid + 1] > val[mid] 的时候就要进行区间合并操
2015-08-11 09:01:24 1253
原创 GCD·我所理解的扩展欧几里得
题意 求不定方程 ax + by + c = 0 满足 x1 的解的个数这里弱先来预习一下扩展欧几里得算法 ( O_O ) 欧几里得算法先来看看欧几里得算法 也就是辗转相除法 gcd(a,b) = gcd(b, a%b);简单的证明令 a%b = r 设 d 是 a, b 的公约数即d|a && d|b又 d'r = a – kb 所以
2015-08-10 15:19:01 1283 1
原创 UVa 11426 GCD - Extreme (II) (欧拉函数应用·O(N*logN))
题意 令 G(n) = sum{gcd(i, j) | 0 给你一个n 输出G(n)令 F(n) = sum{gcd(i, n) | 0 那么有递推式 G(n) = G(n-1) + F(n) , G(0) = 0 也就是说只用求出F(n) 就能递推求出 G(n)了 而求F(n)就比较容易了 对于i 设 x < i , gcd(x,i) = 1即x, n 互质
2015-08-09 17:52:29 1025
原创 LightOJ 1236 - Pairs Forming LCM (LCM·唯一分解)
题意 给你一个数n 求满足lcm(a, b) == n, a 容易知道 n 是a, b的所有素因子取在a, b中较大指数的积先将n分解为素数指数积的形式 n = π(pi^ei) 那么对于每个素因子pi pi在a,b中的指数ai, bi 至少有一个等于pi, 另一个小于等于pi先不考虑a, b的大小 对于每个素因子pi1. 在a中的指数 ai == ei 那么
2015-08-07 09:27:32 2635 4
原创 POJ 1167 (DFS·剪枝·公交时刻表)
题意 你记录了[0, 59]这个时间段内到达你所在站牌的所有公交的到这个站牌的时间 对于每路公交1. 同一路公交的到站时间间隔是相同的2. 每路公交在这个时间段至少到达两次3. 最多有17路公交4. 两个不同路的公交的第一次到站时间和到站时间间隔都可能是相同滴5. 你在这个时间段内的记录是完整的求最少用多少路公交可以让你的记录合法由于每路公交至少到站两次 那么第一
2015-08-03 16:30:48 1850
原创 POJ 3411 Paid Roads(DFS)
题意 你要从第1个城市到第N个城市去 有m条路 每条路用a, b, c, p, r 表示 你从第a个城市到第b个城市时 若之前经过或现在位于第c个城市 过路费就是p元 否则就是r元 求你到达第N个城市最少用多少过路费由于最多只有10个城市 10条路 这个题就变得很简单了 直接暴力dfs就行 可以用状态压缩来存储已经走过了哪些城市 由于最多只有10条路 从某个城市
2015-08-03 16:04:47 830
原创 ZOJ 3447 Doraemon's Number Game(Java优先队列·BigInteger)
题意 给你一个数组 你每次可以从中删掉2到k个数 然后把删掉的数的积加入到原数组 直到最后只剩一个数 求这样能得到的最大值和最小值的差每次选的数值越小 选的数量越少 最后得到的结果肯定越大 因为这样大的数可以乘以最大的倍数 运算的次数也是最多从而使+1的次数最多 这显然是有利于最后结果的增大的同理 每次选的数越大 选的数越多 最后得到的结果越小这样最大值就是
2015-07-29 20:40:22 1029
原创 ZOJ 3450 Doraemon's Railgun (DP·分组背包)
题意 多啦A梦有一个超电磁炮 然后要打死n堆敌人 在同一条射线上的敌人只有先打死前面的一堆才能打后面的一堆 给你打死某堆敌人需要的时间和这堆敌人的人数 问你在T0时间内最多打死多少个敌人分组背包问题 先要把同一条射线上的敌人放到一个分组里 后面的敌人的时间和人数都要加上前面所有的 因为只有前面的都打完了才能打后面的 然后每组最多只能选择一个 判断共线用向量处理
2015-07-29 09:31:22 958 2
原创 HDU 2846 Repository (Trie·统计子串)
题意 给你p个商品名称 然后输入q个字符串查询 对每个查询输出含有查询串为子串的商品个数Trie能很快的求出字典中以某个串为前缀的串的个数 但现在要查的是以某个串为子串的串的个数 可以发现 一个串的任何子串肯定是这个串某个后缀的前缀 如"ri"是“Trie" 的子串 是后缀 "rie" 的前缀 那么我们在向Trie中插入时可以把这个串的所有后缀都插入 插入时要注意
2015-07-28 09:06:04 1202
原创 HDU 1671 Phone List (Trie·数组实现)
题意 给你一组电话号码 判断其中是否有某个电话是另一个电话的前缀字典树的基础应用 可以先把所有电话存进Trie 标记每个电话的结束字符 然后再查询每个号码 看中途是否有结束标记 有的话就说明有号码是这个号码的前缀了实际上 插入完成就能知道是否有号码是另一个号码的前缀了 假设A是B的前缀若A在B之前插入 那么插入B的时候会遇到A的结束标记弱A在B之后插入 那么A
2015-07-27 19:56:43 881
原创 HDU 1247 Hat’s Words (Trie·指针实现)
题意 给你一个字典 输出字典中能表示成两个单词连接的所有单词最基础的字典树应用 先把所有单词加入字典树中 标记每个结点是否为某个单词的结尾 然后查找每个单词 在树上查询过程中遇到单词结尾时 如果剩下的后缀也是一个单词 那当前查询的单词就可以是两个单词的连接了#include #include using namespace std;const int N = 5000
2015-07-27 16:43:11 855
原创 ZOJ 3436 July Number(DFS)
题意 把一个数替换为这个数相邻数字差组成的数 知道这个数只剩一位数 若最后的一位数是7 则称原来的数为 July Number 给你一个区间 求这个区间中July Number的个数从7开始DFS 位数多的数总能由位数小的数推出#include using namespace std;const int N = 1e6;int july[N], n;set ans;
2015-07-26 17:08:26 721
原创 ZOJ 3427 Array Slicing (scanf使用)
题意 Watashi发明了一种蛋疼(eggache) 语言 你要为这个语言实现一个 array slicing 函数 这个函数的功能是 有一个数组初始为空 每次给你一个区间[ l, r) 和一些数 你要输出数组中下标在[l, r) 之间的数 然后删除这些数 然后把给你的那些数插入到数组的下标为 l 的位置签到模拟题 一直没看懂题意 看了Watashi的scanf高端用
2015-07-24 16:00:46 848
原创 HDU 2089 不要62(数位DP·记忆化搜索)
题意 中文最基础的数位DP 这题好像也可以直接暴力来做 令dp[i][j]表示以 j 开头的 i 位数有多少个满足条件 那么很容易有状态转移方程dp[i][j] = sum{ dp[i-1][k] }, k = 0...9, j != 4 && !( j == 6 && k == 2) 最后统计个数就行了#include using namespace std;i
2015-07-22 15:50:37 799
原创 POJ 1436 Horizontally Visible Segments (线段树·区间染色)
题意 在坐标系中有n条平行于y轴的线段 当一条线段与另一条线段之间可以连一条平行与x轴的线不与其它线段相交 就视为它们是可见的 问有多少组三条线段两两相互可见先把所有线段存下来 并按x坐标排序 线段树记录对应区间从右往左当前可见的线段编号(1...n) 超过一条就为0 然后从左往右对每条线段 先查询左边哪些线段和它是可见的 把可见关系存到数组中 然后把这条线段对应区间的
2015-07-15 15:58:17 811
原创 POJ 2886 Who Gets the Most Candies?(线段树·约瑟夫环)
题意 n个人顺时针围成一圈玩约瑟夫游戏 每个人手上有一个数val[i] 开始第k个人出队 若val[k] 0 时向左数val[k]个 第m出队的人可以得到m的约数个数个糖果 问得到最多糖果的人是谁约瑟夫环问题 n比较大 直接模拟会超时 通过线段树可以让每次出队在O(logN)时间内完成 类似上一道插队的题 线段树维护对应区间还有多少个人没出队 那么当我们知道出队的人
2015-07-13 20:23:47 1142
原创 POJ 2828 Buy Tickets(线段树·插队)
题意 n个人排队 每个人都有个属性值 依次输入n个pos[i] val[i] 表示第i个人直接插到当前第pos[i]个人后面 他的属性值为val[i] 要求最后依次输出队中各个人的属性值从头到尾看的话 队列是动态的 无法操作 但是反过来看时 pos[i]就可以表示第i个人前面还有多少个人了 然后想到了用线段树做就简单了 线段树维护对应区间还有多少个空位 每次把i放
2015-07-13 12:25:10 768
原创 LightOJ 1215 Finding LCM(数论)
题意 已知LCM(a, b, c) = L 和 a、b、L 求最小的满足等式的c.把数展开为素因子积的形式后 GCD(a,b)就是a,b的公共素因子取在a、b中的较小指数 LCM(a,b)就是a,b的所有素因子取在a、b中的较大指数令m = LCM(a,b) 那么问题转化为了求最小的c满足 LCM(m, c) = L 那么最小的c就是L中不在m中的素因子和L
2015-07-12 10:46:06 1890
原创 ZOJ 1364 Machine Schedule(二分图最大匹配)
}int main(){ int u, v, t; while(scanf("%d", &n), n) { memset(g, 0, sizeof(g)); scanf("%d%d", &m, &k); for(int i = 0; i < k; ++i) { scanf("%d%
2015-07-10 15:30:36 1349
原创 ZOJ 3761 Easy billiards (DFS性质)
题意 桌上有n个球 a球撞击b球时 a球停在b球位置 b球保持a球运动 若b球前面再没有球 b球就会掉下桌子 给你n个球的坐标 你可以多次选择某个撞击方向前面还有球的球撞击 问最后桌上至少还剩多少球 并输出你的撞击过程可以把x坐标或y坐标相同的点当作是连通的 因为可以通过撞击一个球使另一个球掉下桌面那么容易发现 一个连通块内的m个球总可以经过m-1次撞击后变成只剩一
2015-07-10 08:57:51 1027
原创 ZOJ 3699 Dakar Rally(贪心)
题意 路上有 n 个加油站 每个加油站的价格可能不同 你的油箱容积为 v 问从起点开车到终点加油至少用多少钱贪心 每次都让油箱里面便宜的油最多就行了 在每个站点 i 有两种情况1. i 点把油加满跑完都没有更便宜的 那么在 i 点肯定要加满 然后开到 i+1 点去2. i 点把油加满能跑到第一个比 i 点更便宜的 j 点或者到了终点 j 那么只用把油加到能到
2015-07-08 08:36:18 1521
原创 POJ 2823 Sliding Window(单调队列)
题意 长度为n的数组上有个长度为k的滑窗从左向右移动 求每次移动后滑窗区间的最小值和最大值 输出两行 第一行所有最小值 第二行所有最大值可以用线段树来做 但是单调队列更简单 单调递增队列: 队尾单调入队(入队元素大于队尾元素时直接入队 否则队尾出队直到队尾元素小于入队元素或者队列为空) 队首队尾都可以出队求最小值时 先判断队首元素是否在滑窗之内 不在队首就出队 然后
2015-07-06 12:28:21 2669
原创 HDU 1043 Eight (BFS·八数码·康托展开)
题意 输出八数码问题从给定状态到12345678x的路径用康托展开将排列对应为整数 即这个排列在所有排列中的字典序 然后就是基础的BFS了#include using namespace std;const int N = 5e5, M = 9;int x[4] = { -1, 1, 0, 0};int y[4] = {0, 0, -1, 1};int fac[] = {1
2015-07-05 17:00:28 1215
原创 XTU1238 Segment Tree (线段树·区间最值更新)
题意 对一个数组有四种操作1: 将区间[ l, r] 中的所有值都加上c2:将区间 [l, r] 中所有比c大的值改为c3:将区间 [l, r] 中所有比c小的值改为c4:输出区间 [l, r] 中所有数的最小值和最大值对每个操作4输出对应最小值和最大值基础的线段树 在湘潭卡了好久没写出来 线段树维护三个值 区间最大值 maxv, 区间最小值minv, 区间增加的值add 操作1是
2015-07-05 10:18:01 1162 2
(HDUACM201303版_15)筛选法及预处理(附菜鸟的23个经典错误)
2014-08-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人