![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
-HDU
文章平均质量分 81
virgoDd
Good afternoon,good evening and good night
展开
-
HDU 2553 N皇后问题 (回溯法 递归·非递归)
题意 中文n*n的棋盘放n个皇后(攻击同行/列/主副对角线) 使任何两个都不互相攻击 有多少种方法枚举每一行 用vis[3][i]记录列 主对角线 副对角线是否被占 同列和对角线都没被占就继续枚举下一行 当枚举到n+1行的时候就是一个合法答案了 注: n*n的方阵中主对角线可以用(i-j+n)标号 副对角线可以用(i+j)标号//ans[]={0,1,0,0,2,10,4原创 2014-11-20 11:23:09 · 1097 阅读 · 0 评论 -
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 · 1199 阅读 · 0 评论 -
HDU 1671 Phone List (Trie·数组实现)
题意 给你一组电话号码 判断其中是否有某个电话是另一个电话的前缀字典树的基础应用 可以先把所有电话存进Trie 标记每个电话的结束字符 然后再查询每个号码 看中途是否有结束标记 有的话就说明有号码是这个号码的前缀了实际上 插入完成就能知道是否有号码是另一个号码的前缀了 假设A是B的前缀若A在B之前插入 那么插入B的时候会遇到A的结束标记弱A在B之后插入 那么A原创 2015-07-27 19:56:43 · 871 阅读 · 0 评论 -
HDU 1506 Largest Rectangle in a Histogram(DP·单调栈)
Largest Rectangle in a HistogramTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11137 Accepted Submission(s): 3047Problem Descrip原创 2014-09-02 09:50:42 · 701 阅读 · 0 评论 -
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 · 1143 阅读 · 2 评论 -
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 · 1878 阅读 · 0 评论 -
HDU 1166 敌兵布阵 (树状数组·线段树)
题意 中文动态区间和问题 只会更新点 最基础的树状数组 线段树的应用树状数组代码#include using namespace std;const int N = 50005;int c[N], n, m;void add(int p, int x){ while(p <= n) c[p] += x, p += p & -p;}int原创 2015-04-14 12:54:32 · 804 阅读 · 0 评论 -
HDU 4006 The kth great number(优先队列·第K大数)
题意 动态查询第K大的数用小数在前优先队列维护K个数 每要插入一个数时 若这个数小于队首元素那么就不用插入了 否则队首元素出队 这个数入队 每次询问只用输出队首元素就行了#include#includeusing namespace std;int main(){ int n, a, k; char op[5]; while(~scanf("%d%原创 2015-04-14 13:05:56 · 1284 阅读 · 0 评论 -
HDU 3714 Error Curves(3分)
题意 求分段函数的最低点 每个点函数值为n个 a*x^2 + b*x +c (a>=0, |b|由于a是不小于0的 所以此分段函数的函数图像只可能是类似'V'形的 可以画图观察出来 那么求最小值就可以用三分来解决了#include using namespace std;const int N = 10005;const double eps = 1e-9;int a[原创 2015-04-07 17:56:22 · 694 阅读 · 0 评论 -
HDU 4027 Can you answer these queries?(线段树 区间不等更新)
题意 输入n个数 然后有两种操作 输入0时将给定区间所有数都变为自己的开方 输入1输出给定区间所有数的和虽然是区间更新 但每个点更新的不一样 因此只能对单点进行更新 其实一个点最多被更新7次 2^64开平方7次后就变为1了 如果某个区间的数都变为了1 那么对这个区间的开方就不用考虑了 另外要注意给你的区间可能是反的#include #define lc p<<原创 2015-04-19 09:34:08 · 1689 阅读 · 0 评论 -
HDU 3974 Assign the task(树 并查集)
题意 公司中有n个员工 除了boss 每个员工都有自己的上司 自己下属的下属也是自己的下属 当给一个员工分配任务时 这个员工会把任务也分配到自己的所有下属 每个员工都只做最后一个被分配的任务 对于每个C x 输出员工x正在做的任务 没有就输出-1把员工的关系数建成类似并查集的结构 把每个直接分配任务的员工的任务和任务分配时间保存起来 查询时只要找这个员工所有父节点中最原创 2015-04-22 21:48:27 · 1389 阅读 · 0 评论 -
HDU 1540 Tunnel Warfare(线段树 区间合并 最大连续区间)
题意 有n个连在一起的地道 接下来有m个操作 D x 炸掉x号地道 炸掉后x所在的区间就不连续了 Q x 查询输出包括x的最大连续区间长度 R修复最后一个被炸的地道 注意输入R时可能并没有需要修复的地道线段树的区间合并问题 线段树要维护3个信息 len 对应区间的最大连续长度 ll 对应区间最左端的一段连续长度lr 对应区间最右端的一段连续原创 2015-04-22 14:25:48 · 1191 阅读 · 1 评论 -
HDU 1495 非常可乐(BFS 倒水问题)
题意 将体积为s的可乐 利用容积分别为n和m的两个杯子平均分为两份 至少需要倒多少次可乐可以把容器s,n,m中装的可乐量看成一种状态 容器都是没有刻度的 所以每次倒可乐要么把自己倒完 要么把对方倒满 每种状态可以通过一次倒水到达哪些状态 于是可以通过bfs判断到达每种状态需要倒多少次 3个容器中有一个装的可乐为s/2的状态就是答案了 s是奇数时明显不可能平分的 可以原创 2015-04-01 09:39:11 · 2470 阅读 · 2 评论 -
FZU 2150 Fire Game(DFS+BFS)
题意 在n*m个格子组成的草地上 你可以选择两个是草('#')的格子点燃 每个点燃的格子在下一秒其四个相邻的是草的格子也会被点燃 问点燃所有的草至少需要多少秒DFS和BFS的综合 如果'#‘连通块的数量大于2个是肯定不能点燃所有的 先dfs判断连通块个数 再bfs找出选哪两个格子可以最快把草烧完#include #include #include using nam原创 2015-04-03 10:16:31 · 1227 阅读 · 0 评论 -
HDU 2612 Find a way(双BFS)
题意 在n*m的地图中 ‘Y’和'M'两个人到某一家KFC(在地图上用"@'表示) 所需的最小时间和是多少 他们每走一步都要11分钟可以分别以y和m为起点进行一遍bfs 把到每个KFC的时间都存起来 最后看哪家KFC的时间和最小就行了#include #include #include using namespace std;const int N = 205;in原创 2015-03-31 23:16:45 · 974 阅读 · 0 评论 -
HDU 1863 畅通工程 (最小生成树是否存在)
题意 中文入门最小生成树 prim大法好#include#includeusing namespace std;const int N = 105;int cost[N], mat[N][N], n, m, ans;void prim(){ memset(cost, 0x3f, sizeof(cost)); cost[1] = -1; int cur原创 2014-10-26 17:54:37 · 979 阅读 · 0 评论 -
HDU 1247 Hat’s Words (Trie·指针实现)
题意 给你一个字典 输出字典中能表示成两个单词连接的所有单词最基础的字典树应用 先把所有单词加入字典树中 标记每个结点是否为某个单词的结尾 然后查找每个单词 在树上查询过程中遇到单词结尾时 如果剩下的后缀也是一个单词 那当前查询的单词就可以是两个单词的连接了#include #include using namespace std;const int N = 5000原创 2015-07-27 16:43:11 · 843 阅读 · 0 评论 -
HDU 2846 Repository (Trie·统计子串)
题意 给你p个商品名称 然后输入q个字符串查询 对每个查询输出含有查询串为子串的商品个数Trie能很快的求出字典中以某个串为前缀的串的个数 但现在要查的是以某个串为子串的串的个数 可以发现 一个串的任何子串肯定是这个串某个后缀的前缀 如"ri"是“Trie" 的子串 是后缀 "rie" 的前缀 那么我们在向Trie中插入时可以把这个串的所有后缀都插入 插入时要注意原创 2015-07-28 09:06:04 · 1184 阅读 · 0 评论 -
HDU 3308 LCIS (线段树·单点更新·区间合并)
题意 给你一个数组 有更新值和查询两种操作 对于每次查询 输出对应区间的最长连续递增子序列的长度基础的线段树区间合并 线段树维护三个值 对应区间的LCIS长度(lcis) 对应区间以左端点为起点的LCIS长度(lle) 对应区间以右端点为终点的LCIS长度(lri) 然后用val存储数组对应位置的值 当val[mid + 1] > val[mid] 的时候就要进行区间合并操原创 2015-08-11 09:01:24 · 1233 阅读 · 0 评论 -
HDU 3374 String Problem(最小表示法·KMP)
题意 给你一个环形串 输出其最小表示法的首字母位置 最大表示法的首字母位置 以及和对应位置等价位置的个数最小表示法指一个循环串以某一位开始时对应的串的字典序最小 这个串就是该循环串的最小表示法 先看一下求字符串最小表示法的过程 可以看2003年国家集训队论文集中周源的论文令 p 表示字符串 s 的最小表示法的下标, l = strlen(s) s = s + s原创 2015-10-06 10:43:25 · 1195 阅读 · 0 评论 -
HDU 2328 Corporate Identity(Trie·最长公共子串)
题意 输出n个串的字典序最小的最长公共子串可以枚举第一个串的所有子串 然后对每个串kmp匹配 比较复杂 而且慢 发现和HDU2846(求模式串在n个串中出现的次数)有类似之处 都可以用Trie来处理 一个串的子串肯定是其某个后缀的前缀 我们把第一个串的所有后缀都插入到Trie中 最长公共子串肯定是在这个Trie里面的 因为它肯定是第一个串的子串 在插入后面的串的后缀时原创 2015-10-05 16:03:25 · 777 阅读 · 0 评论 -
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 · 2588 阅读 · 4 评论 -
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 · 889 阅读 · 0 评论 -
HDU 1828 Picture(线段树扫描线·周长并)
题意 给你一些矩形的左下和右上的坐标 求这些矩形的周长并也先来看点图 和面积并类似 求周长并也可以对每条竖边从左往右进行扫描 每次周长增加了多少呢 可以发现y方向上对周长增加的量就是扫描线上线段的总长度的改变量 x方向增加了线段段数 * 2 倍的与下一条竖边间的距离 因为每一段都会对应两个横边那么我们需要维护线段的总长度len和线段的段数num len和原创 2015-08-14 14:04:24 · 1402 阅读 · 0 评论 -
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 · 860 阅读 · 0 评论 -
HDU 3634 City Planning (离散化)
题意 给你n个矩形 每个矩形都有自己的value 你可以任意改变矩形的表里关系 被覆盖的地方的value取最表层的 求总value的最大值刚看了扫描线 感觉这个可以用扫描线做就直接写了 其实直接离散化就行了 因为最多也就20个矩形 那坐标最多也就40个 那我们对坐标进行离散化 然后将矩形按value从小到大一个个的放 暴力更新覆盖格子的value 最后直接将2n原创 2015-08-14 09:32:37 · 912 阅读 · 0 评论 -
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 · 783 阅读 · 0 评论 -
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 · 1991 阅读 · 0 评论 -
HDU 1542 Atlantis(线段树扫描线·面积并)
题意 给你一些矩形的左下和右上的坐标 求这些矩形的面积并最基础的扫描线 理解了就是个水题了 先看一些图吧 恩 看完了有什么感觉没有 那些红色的线就可以当作传说中的扫描线 就像从左到右扫描嘛 可以发现 矩形有竖直边的地方就有这些线 这些线把把拼在一起的矩形切原创 2015-08-12 21:10:56 · 1039 阅读 · 0 评论 -
HDU 1160 FatMouse's Speed(DP)
题意 输入n个老鼠的体重和速度 从里面找出最长的序列 是的重量递增时速度递减简单的DP 令d[i]表示以第i个老鼠为所求序列最后一个时序列的长度 对与每个老鼠i 遍历所有老鼠j 当(w[i] > w[j]) && (s[i] #include#includeusing namespace std;const int M=1005;int w[M], s[M],原创 2014-09-02 09:51:53 · 544 阅读 · 0 评论 -
HDU 1069 Monkey and Banana(DP 长方体堆放问题)
Monkey and BananaProblem DescriptionA group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, prov原创 2014-09-02 09:51:18 · 689 阅读 · 0 评论 -
HDU 1505 City Game(DP)
City GameTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4531 Accepted Submission(s): 1919Problem DescriptionBob is a strat原创 2014-09-02 09:50:40 · 486 阅读 · 0 评论 -
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 · 997 阅读 · 0 评论 -
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 · 865 阅读 · 0 评论 -
HDU 1754 I Hate It(入门线段树)
题意 中文最基础的线段树了 只涉及到了点的修改#include#include#define lc p<<1,s,mid#define rc p<<1|1,mid+1,e#define mid ((s+e)>>1)using namespace std;const int N = 200005;int maxv[N << 2];void pushup(int p){原创 2014-12-11 10:19:07 · 764 阅读 · 0 评论 -
1355 巧克力 (线段树点+区间)
继续最水的线段树 简单粗暴#include#include#include#define lc p<<1,s,mid#define rc p<<1|1,mid+1,e#define mid ((s+e)>>1)using namespace std;const int N = 100005;int add[4 * N], maxv[4 * N];void pushup(i原创 2014-12-11 12:47:10 · 893 阅读 · 0 评论 -
HDU 2095 find your present(异或)
题意 求一组数中只出现过奇数次的数 输入保证只有一个数满足知道一个数与自己的异或等于0 与0的异或等于自己就行咯#includeusing namespace std;int main(){ int n, t, ans; while(scanf("%d", &n), n) { ans = 0; for(int i = 1;原创 2014-12-01 19:16:01 · 786 阅读 · 0 评论 -
HDU 2845 Beans(DP,最大不连续和)
题意 吃豆子游戏 当你吃了一个格子的豆子 该格子左右两个和上下两行就不能吃了 输入每个格子的豆子数 求你最多能吃多少颗豆子可以先求出每行你最多可以吃多少颗豆子 然后每行就压缩成只有一个格子了 里面的豆子数就是那一行最多可以吃的豆子数 然后问题就变成求一列最多可以吃多少颗豆子了 和处理每一行一样处理 那么问题就简化成求一行数字的最大不连续和问题了原创 2014-09-02 09:51:28 · 525 阅读 · 0 评论 -
HDU 1789 Doing Homework again(贪心)
题意 某大参加ACM竞赛回来落下很多作业 每个作业都有最后期限 没在最后期限之内做完期末就要扣掉对应的分 求最少扣多少分把所有作业按扣分大小从大到小排序 然后就贪阿 能完成前面的就完成前面的 实在不能的就扣分吧~#include#include#includeusing namespace std;const int N = 1005;int dli[N], r原创 2014-09-02 09:51:47 · 532 阅读 · 0 评论 -
HDU 1081 To The Max(DP)
题意 求一个n*n矩阵的最大子矩阵和HDU 1003 max sum 的升级版 把二维简化为一维就可以用1003的方法去做了 用mat[i][j]存 第i行前j个数的和 那么mat[k][j]-mat[k][i]就表示第k行 第i+1个数到第j个数的和了 再将k从一枚举到n就可以得到这个这个宽度为j-i的最大矩阵和了 然后i,j又分别从1枚举到n就能得到结果了 和1原创 2014-09-02 09:51:57 · 556 阅读 · 0 评论