数据结构 / 线段树、树状数组
文章平均质量分 71
泳裤王子
这个作者很懒,什么都没留下…
展开
-
HDOJ 1754 I Hate It
类型:单点更新,线段树 / 树状数组 代码: #include #include #include using namespace std; inline int Rint() {int x; scanf("%d", &x); return x;} #define原创 2011-09-19 22:18:38 · 426 阅读 · 0 评论 -
HDU 1003 Max Sum + 单调队列优化dp解法
首先贴上经典dp解法, 以i结尾的最大子段和 d[i] = max(d[i-1]+a[i], a[i]). 但这不是本文的主要目的. 代码 O(n) : #include #include #include #include #include #include #include #include using namespace std; inline int Rint() { int x;原创 2012-08-21 23:19:15 · 851 阅读 · 0 评论 -
POJ 2823 Sliding Window
http://poj.org/problem?id=2823 裸的单调队列. 注意: 队列里存的是下标, 就不要把他当做值用- - 代码: #include #include #include #include #include #include #include #include using namespace std; inline int Rint() { int x; scanf(原创 2012-08-21 20:04:54 · 426 阅读 · 0 评论 -
HDU 3415 Max Sum of Max-K-sub-sequence[单调队列优化dp]
这题是有下界的最大子段和, 无上下界的最大子段和请看 hh大牛把这个归为单纯的单调队列题, 因为这个状态间不用转移, 其实无所谓啦, 思路都是一样的 思路: 单调队列优化dp 以i结尾的最大子段和 d[i] = max{ sum[i]-sum[k] | k=[i-K , i-1] }. 化为 d[i] = max(f[k])+sum[i]. f[k]=-sum[k], k=[i-k, i原创 2012-08-22 00:25:43 · 1203 阅读 · 0 评论 -
Vijos 1243 生产产品[单调队列优化dp]
好吧...作为我A掉的第一道单调队列优化dp....在高中生的OJ上....而且我调了一个半小时样例....然后很神奇的1A = =... 诶 这题果断比多校8的1005难啊...min里面的东西这么奇葩的...又 k 又 p 又 j 地...开始我以为只要一个队列, 搞了半天发现应该要N个队列... = =...写出来好神奇.... 转移方程什么的详见代码吧....要碎了.... 总结下:原创 2012-08-20 03:03:28 · 1196 阅读 · 0 评论 -
FZU 1894 志愿者选拔[双端队列/单调队列]
写这篇题解前重复一句被很多人说过的话...."一直以为单调队列就是优先队列, 2了....." 然后这题开始用priority_queue, 悲催地TLE了... 科普: 1/ 优先队列, 一般用堆实现, 就是STL里priority_queue那玩意...也就是优化dijkstra时用的那玩意.... 用处: 从一堆数里用O(1)的时间找到最优值, 用O(logn)的时间插入.删除最优原创 2012-08-19 23:32:09 · 1002 阅读 · 0 评论 -
HDU 4302 Holedox Eating
多校的时候这题写了一个多小时....调了半个多小时过完样例, 然后一直wa..... 当时何其悲惨....其实也是很傻逼的一道, 就是模拟动物走的部分要写得仔细一点....尽量分模块写... 线段树: 单点更新, 区间查询, 维护区间离端点最近的有食物位置. 注意题目线段是0~n. 代码: #include #include #include #include #incl原创 2012-08-13 16:09:58 · 522 阅读 · 0 评论 -
POJ-3667 Hotel[线段树]
题意: 有连续的N间房间, 两种操作, 一是Check in, 要找D间连续的空房间出来(房号尽可能小), 输出第一个的位置, 如果没有就输出0; 二是Check out, 从x号房开始连续的D个房间, 重新变成空房间. 思路: 1/ 先说我开始的想法: N个房间当成1~N的线段, 我们肯定是要维护一个最值, 用这个最值来判断这个区间是否能满足D间连续的空房间. 自然我们会维护区间的最大连原创 2012-08-12 20:47:46 · 529 阅读 · 0 评论 -
HDOJ-2795 Billboard [线段树][单点更新+单点查询+维护区间最值]
8s时限 单点更新+单点查询(要用区间信息来找到那个点) 注意:对于维护区间最值的, 附加域直接当主域用, 因为叶节点的最值就是那个点的值 思路: 1/ 维护区间最左的还未满w的点, 若整个区间满了, 用-1表示 这样不行的, 试想若最左未满点若剩余量还是 2/ 蒟蒻啊, 看了hh的博客才知道要维护区间最大值(剩余量). 那我就维护最小值(已有量)吧...这样不用build一原创 2012-08-12 01:00:02 · 555 阅读 · 0 评论 -
5798 - Jupiter Atacks!
http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3809 单点更新+区间查询+维护区间公式和 这题算是昨天开始刷线段树做过的比较难的了吧....首先要把维护量想出来, 再把合并区间的方式想出来, 然后写的时候 还有很多要注意的地方....原创 2012-08-12 11:56:29 · 519 阅读 · 0 评论 -
HDOJ 1698 Just a Hook [区间替换+区间查询]
这题我知道我做过. 但是现在做还是搞了半天. 因为还是对 pushdown 这个没搞清楚. 这个函数不是维护e的 , 而是维护e的 子节点的. 由于这题只要查询一次整段的值, 返回a[1]即可. 代码1 (标准写法, pushdown维护到子节点): #include #include #include #include #include #include #include #in原创 2012-08-12 03:05:41 · 444 阅读 · 0 评论 -
[专辑]线段树总结[updating]
去年半途而废了,今年打算好好把hh大牛的专题好好做一遍....债好像越累越多了... 预备: 1/ 结点数为4*MAXN. 为什么不是2*MAXN? 因为MAXN不一定正好是2^x, 也就是说最底下那层最多可以有约2*MAXN个数. 所以总结点就是 2*2*MAXN. 2/ 一般来说, 结点有主域, 附加域. 附加域一般为一些延迟标记(用于区间更新中). 3/ 更新: pushup(e)原创 2012-08-12 00:54:41 · 609 阅读 · 0 评论 -
UvaOJ 127 - "Accordian" Patience
题目 题意规则挺多的,但是读懂了还是清晰的,这里就不写了。 模拟题。我开了个双向链表,用struct 的 oop写的,没access control 看着挺乱但是写着还是挺爽的。130行...1Y。 代码: #include #include #include using namespace std; #define MAXN 53 //52cards struct C原创 2012-04-11 21:46:51 · 709 阅读 · 0 评论 -
UvaOJ 112 - Tree Summing
题目 就是给你一个所谓的二叉树的S-expression 让你判断是否存在指定的 根到叶子的路径和。 我在这里用到cin.putback() (C里有 int ungetcA(int ch, FILE *stream) 在cstdio中),方便把下一个字符拿出来判断后再塞回缓冲区,最后用格式化读。 特别注意的是,题目所说的叶子,必须具有(integer()()) 这样的形式才是一个叶子,也就原创 2012-04-12 12:01:57 · 788 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers
分析:这题wa了好多次(看了下discuss好多人也是这样,好题~)。一处是sum值会超int32,要用int64。还有一处是toadd要累加,我不知道是受上一题影响还是怎的..pushdown的时候直接替换了...还有,据说北大oj要用%lld读.. 类型:成段更新。容易错.原创 2011-09-19 22:37:32 · 452 阅读 · 0 评论 -
HDOJ 1698 Just a Hook
分析: 只查询一次(总和)。toadd 表示以下全部替换为此值(而不是累加)。初始每个结点为1。 类型:成段更新(lazy标记)。线段树......(ps. 据说树状数组能做成段的?怎么做?再说~... 代码: //颜色:1 2 3 //You may consider t原创 2011-09-19 22:31:30 · 512 阅读 · 0 评论 -
HDOJ 1394 Minimum Inversion Number
分析:前段时间做的,大概是先求逆序数,再根据这个O(m)推出可能的最大逆序数。 类型:单点更新, 树状数组 / 线段树 代码(树状数组): #include #include using namespace std; #define MAXN 5002 #define I原创 2011-09-19 22:24:35 · 597 阅读 · 0 评论 -
HDOJ 1166 敌兵布阵
全裸的单点更新.... 代码: #include #include #include using namespace std; #define MAXN 50002 struct node { int mid, l, r; int v; }a[MAXN*4];原创 2011-09-19 22:20:50 · 571 阅读 · 0 评论 -
[专辑]树状数组[updating]
一般树状数组能做的线段树都能做,除非卡你空间。。。 1、单点更新+区间查询 #define MAXN 100002 int a[MAXN]; int n; //线段 1~n inline lowbit(int x) { return x&(-x); } int getsum(int x) // 区间查询,sum[1, x] { int ret = 0; while(x>0原创 2012-09-08 20:59:40 · 649 阅读 · 0 评论