我好菜,佬们好厉害。
比赛的时候正好是电路实验就错过了啊啊啊啊
今天中午补题,大概一个小时A了三道,D2实在想不起来了
看别人的代码都是拿线段树写的,(鬼知道我线段树多久没用过了啊啊啊)
写到自闭叻。
主要就是用线段树二分寻找数组中某位置 x ,满足1 ~ x 的和为 pos ,还是01与线段树
int n,m; struct IN {int x,id;} a[N],b[N]; struct INN {int k,pos,id,ans;} q[N]; int cmp(IN aa,IN bb) { if(aa.x==bb.x) return aa.id<bb.id; return aa.x>bb.x; } int cmp1(INN aa,INN bb){return aa.k<bb.k;} int cmp2(INN aa,INN bb){return aa.id<bb.id;} struct TREE { #define ls rt<< 1,l,mid #define rs rt<<1 | 1,mid+1,r int sum[N<<2]; void init(){for(int i=0;i<=n;++i) sum[i]=0;} void update(int rt,int l,int r,int pos) { if(l==r) { sum[rt]=1;//噗,一开始更新成sum[l]我是咋想的 return ; } int mid=(l+r)>>1; if(pos<=mid) update(ls,pos); else update(rs,pos); sum[rt]=sum[rt<<1]+sum[rt<<1 | 1]; } int que(int rt,int l,int r,int pos) { if(l==r) return a[l].x; int mid=(l+r)>>1; if(sum[rt<<1]>=pos) return que(ls,pos); else return que(rs,pos-sum[rt<<1]); //记得剪掉左子树 } }tree; int main() { fast; cin>>n; for(int i=1;i<=n;++i) { cin>>a[i].x; a[i].id=i; b[i]=a[i]; } sort(b+1,b+n+1,cmp); cin>>m; for (int i = 1; i <= m; ++i) cin>>q[i].k>>q[i].pos,q[i].id=i; sort(q+1,q+m+1,cmp1); int now=0; tree.init(); for (int i = 1; i <= m; ++i) { while(now<q[i].k) tree.update(1,1,n,b[++now].id); q[i].ans=tree.que(1,1,n,q[i].pos); } sort(q+1,q+m+1,cmp2); for (int i = 1; i <= m; i++) cout<<q[i].ans<<endl; //stop; return 0; }