Discretization + Tree-like array
First, the coordinates are discretized, the end of each segment is labeled 1.
When asked how many segments there are in a segment, just ask what the interval is and how much it is, and then mark the end of the segment as 0 after the query is over.
#include <cstdio>#include<cstring>#include<cmath>#include<queue>#include<algorithm>using namespacestd;Const intmaxn=2*1e5+Ten;structx{intX,y,ans,id;} p[2*MAXN];intN;intlsh[2*Maxn],tot;intc[2*MAXN];BOOLcmpConstX&a,Constx&b) { returna.x<b.x;}BOOLCMP2 (ConstX&a,Constx&b) { returna.id<b.id;}intLowbit (intx) { returnx& (-x);}voidUpdateintPosintval) { while(pos<=2*N) {C[pos]=c[pos]+Val; POS=pos+Lowbit (POS); }}intGetsum (intPOS) { intres=0; while(pos>0) {res=res+C[pos]; POS=pos-Lowbit (POS); } returnRes;}int Get(intnum) { intL=0, r=tot-1; while(l<=r) {intMid= (L+R)/2; if(lsh[mid]<=num) { if(Lsh[mid]==num)returnMid+1; ElseL=mid+1; } Elser=mid-1; }}intMain () {scanf ("%d",&N); for(intI=1; i<=n;i++) { intLi,ri; scanf"%d%d",&li,&RI); Lsh[tot++]=li; lsh[tot++]=RI; p[i].x=li; P[i].y=ri; P[i].id=i; } sort (Lsh,lsh+tot); for(intI=1; i<=n;i++) {p[i].x=Get(p[i].x); P[i].y=Get(P[I].Y); } sort (P+1, p+1+n,cmp); Memset (c,0,sizeofc); for(intI=1; i<=n;i++) Update (P[I].Y,1); for(intI=1; i<=n;i++) { if(p[i].x+1>p[i].y-1) p[i].ans=0; ElseP[i].ans=getsum (p[i].y-1)-getsum (p[i].x+1); Update (P[I].Y,-1); } sort (P+1, p+1+N,CMP2); for(intI=1; i<=n;i++) printf ("%d\n", P[i].ans); return 0;}
Codeforces 652D Nested Segments