经典的矩形面积并 对y离散后 建树 用拆点后的以x为顺序 依次更新
代码:
#include#include #include #include #include #include #include #include #include #define LL long longusing namespace std;const int N=40005;struct node{ int l,r; LL H;//这个高度主要是用来查找的 LL h;//这一段的最高度 int cover;//被覆盖次数}mem[N*4];LL Y[N*2];//高度struct poin{ int k; LL x; LL h;}point[N*2];//拆点 k 表示左点 还是右点bool cmp(poin a,poin b){ if(a.x==b.x) return a.h y) return x; return y;}void build(int x,int l,int r){ mem[x].cover=0; mem[x].l=l; mem[x].r=r; mem[x].h=0; if(l==r) { mem[x].H=Y[l]; return ; } int mid=(l+r)>>1; build(x*2,l,mid); build(x*2+1,mid+1,r); mem[x].H=Lmax(mem[x*2].H,mem[x*2+1].H);//更新最高度}void add(int x,int k){ if(mem[x].l==mem[x].r) { mem[x].cover+=point[k].k;//更新cover if(mem[x].cover>0)//大于0 为有覆盖 所以高度为 H 否则为0 mem[x].h=mem[x].H; else mem[x].h=0; return ; } if(Labs(point[k].h)<=mem[x*2].H) add(x*2,k); else add(x*2+1,k); mem[x].h=Lmax(mem[x*2].h,mem[x*2+1].h);//更新}int main(){ // freopen("data.txt","r",stdin); int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i