hdu4325 线段树 成段更新
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 100010 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int sum[maxn<<2],mark[maxn<<2]; int B[maxn*3],x[maxn],y[maxn],que[maxn]; int find(int v,int k) { int l,m,r; l=1; r=k; while(l<=r) { m=(l+r)/2; if(B[m]==v) return m; else if(B[m]>v) r=m-1; else l=m+1; } return -1; } void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void pushdown(int rt) { if(mark[rt]) { mark[rt<<1]+=mark[rt]; mark[rt<<1|1]+=mark[rt]; sum[rt<<1]+=mark[rt]; sum[rt<<1|1]+=mark[rt]; mark[rt]=0; } } void build(int l,int r,int rt) { mark[rt]=sum[rt]=0; if(l==r) { return ; } int m=(l+r)/2; build(lson); build(rson); } void updata(int L,int R,int c,int l,int r,int rt) { if(l>=L&&R>=r) { sum[rt]+=c; mark[rt]+=c; return ; } pushdown(rt); int m=(l+r)/2; if(m>=L) updata(L,R,c,lson); if(R>m) updata(L,R,c,rson); pushup(rt); } int query(int p,int l,int r,int rt) { if(l==r) { return sum[rt]; } pushdown(rt); int m=(l+r)/2; if(m>=p) return query(p,lson); else return query(p,rson); } int main() { int t,i,n,m,ff=0; scanf("%d",&t); while(t--) { int num=1; scanf("%d%d",&n,&m); for(i=0;i<n;i++) { scanf("%d%d",&x[i],&y[i]); B[num++]=x[i]; B[num++]=y[i]; } for(i=0;i<m;i++) { scanf("%d",&que[i]); B[num++]=que[i]; } sort(B+1,B+num); int k=2; for(i=2;i<num;i++) { if(B[i]!=B[i-1]) { B[k++]=B[i]; } } for(i=k-1;i>1;i--) { if(B[i]!=B[i-1]+1) B[k++]=B[i-1]+1; } sort(B+1,B+k); build(1,k-1,1); for(i=0;i<n;i++) { int fx=find(x[i],k-1); int fy=find(y[i],k-1); // printf("%d %d\n",fx,fy); updata(fx,fy,1,1,k-1,1); } printf("Case #%d:\n",++ff); for(i=0;i<m;i++) { int fp=find(que[i],k-1); printf("%d\n",query(fp,1,k-1,1)); } } }