线段树
文章平均质量分 77
iYUNDI
iYUNDI
展开
-
[poj 2886] Who Gets the Most Candies[线段树][约瑟夫环][反素数]
题意:约瑟夫环,每次转移的步数根据跳出那个孩子手中牌的数字决定,可以有负数.求第p个跳出的孩子的名字 以及p的约数个数p为不大于n的最大反素数反素数...制表..#include #include #include #include using namespace std;#define REP(i,n) for(int i=0;i<(n);++i)原创 2013-08-02 17:22:40 · 819 阅读 · 0 评论 -
[poj 2991]Crane[线段树表示向量之和,而非数量]
由于旋转会影响到该点之后所有线段的角度, 因此容易想到用线段树记录角度, 成段更新. (但是不是每一次操作都要询问一次么? 那么懒惰标记还有用么? 如果使用懒惰标记, 将一些线段视为整体, 那么这些线段岂不是又要用一个线段树记录一段区间的总长? 树状数组亦可...)将向量视为数量整体加和, 融入到线段树的操作中, 就可以避免角度和坐标分离的麻烦事..对线段树的求和理念理解不深, 只是想到了角度的加和, 殊不知向量本身也可以加和, 而且"和向量"与"分向量"的关系是层层细分下去的.有了这样的思维框架原创 2013-09-02 21:29:13 · 1674 阅读 · 2 评论 -
[poj 3468]A Simple Problem with Interger[线段树][区间更新]
题意:给出N个数, 有两种操作:"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000."Q a b" means querying the sum of Aa, Aa+1, ... ,Ab.回答每个询问.思路:裸的线段树区间更新, 注意范围.重新熟悉线原创 2013-08-31 23:45:46 · 858 阅读 · 0 评论 -
[UESTC]Another LCIS[线段树][区间合并][成段修改]
成段修改还是用标记.区间合并除了PushUp需要判断相接, query也需要. 而且有两种实现:一是涉及哪个儿子就query, 一直取最大(此代码),二是若只涉及一个儿子, 返回query那个儿子; 否则两边&中间取最大. 有点小差别~本来我想原数列直接保存就行, 因为每次只修改区间的端点, 而对于每一个标记, 可以维持儿子端点只被修改一次(中间的重复可以判断). 但是一直WA...目前还没想通是哪错了><AC的方案是树中增加左右端点, 这样就可以严格分层修改, 不会有隐患.query中lmax写原创 2013-09-06 12:45:20 · 958 阅读 · 0 评论 -
[CF 61E]Enermy is weak[线段树求二重逆序数]
题意:求单调下降的三元组的个数. 三个元素不一定要连续.思路:转化为求二重逆序数:线段树求出逆序数, 再求逆序数序列的逆序数.#include #include using namespace std;#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1typedef long lon原创 2013-08-21 08:38:44 · 1042 阅读 · 0 评论 -
[poj 2528] Mayor's Posters[线段树][区间更新]
题意:在单位高,w长的板上贴单位高,wi长的海报.会overlap,求最终能露出来的海报.离散化的地方需要注意一下.#include #include #include using namespace std;#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1const int m原创 2013-08-02 17:13:31 · 720 阅读 · 0 评论 -
[poj 2828]Buy Tickets[线段树求第k大问题]
题意:插队posi vali编号为vali的人插在posi位置的人身后.输出最终队伍./**此题的关键在于逆序循环!对于插队这项活动,总是越靠后越方便夺取胜利果实...倒着循环,那么每次取的人的位置都能直接确定.位于当前人的位置pos[i]+1,他的前面(截止到他来的时候)必然有pos[i]个人,而这pos[i]个人一定是倒序循环尚且没有涉及的.因此要在原创 2013-08-02 17:09:57 · 839 阅读 · 0 评论 -
[poj 1166]敌兵布阵[线段树基础]
#include #define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1const int maxn = 55555;int sum[maxn<<2];//x4void PushUP(int rt) {//区间求和,从叶子节点更新上来 sum[rt] = sum[rt<<1] + sum[rt<<1|1];}原创 2013-08-02 17:06:48 · 712 阅读 · 0 评论 -
[HDU 1394]求全排列逆序数最大值[线段树]
#include #include using namespace std;#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1const int maxn = 5555;int sum[maxn<<2];void PushUP(int rt) { sum[rt] = sum[rt<<1] + sum[rt原创 2013-08-02 17:05:50 · 1063 阅读 · 0 评论 -
[HDU 2795] Billboard[线段树][单点增删]
题意:x*y的板,贴单位高 wi长的便条,每次从可用的左上空位贴,给出一个便条,问是否可贴下.坐标.主要是用线段树如何用的问题...加深理解的题#include #include using namespace std;#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1con原创 2013-08-02 17:17:15 · 785 阅读 · 0 评论 -
[poj 3321]Apple Tree[模拟DFS][时间戳][线段树]
根据DFS建立线段树的题.详详详解~~~原创 2013-08-02 16:39:43 · 1095 阅读 · 0 评论 -
[HDU 3308]LCIS[线段树][区间合并]
hdu3308 LCIS给定10^5个数,区间查询严格上升的最长连续序列长度,点更新某个数.线段树,区间合并有三个数组,msum, lsum, rsum,分别存总最长,左端串长,右端串长一直错的一个地方是:query中,合并的时候,若左右儿子可以合并,应该取max{min[左儿子右长,实际右长],min[右儿子左长,实际左长]},而不是max{min[左儿子最大长,原创 2013-08-02 17:02:07 · 776 阅读 · 0 评论 -
[poj 1436]Horizontally Visible Segments[线段树]
题意:给出一系列竖直的线段, 给出上下两端点坐标和横坐标, 定义"水平可见"为两线段之间可以连一条水平线段, 使得该线段不与其他线段接触.又定义"三条线段可组成三角形"为三条线段两两"水平可见".问一组线段中一共可以组成多少三角形.思路:首先这个"可见"可以想到涂色覆盖问题, 纵向建立线段树. 可知横坐标只起到排序的作用, 并无影响.因为是一层层添加, 所以就像求逆序数一样原创 2013-09-01 21:19:32 · 767 阅读 · 0 评论