树套树bzoj3262陌上花开
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树套树bzoj3262陌上花开相关的知识,希望对你有一定的参考价值。
/*
【bzoj3262】陌上花开
Description
Input
Output
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#define M 5000005
using namespace std;
struct shu
{
int x,y,z;
}a[100005];
int n,m,sum[100005],ans[100005],sz,root[200005],w[M],v[M],sz1[M],lr[M],rr[M],rou[M];
int tmp;
bool cmp(shu a1,shu a2)
{
if(a1.x==a2.x&&a1.y==a2.y)
return a1.z<a2.z;
if(a1.x==a2.x)
return a1.y<a2.y;
return a1.x<a2.x;
}
void update(int a1)
{
sz1[a1]=sz1[lr[a1]]+sz1[rr[a1]]+w[a1];
}
void zuo(int &a1)
{
int t=lr[a1];
lr[a1]=rr[t];
rr[t]=a1;
update(a1);
update(t);
a1=t;
}
void you(int &a1)
{
int t=rr[a1];
rr[a1]=lr[t];
lr[t]=a1;
update(a1);
update(t);
a1=t;
}
void jiaa(int &a1,int a2)
{
if(a1==0)
{
sz++;
a1=sz;
v[a1]=a2;
sz1[a1]=1;
w[a1]=1;
rou[a1]=rand();
return;
}
sz1[a1]++;
if(v[a1]==a2)
{
w[a1]++;
return;
}
if(v[a1]>a2)
{
jiaa(lr[a1],a2);
if(rou[lr[a1]]<rou[a1])
zuo(a1);
}
else
{
jiaa(rr[a1],a2);
if(rou[rr[a1]]<rou[a1])
you(a1);
}
}
void jia(int a1,int a2)
{
for(;a1<=m;a1+=(a1&(-a1)))
jiaa(root[a1],a2);
}
void askk(int a1,int a2)
{
if(a1==0)
return;
if(v[a1]==a2)
{
tmp+=w[a1]+sz1[lr[a1]];
return;
}
if(v[a1]>a2)
askk(lr[a1],a2);
else
{
tmp+=w[a1]+sz1[lr[a1]];
askk(rr[a1],a2);
}
return;
}
void ask(int a1,int a2)
{
for(;a1;a1-=(a1&(-a1)))
askk(root[a1],a2);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(a[i].y==a[i+1].y&&a[i].z==a[i+1].z&&a[i].x==a[i+1].x&&i!=n)
sum[i+1]+=sum[i]+1;
else
{
tmp=0;
ask(a[i].y,a[i].z);
ans[tmp]+=sum[i]+1;
}
jia(a[i].y,a[i].z);
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
return 0;
}
以上是关于树套树bzoj3262陌上花开的主要内容,如果未能解决你的问题,请参考以下文章