POJ 2828 线段树 水题
2013-09-05 19:10
330 查看
线段树部分很简单
重点是处理的思想
对数据从后往前插入队列
重点是处理的思想
对数据从后往前插入队列
#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; }
相关文章推荐
- POJ 2828 Buy Tickets(线段树)
- POJ 2828 Buy Tickets(线段树)
- HDU 4006 POJ 2828 线段树(排列/找有序位置)
- POJ 2828 线段树
- poj 2828 线段树
- POJ2828 Buy Tickets 线段树
- POJ Buy Tickets 2828(线段树)
- POJ 2828 Buy Tickets(线段树)
- POJ 2828 Buy Tickets(线段树)
- POJ 3264 Balanced Lineup(线段树水题)
- poj 2828(线段树单点更新)
- POJ - 2828 Buy Tickets (线段树单点更新)
- POJ 2828 线段树(想法)
- poj 2828 线段树 单点更新
- poj-2828-Buy Tickets-线段树-单点
- poj_2828线段树,逆序插入
- POJ 2828 Buy Tickets(线段树 )
- POJ 2828 线段树单点插入
- POJ 2828 Buy Tickets 线段树
- POJ 2828 tickets 【线段树 基础 单点更新】.cpp ※ 线段树基础总结