POJ 2828 线段树 水题

来源:互联网 发布:三星n9008刷4g网络 编辑:程序博客网 时间:2024/05/17 09:28

线段树部分很简单

重点是处理的思想

对数据从后往前插入队列


#include "stdio.h"#include "string.h"#include "math.h"#include "stdlib.h"struct comp{int l,r,mid,sum,w;} data[800008];int first;int a[200001],b[200001];void build(int l,int r,int k){data[k].l=l;data[k].r=r;data[k].mid=(l+r)/2;data[k].sum=0;if (l==r) return ;build(l,data[k].mid,k*2);build(data[k].mid+1,r,k*2+1);}void insert(int x,int w,int k){int ll;if (data[k].l==data[k].r){data[k].w=w;data[k].sum=1;return ;}ll=data[k*2].r-data[k*2].l+1;if (x+data[k*2].sum<ll) insert(x,w,k*2);else insert(x-(ll-data[k*2].sum),w,k*2+1);data[k].sum=data[k*2].sum+data[k*2+1].sum;}void search(int k){if (data[k].l==data[k].r){if (first==0) {first=1;printf("%d",data[k].w);}else printf(" %d",data[k].w);return ;}search(k*2);search(k*2+1);}int main(){int n,i;while (scanf("%d",&n)!=EOF){build(1,n,1);for (i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);for (i=n;i>=1;i--)insert(a[i],b[i],1);first=0;search(1);printf("\n");}return 0;}


原创粉丝点击