[主席树]JZOJ 3379 查询
分析
离散化都不用的水题
把所有区间端点放进去一起跳瞎搞一通就行了
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <memory.h> using namespace std; const int N=2e5+10; const int Max=1e6; struct Seg { int v,l,r; }t[40*N]; int n,m,rt[N],cnt,l[N],r[N]; void Insert(int &x,int l,int r,int k) { t[++cnt]=t[x];x=cnt;t[x].v++; if (l==r) return; int mid=l+r>>1; if (k<=mid) Insert(t[x].l,l,mid,k); else Insert(t[x].r,mid+1,r,k); } int main() { scanf("%d%d",&n,&m); for (int i=1,a;i<=n;i++) scanf("%d",&a),rt[i]=rt[i-1],Insert(rt[i],0,Max,a); for (int i=1;i<=m;i++) { int k,p; scanf("%d%d",&k,&p); for (int i=1;i<=k;i++) scanf("%d%d",&l[i],&r[i]),l[i]=rt[l[i]-1],r[i]=rt[r[i]]; int L=0,R=Max,mid; while (L<R) { int rk=0;mid=L+R>>1; for (int i=1;i<=k;i++) rk+=t[t[r[i]].l].v-t[t[l[i]].l].v; if (p<=rk) { for (int i=1;i<=k;i++) l[i]=t[l[i]].l,r[i]=t[r[i]].l; R=mid; } else { for (int i=1;i<=k;i++) l[i]=t[l[i]].r,r[i]=t[r[i]].r; L=mid+1;p-=rk; } } printf("%d\n",L); } }
在日渐沉没的世界里,我发现了你。