zoj3299 線段樹區間更新,為什麼會T呢
阿新 • • 發佈:2018-11-08
/* 平臺和磚塊的座標離散化,邊緣座標轉換成單位長度 處理下落資訊,sum陣列維護區間的磚塊數量 把平臺按高度從高到低排序,詢問平臺區間的磚塊有多少,詢問後將該區域磚塊數置0 */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define maxn 100005 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ll long long structBlocks{ int l,r; }bks[maxn];//磚塊資訊 struct Boards{ int l,r,h,id; bool operator<(const Boards & a)const{ return h>a.h; } }bds[maxn];//平臺資訊 ll ans[maxn]; int data[maxn<<3],cnt,tot;//離散化 ll sum[maxn<<2],lazy[maxn],flag[maxn];//flag維護區間是否置零,優先順序大於lazy inline void pushup(intrt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } inline void pushdown(int l,int r,int rt){ if(flag[rt]){ sum[rt<<1]=sum[rt<<1|1]=0; flag[rt<<1]=flag[rt<<1|1]=1; flag[rt]=0; } else if(lazy[rt]){ int m=l+r>>1; lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt]; sum[rt<<1]+=lazy[rt]*(data[m]-data[l]+1); sum[rt<<1|1]+=lazy[rt]*(data[r]-data[m]); lazy[rt]=0; } } void setzero(int L,int R,int l,int r,int rt){ if(L<=l && R>=r){ sum[rt]=0; lazy[rt]=0; flag[rt]=1; return; } pushdown(l,r,rt); int m=l+r>>1; if(L<=m) setzero(L,R,lson); if(R>m) setzero(L,R,rson); pushup(rt); } void build(int l,int r,int rt){ sum[rt]=lazy[rt]=flag[rt]=0; if(l==r) return; int m=l+r>>1; build(lson);build(rson); } void update(int L,int R,int l,int r,int rt){ if(L<=l && R>=r){ lazy[rt]++; sum[rt]+=data[r]-data[l]+1; return; } pushdown(l,r,rt); int m=l+r>>1; if(L<=m) update(L,R,lson); if(R>m) update(L,R,rson); pushup(rt); } ll query(int L,int R,int l,int r,int rt){ if(L<=l && R>=r){ return sum[rt]; } pushdown(l,r,rt); int m=l+r>>1; ll ret=0; if(L<=m) ret+=query(L,R,lson); if(R>m) ret+=query(L,R,rson); return ret; } int main(){ int n,m; while(scanf("%d%d",&n,&m)==2){ tot=cnt=0; for(int i=0;i<n;i++){ scanf("%d%d",&bks[i].l,&bks[i].r); bks[i].r--; data[cnt++]=bks[i].l; data[cnt++]=bks[i].r; } for(int i=0;i<m;i++){ scanf("%d%d%d",&bds[i].l,&bds[i].r,&bds[i].h); bds[i].id=i; bds[i].r--; data[cnt++]=bds[i].l; data[cnt++]=bds[i].r; } int tmp=cnt; sort(data,data+cnt); for(int i=1;i<cnt;i++) if(data[i]-data[i-1]>1) data[tmp++]=data[i-1]+1; cnt=tmp; sort(data,data+cnt); tot=unique(data,data+cnt)-data; sort(bds,bds+m); build(0,tot,1); for(int i=0;i<n;i++){ int L=lower_bound(data,data+tot,bks[i].l)-data; int R=lower_bound(data,data+tot,bks[i].r)-data; update(L,R,0,tot,1); } //每次查詢後 for(int i=0;i<m;i++){ int L=lower_bound(data,data+tot,bds[i].l)-data; int R=lower_bound(data,data+tot,bds[i].r)-data; ans[bds[i].id]=query(L,R,0,tot,1); setzero(L,R,0,tot,1); } for(int i=0;i<m;i++) printf("%lld\n",ans[i]); } }