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