PAT1057

来源:互联网 发布:大司马淘宝店地址 编辑:程序博客网 时间:2024/06/06 05:00
<img src="http://img.blog.csdn.net/20140327112108859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3JlYXQyMDEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" align="middle" />//树状数组#include<stdio.h>const int maxn=100010;int n;int s[maxn];int num=0;char str[20];int tree_array[maxn];int lowbit(int x){return x&(-x);//tree_array[x]所管辖的区域长度,以及到上一个父节点的距离}void add(int pos,int val)//改变pos值{while(pos<maxn){tree_array[pos]+=val;pos+=lowbit(pos);}}int sum(int pos)//从tree_array[1]到tree_array[pos]的总和{int ans=0;while(pos>0){ans+=tree_array[pos];pos-=lowbit(pos);}return ans;}int find_x(int x)//寻找第x值所在的位置{int low=1;int high=maxn-1;while(low<high){int mid=(low+high)/2;if(x>sum(mid))low=mid+1;elsehigh=mid;}return low;}int main(){//freopen("in.txt","r",stdin);scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s",str);if(str[1]=='o'){if(num>0){num--;int x=s[num];add(x,-1);printf("%d\n",x);}elseprintf("Invalid\n");}else if(str[1]=='e'){if(num>0){int id=num/2+(num%2==0?0:1);int x=find_x(id);printf("%d\n",x);}elseprintf("Invalid\n");}else if(str[1]=='u'){int x;scanf("%d",&x);s[num++]=x;add(x,1);}}return 0;}

0 0
原创粉丝点击