zoukankan      html  css  js  c++  java
  • 【模板】三维偏序(陌上花开)

    V.【模板】三维偏序(陌上花开)

    树套树比CDQ分治可爱一万倍!!!数据结构什么的最可爱了!!!

    那么树套树如何进行三维偏序呢?

    首先,第一维直接排序掉。

    第二位用树状数组处理。

    第三维套上权值线段树。

    具体地说,因为我们要支持任何地方的单点修改以及前缀查询,就不得不套上树状数组。

    这样,树套树便能完美替代一切CDQ能做的事。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define mid ((l+r)>>1)
    int n,m,cnt,root[200100],res[200100];
    struct obj{
    	int a,b,c;
    	friend bool operator <(const obj &x,const obj &y){
    		if(x.a!=y.a)return x.a<y.a;
    		if(x.b!=y.b)return x.b<y.b;
    		return x.c<y.c;
    	}
    	friend bool operator ==(const obj &x,const obj &y){
    		return x.a==y.a&&x.b==y.b&&x.c==y.c;
    	}
    }q[100100];
    struct SegTree{
    	int lson,rson,sum;
    }seg[10010000];
    void add(int &x,int l,int r,int P){
    	if(l>P||r<P)return;
    	if(!x)x=++cnt;
    	seg[x].sum++;
    	if(l==r)return;
    	add(seg[x].lson,l,mid,P),add(seg[x].rson,mid+1,r,P);
    }
    void ADD(int x,int y){
    	while(x<=m)add(root[x],1,m,y),x+=x&-x;
    }
    int sum(int x,int l,int r,int P){
    	if(!x||l>P)return 0;
    	if(r<=P)return seg[x].sum;
    	return sum(seg[x].lson,l,mid,P)+sum(seg[x].rson,mid+1,r,P);
    }
    int SUM(int x,int y){
    	int Sum=0;
    	while(x)Sum+=sum(root[x],1,m,y),x-=x&-x;
    	return Sum;
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].c);
    	sort(q+1,q+n+1);
    	for(int i=1,j=1;i<=n;i=j){
    		while(q[j]==q[i])ADD(q[j].b,q[j].c),j++;
    		res[SUM(q[i].b,q[i].c)-1]+=j-i;
    	}
    	for(int i=0;i<n;i++)printf("%d\n",res[i]);
    	return 0;
    }
    

  • 相关阅读:
    css居中问题(转)
    Request.ServerVariables 各个参数的用法
    html5 画个球碰撞
    递归生成json
    AspNetPager分页结合存储过程的用法
    sql+aspnetpager+查询功能
    求1+2+……+n
    几种排序的比较 bitmapsort,qsort,set
    利用两个栈,反转其中一个栈的元素
    进程间通信(IPC, Inter Process Communication)读书笔记
  • 原文地址:https://www.cnblogs.com/Troverld/p/14611097.html
Copyright © 2011-2022 走看看