首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

线段树典型题解-poj2828

2012-08-15 
线段树典型例题--poj2828逆序处理。注意到如果逆序插入,则每次插入的位置都是第x个空位。所以可以用线段树来

线段树典型例题--poj2828

逆序处理。

注意到如果逆序插入,则每次插入的位置都是第x个空位。

所以可以用线段树来寻找第x个合法位置

【代码】

#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <algorithm>using namespace std;const int N=200005;int sum[N*3],pos[N],val[N],p[N];int n;void build(int i,int l,int r){    sum[i]=r-l+1;    if (l==r) return;    int mid=(l+r)/2;    build(i*2,l,mid);    build(i*2+1,mid+1,r);}void ins(int i,int l,int r,int pos,int val){    sum[i]--;    if (l==r)    {        p[l]=val;        return;    }    int mid=(l+r)/2;    if (sum[i*2]-pos>=0)        ins(i*2,l,mid,pos,val);    else        ins(i*2+1,mid+1,r,pos-sum[i*2],val);}int main(){    int i;    freopen("in","r",stdin);    while (scanf("%d",&n)!=EOF)    {        for (i=1;i<=n;i++)            scanf("%d%d",&pos[i],&val[i]);        build(1,1,n);        for (i=n;i>=1;i--)            ins(1,1,n,pos[i]+1,val[i]);        for (i=1;i<n;i++)            printf("%d ",p[i]);        printf("%d\n",p[n]);    }}



热点排行