对方法不理解透彻!照搬是没有用的,要彻底理解。一些特殊情况没出什么问题。但一当到大量数据的测试时,WA了!哎,幸亏慢慢找还能找出来,不然我今晚就耗在这睡觉都睡不好了。嘿嘿!
好了,最近这段时间对并查集,线段树,树状数组的学习就先告一段落了。总的来说这段时间的成效还是不错的哦。明天开始我要进入关于搜索的学习,加油吧,孩子。继续学习,继续刷分去吧!呼呼~
#include#include #include #define MAXN 200200 using namespace std; struct seg_tre{ int l,r; int cnt; }Node[3*MAXN]; struct person{ int pos,val; }P[MAXN]; int N,i; int ans[MAXN]; int Mid(int step){ return (Node[step].l+Node[step].r)/2; } void Build(int step,int l,int r){ Node[step].l=l; Node[step].r=r; Node[step].cnt=r-l+1; if(l==r) return; Build(2*step,l,Mid(step)); Build(2*step+1,Mid(step)+1,r); } void Insert(int index,int pos){ Node[index].cnt--; if(Node[index].l==Node[index].r) { ans[Node[index].l]=P[i].val; return; } if(pos<=Node[2*index].cnt) Insert(2*index,pos); else Insert(2*index+1,pos-Node[2*index].cnt); //因为这里WA了N次,呜呜。。。是减去Node[2*index].cnt,不是减去左边的。 //说明思路还不是很清晰!!不理解彻透! } int main() { freopen("acm.in","r",stdin); while(scanf("%d",&N)!=EOF){ Build(1,1,N); for(i=1 ;i<=N ;i++){ scanf("%d%d",&P[i].pos,&P[i].val); } for(i=N ;i >0 ;i--){ Insert(1,P[i].pos+1); } for(i=1 ;i