Description
输入n个有序对< pi, vi >,pi表示在第pi个位置后面插入一个值为vi的人,并且pi是不降的。输出最终得到的v的序列
Input
多组用例,每组用例第一行为有序对组数n,之后n行每行两个整数表示一个有序对,以n=0结束输入
Output
对于每组用例,输出最后得到的序列
Sample Input
4
0 77
1 51
1 33
2 69
4
0 20523
1 19243
1 3890
0 31492
Sample Output
77 33 69 51
31492 20523 3890 19243

单点插入线段树——所以建树的时候叶子节点应该为大于n的第一个数(cnt = 2 ^ k  > n)

建树的时候我们logn找到该点向下更新叶子和向上更新根节点特别的我们要记录这个节点还有多少空位

为什么要逆序?

因为最后的元素可以确定位置,而忽略前面元素的影响

例如 0 10 0 11

我们逆序来插入值     11   ?

?代表还有空

11插入后,那个节点记录表示空位是0

所以插入0 10的时候会通过判断来往?的位置走~

差不多,自己手想一下就好

void build()
{
int s;
for(s = 1;s < n;s <<= 1);
//之所以要出来大于n画一画就好了,n那一层就算没有占满,也要开一层下面的吧 for(int i = s;i < 2 * s;i++)//叶子
{
tree[i].l = tree[i].r = i - s + 1;
tree[i].cnt = 1;
} for(int i = s-1;i >= 1;i--)//根
{
tree[i].l = tree[2*i].l;
tree[i].r = tree[2*i+1].r;
tree[i].cnt = tree[2*i].cnt + tree[2*i+1].cnt;
}
}

这是第一种建树,也可以常规来

void build(int rt, int left, int right)
{
tree[rt].l = left;
tree[rt].r = right;
tree[rt].cnt = right - left + 1;
if(left == right)
return;
int mid = (left + right) >> 1;
build(rt<<1,left,mid);
build(rt<<1|1,mid + 1,right);
}

code......

//****单点更新线段树
#include <cstdio>
#include <algorithm>
#include <string.h>
#define inf (1 << 29)
using namespace std;
const int maxn = 2e5 + 100;
struct node
{
int pos;
int num;
}p[maxn];
struct node2{
int l,r,cnt;
}tree[maxn << 2];
int n,ans[maxn];
void build(int rt, int left, int right)
{
tree[rt].l = left;
tree[rt].r = right;
tree[rt].cnt = right - left + 1;
if(left == right)
return;
int mid = (left + right) >> 1;
build(rt<<1,left,mid);
build(rt<<1|1,mid + 1,right);
}
/*void build()
{
int s;
for(s = 1;s < n;s <<= 1);
//之所以要出来大于n画一画就好了,n那一层就算没有占满,也要开一层下面的吧 for(int i = s;i < 2 * s;i++)//叶子
{
tree[i].l = tree[i].r = i - s + 1;
tree[i].cnt = 1;
} for(int i = s-1;i >= 1;i--)//根
{
tree[i].l = tree[2*i].l;
tree[i].r = tree[2*i+1].r;
tree[i].cnt = tree[2*i].cnt + tree[2*i+1].cnt;
}
}*/
void insertpoint(int i,int pos,int num)
{
if(tree[i].l == tree[i].r)
{
ans[tree[i].l] = num;
tree[i].cnt = 0;
return;
} if(pos <= tree[2*i].cnt)
insertpoint(2*i,pos,num);
else
insertpoint(2*i+1,pos - tree[2*i].cnt,num);
tree[i].cnt--;
}
int main()
{
while(~scanf("%d",&n))
{
int k = 0;
for(k = 1;k < n;k <<= 1);
build(1,1,k);
for(int i = 0;i < n;++i)
scanf("%d%d",&p[i].pos,&p[i].num);
for(int i = n - 1;i >= 0;i--)
insertpoint(1,p[i].pos + 1,p[i].num);
for(int i = 1;i <= n;i++)
{
printf("%d%c",ans[i],i == n ? '\n' : ' ');
}
} return 0; }

POJ2828线段树单点更新——逆序更新的更多相关文章

  1. poj2828 线段树单点更新

    Buy Tickets Time Limit: 4000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...

  2. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  3. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

  4. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  5. POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

    Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Descrip ...

  6. HDU 1754 I Hate It 线段树单点更新求最大值

    题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...

  7. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  8. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  9. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

随机推荐

  1. PAT 1089 狼人杀-简单版(20 分)(代码+测试点分析)

    1089 狼人杀-简单版(20 分) 以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人杀"游戏中,1 号玩家 ...

  2. 网页 PHP 动态师范

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. $ each() 小结

    each()方法能使DOM循环结构简洁,不容易出错.each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组.多维数组.DOM, JSON 等等在javaScript开发过程中使用$ ...

  4. POJ3621或洛谷2868 [USACO07DEC]观光奶牛Sightseeing Cows

    一道\(0/1\)分数规划+负环 POJ原题链接 洛谷原题链接 显然是\(0/1\)分数规划问题. 二分答案,设二分值为\(mid\). 然后对二分进行判断,我们建立新图,没有点权,设当前有向边为\( ...

  5. UI设计初学者教程:色彩基础知识

    编辑:千锋UI设计 初学设计都会先认识三原色,通常我们说的三原色指的是颜料三原色:红.黄.蓝:其实三原色还有色光三原色:红.绿.蓝.我们通常说的红黄蓝就是减色法三原色,而红绿蓝是加色法三原色.可能这么 ...

  6. 八大排序算法的Java代码实现

    简单插入排序 public class QuickSort { private static void quickSort(int [] a, int low, int high){ if (low ...

  7. springboot server.address 配置问题

    1. server.address 为对应机器ip地址时 ,如 18.10.x.x 此时访问该服务只能使用 ip 访问 . 2. 配置为 127.0.0.1 时  可以使用 localhost  和  ...

  8. barcode(index)

    在很多情况下,我们需要把多个样本混合在一起,在同一个通道(lane)里完成测序.像转录组测序.miRNA测序.lncRNA测序.ChIP测序等等,通常每个样本所需要的数据量都比较少,远少于HiSeq一 ...

  9. mybatis学习 九 代理开发

    1.作用: 实现创建一个接口后把mapper.xml由mybatis生成接口的实现类,通过调用接口对象就可以获取 mapper.xml 中编写的 sql. 2.实现步骤: 2.1 创建一个接口 (1) ...

  10. Time.fixedDeltaTime和Time.DeltaTime

    在Update中使用 Time.deltaTime,获取到的是这一帧的时间,如果游戏卡,帧率低,那这个值就大.如果游戏流畅,帧率高,这个值就小,Time.deltaTime = 1.0f / 帧率 在 ...