HDU-2828(线段树创新)

来源:互联网 发布:产品宣传视频制作软件 编辑:程序博客网 时间:2024/05/14 12:36

题目其实还是挺难理解的,,我读了很多遍才读懂,,,悲哀呀...

摸到题目也是不知道怎么做...

更别说往线段树上想了,,根本就想不到呀....看了比人的代码后,还是云里雾里的,也不是很清楚,,,

但是自己能敲出来,其实这样是很悲哀的,,因为到下次还是不会,,,我会尽力理解的,,做题不要做数量,,,而是要做思想,如果成不了自己的东西,那么不好意思,你在浪费时间,

而你在题目上花的时间也就全部浪费了..

贴出代码:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>int flag;struct Node{int a;int b;int num;int val;}tree[888888];int pos[200005];int val[200005];int temp[200005];void Buildtree(int i,int a,int b){tree[i].a=a;tree[i].b=b;tree[i].num=b-a+1;if(a==b)return;int mid=(a+b)>>1;Buildtree(i<<1,a,mid);Buildtree(i<<1|1,mid+1,b);}void update(int i,int pos,int val){tree[i].num--;if(tree[i].a==tree[i].b){tree[i].val=val;//printf("i==%d__val==%d\n",i,tree[i].val);return;}if(pos<tree[i<<1].num)update(i<<1,pos,val);elseupdate(i<<1|1,pos-tree[i<<1].num,val);}void getnum(int i){if(tree[i].a==tree[i].b){temp[flag++]=tree[i].val;//printf("i===%d_____val===%d\n",i,tree[i].val);return;}getnum(i<<1);getnum(i<<1|1);}int main(){int N;while(scanf("%d",&N)!=EOF){Buildtree(1,1,N);for(int i=1;i<=N;i++){scanf("%d%d",&pos[i],&val[i]);}//for(i=1;i<=10;i++)//{//printf("i==%d___a==%d___b=%d____num=%d___cal==%d\n",i,tree[i].a,tree[i].b,tree[i].num,tree[i].val);//}for(i=N;i>0;i--){update(1,pos[i],val[i]);}flag=0;getnum(1);for(i=0;i<N;i++){printf(i==N-1?"%d\n":"%d ",temp[i]);}}return 0;}