P3810 三维偏序(陌上花开)

权值线段树套平衡树ac代码

#include
#include
#include
#define mp_ make_pair
#define Pr pair
const int NN=400100;
const int inf=0x3f3f3f3f;
ll n,m,k,x,y,z,q,W,T,N,cnt,tmp,dst,cas,val,tot,num;
//rbtree的开法,必须用pair,rbtree里相同值只存一个,用pair的second递增保证每个元素都能存进去,还能方便查排名
tree<Pr,null_type,less<Pr>,rb_tree_tag,tree_order_statistics_node_update> rbt[200100];
pair<int,Pr> a[NN];
int ans[NN];

void update(int i,int val){
	//将平衡树当做权值
   	for(;i<=k;i+=i&-i) rbt[i].insert(mp_(val,++num));
}

int query(int i,int val){
    int res=0;
    //查排名
    for(;i;i-=i&-i)res+=rbt[i].order_of_key(Pr(val,++num));
    return res;
}

int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    //freopen("testdata.txt","r",stdin);
    cin>>n>>k;
    int cnt=1;
    for(int i=1;i<=n;i++) cin>>a[i].first>>a[i].second.first>>a[i].second.second;
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++){
        update(a[i].second.first,a[i].second.second);
        if(a[i]==a[i+1]) cnt++;
        else ans[query(a[i].second.first,a[i].second.second)]+=cnt,cnt=1;
    }
    for(int i=1;i<=n;i++) cout<<ans[i]<<'\n';
}

你可能感兴趣的:(数据结构)