您的位置:首页 > 其它

poj 2828 Buy Tickets【线段树 单点更新】

2015-08-04 22:55 393 查看
倒着插,先不理解意思,后来看一篇题解说模拟一下

手动模拟一下就好理解了-----

不过话说一直写挫---一直改啊-----

好心塞------

#include <cstdio>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

#define getmid(l,r) ((l) + ((r) - (l)) / 2)

typedef long long LL;
const double eps = 1e-8;
const int INF = (1 << 30) - 1;
const int maxn = 200005;

struct node{
int l,r,s;
}t[4*maxn];

struct Edge{
int pos,val;
}a[maxn];

int n;
int ans[maxn];

void Push_up(int p){
t[p].s = t[p<<1].s + t[p<<1|1].s;
}

void Build_tree(int p,int l,int r){
t[p].l = l;
t[p].r = r;
if(l == r){
t[p].s = 1;
return;
}
int mid = getmid(l,r);
Build_tree(p<<1,l,mid);
Build_tree(p<<1|1,mid+1,r);
Push_up(p);
}

void update(int idx,int p){
if(t[p].l == t[p].r){
t[p].s--;
return;
}
int mid = getmid(t[p].l,t[p].r);
if(idx <= mid) update(idx,p<<1);
else update(idx,p<<1|1);
Push_up(p);
}

int query(int idx,int p){
if(t[p].l == t[p].r) return t[p].l;
if(t[p<<1].s >= idx) return query(idx,p<<1);
else return query(idx-t[p<<1].s,p<<1|1);
}

void solve(){
Build_tree(1,1,n);
//    for(int i = 1;i <= 2*n;i++)
//    printf("t[%d].l = %d  t[%d].r = %d  t[%d].s = %d\n",i,t[i].l,i,t[i].r,i,t[i].s);
for(int i = n;i >= 1;i--){
int pos = a[i].pos;
int id = query(pos,1);
ans[id] = a[i].val;
update(id,1);
}
printf("%d",ans[1]);
for(int i = 2;i <= n;i++) printf(" %d",ans[i]);
printf("\n");
}

int main(){
while(scanf("%d",&n) != EOF){
for(int i = 1;i <= n;i++){
scanf("%d %d",&a[i].pos,&a[i].val);
a[i].pos++;
}
solve();
}
return 0;
}


View Code

加油啊~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: