Flower[hdu4325][線段樹][離散化]
阿新 • • 發佈:2018-11-25
離散化 線段樹區間修改+單點查詢就可以了
#include<cstdio> #include<cstring> #include<algorithm> #include<string> #define N 100050 using namespace std; int s[N],t[N],b[N<<2],a[N],n,m,T; int val[N<<2],tag[N<<2],ret; int read(){ int cnt=0;char ch=0; while(!isdigit(ch))ch=getchar(); while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar(); return cnt; } void Init(){ ret=0; memset(val,0,sizeof(val)); memset(tag,0,sizeof(val)); } void Pushup(int x){val[x] = val[x<<1] + val[x<<1|1];} void Pushdown(int x){ if(tag[x]){ val[x<<1] += tag[x]; val[x<<1|1] += tag[x]; tag[x<<1] += tag[x]; tag[x<<1|1] += tag[x]; tag[x]=0; } } void Update(int x,int l,int r,int L,int R){ if(L<=l && r<=R){ val[x]++ , tag[x]++; return; } Pushdown(x); int mid = (l+r)>>1; if(L<=mid) Update(x<<1,l,mid,L,R); if(R>mid) Update(x<<1|1,mid+1,r,L,R); Pushup(x); } int Quary(int x,int l,int r,int pos){ if(l==r) return val[x]; Pushdown(x); int mid = (l+r)>>1; if(pos<=mid) return Quary(x<<1,l,mid,pos); else return Quary(x<<1|1,mid+1,r,pos); } int main(){ T=read(); for(int Case=1;Case<=T;Case++){ Init(); n=read(),m=read(); for(int i=1;i<=n;i++){ s[i] = b[++ret] = read(); t[i] = b[++ret] = read(); } for(int i=1;i<=m;i++){ a[i] = b[++ret] = read(); } sort(b+1,b+ret+1); int siz = unique(b+1,b+n*2+m+1) - (b+1); for(int i=1;i<=n;i++){ int L=lower_bound(b+1,b+siz+1,s[i])-b; int R=lower_bound(b+1,b+siz+1,t[i])-b; Update(1,1,siz,L,R); } printf("Case #%d:\n",Case); for(int i=1;i<=m;i++){ int x=lower_bound(b+1,b+siz+1,a[i])-b; printf("%d\n",Quary(1,1,siz,x)); } }return 0; }