| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
为啥我数组飘到2000005才过#include <cstdio> #include <cstring> #include <iostream> #include <string> #include <cmath> #include <algorithm> using namespace std; #define maxn 2000005 struct mn{int id;int pos;int val;}man[maxn]; struct T{int sum;}tree[maxn*3]; int leaves[maxn]; void build(int a,int b,int root) { tree[root].sum=b-a+1; if(a==b) { //leaves[root]=a; return; } int mid=(a+b)/2; build(a,mid,root*2); build(mid+1,b,root*2+1); } void insert(int pos,int id,int a,int b,int root) { if(a==b) { leaves[root]=id; while(1) { if(root<1)break; tree[root].sum--; root>>=1; } return; } if(pos>tree[root].sum)return; else { if(pos<=tree[root*2].sum)//left { insert(pos,id,a,(a+b)/2,root+root); } else //right { insert(pos-tree[root*2].sum,id,(a+b)/2+1,b,1+root+root); } } } void output(int a,int b,int root,int &s) { if(a==b) { if(s==1) { printf("%d",man[leaves[root]].val); s=0; } else { printf(" %d",man[leaves[root]].val); } return; } output(a,(a+b)/2,root*2,s); output((a+b)/2+1,b,root*2+1,s); } int main() { int N; while(scanf("%d",&N)==1) { memset(tree,0,sizeof(tree)); memset(leaves,0,sizeof(leaves)); for(int i=1;i<=N;i++) { scanf("%d%d",&man[i].pos,&man[i].val); man[i].id=i; } build(1,N,1); for(int i=N;i>=1;i--) { insert(man[i].pos+1,man[i].id,1,N,1); } int d=1; output(1,N,1,d); printf("\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator