题意:
n个区间 ,给出区间的左右坐标 ,区间内填满宽度为1的箱子,有m个板子给出板子的高度和左右坐标(同高度不重叠)
所有箱子从上向下落,求每块板子能接到的箱子数。
分析:
首先给的区间很大,一开始直接存ME了,所以要先把给定的区间离散化 箱子的宽度是1则使维护区间左闭右开,才能得正确的数量。
#include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <string> #include <cctype> #include <complex> #include <cassert> #include <utility> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; typedef pair<int,int> PII; typedef long long ll; #define lson l,m,rt<<1 #define pi acos(-1.0) #define rson m+1,r,rt<<1|1 #define All 1,N,1 #define N 100010 #define read freopen("in.txt", "r", stdin) const ll INFll = 0x3f3f3f3f3f3f3f3fLL; const int INF= 0x7ffffff; const int mod = 1000000007; int res[4*N],f[1<<20],x,y; ll sum[1<<20],tmp[N],add[1<<20]; struct brick{ int l,r,lid,rid; }a[N]; struct board{ int l,r,lid,rid,h,id; }b[N]; bool cmp(board u,board v){ return u.h>v.h; } void pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void pushdown(int rt,int l,int r){ int mid=(l+r)>>1; if(add[rt]){ add[rt<<1]+=add[rt]; add[rt<<1|1]+=add[rt]; sum[rt<<1]+=1LL*(res[mid+1]-res[l])*add[rt]; sum[rt<<1|1]+=1LL*(res[r+1]-res[mid+1])*add[rt]; add[rt]=0; } } void build(int l,int r,int rt){ sum[rt]=add[rt]=f[rt]=0; if(l==r)return; int m=(l+r)>>1; build(lson); build(rson); } void update_add(int L,int R,int v,int l,int r,int rt){ if(L<=l&&R>=r){ add[rt]+=v; sum[rt]+=(res[r+1]-res[l])*v; return; } pushdown(rt,l,r); int m=(l+r)>>1; if(L<=m)update_add(L,R,v,lson); if(R>m)update_add(L,R,v,rson); pushup(rt); } void update_cle(int L,int R,int l,int r,int rt){ if(f[rt])return; if(L<=l&&R>=r){ sum[rt]=0; f[rt]=1; return; } pushdown(rt,l,r); int m=(l+r)>>1; if(L<=m)update_cle(L,R,lson); if(R>m)update_cle(L,R,rson); pushup(rt); } ll query(int L,int R,int l,int r,int rt){ if(f[rt])return 0; if(L<=l&&R>=r){ return sum[rt]; } pushdown(rt,l,r); ll num=0; int m=(l+r)>>1; if(L<=m)num+=query(L,R,lson); if(R>m)num+=query(L,R,rson); return num; } int main() { while(~scanf("%d%d",&x,&y)){ int len=0; for(int i=0;i<x;++i){ scanf("%d%d",&a[i].l,&a[i].r); res[len++]=a[i].l; res[len++]=a[i].r; } for(int i=0;i<y;++i){ scanf("%d%d%d",&b[i].l,&b[i].r,&b[i].h); res[len++]=b[i].l; res[len++]=b[i].r; b[i].id=i; } //离散化 sort(res,res+len); len=unique(res,res+len)-res; for(int i=0;i<x;++i){ a[i].lid=lower_bound(res,res+len,a[i].l)-res; a[i].rid=lower_bound(res,res+len,a[i].r)-res; } for(int i=0;i<y;++i){ b[i].lid=lower_bound(res,res+len,b[i].l)-res; b[i].rid=lower_bound(res,res+len,b[i].r)-res; } build(0,len-1,1); for(int i=0;i<x;++i) update_add(a[i].lid,a[i].rid-1,1,0,len-1,1);//左开右闭 sort(b,b+y,cmp); for(int i=0;i<y;++i){ tmp[b[i].id]=query(b[i].lid,b[i].rid-1,0,len-1,1); update_cle(b[i].lid,b[i].rid-1,0,len-1,1); } for(int i=0;i<y;++i){ printf("%I64d\n",tmp[i]); } printf("\n"); } return 0; }
时间: 2024-11-08 20:23:15