cdq+树状数组套替罪羊树。

cdq归并a,树套树解决b,c.

记住平衡树树根不能暴力清零!!!

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define Fname "partial_order"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=50001;
int n,ans;
struct frog{int a,b,c;};
frog f[maxn];
const double alpha=0.77777777;
class sgt{
public:int rt[maxn],tot;
private:
int ch[maxn*15][2],siz[maxn*15],val[maxn*15],div[maxn];
il vd dfs(const int&x){if(x)dfs(ch[x][0]),div[++div[0]]=x,dfs(ch[x][1]);}
il int divide(int l,int r){
#define mid ((l+r)>>1)
ch[div[mid]][0]=divide(l,mid-1);
ch[div[mid]][1]=divide(mid+1,r);
siz[div[mid]]=r-l+1;
return div[mid];
#undef mid
}
il vd rebuild(int*x){div[0]=0,dfs(*x),*x=divide(1,div[0]);}
il int*_ins(int&x,const int&num){
if(!x){x=++tot;siz[x]=1;val[x]=num;ch[x][0]=ch[x][1]=0;return NULL;}
int*p=_ins(ch[x][num>val[x]],num);
siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
if((siz[x]>>2)*3+2<min(siz[ch[x][0]],siz[ch[x][1]]))p=&x;
return p;
}
public:
sgt(){rep(i,0,n)rt[i]=0;siz[0]=0;}
il vd ins(int root,int num){int*p=_ins(root[rt],num);if(p)rebuild(p);}
il int query(int root,int num){
int ret=0,x=rt[root];
while(x)
if(num<val[x])x=ch[x][0];
else ret+=siz[ch[x][0]]+1,x=ch[x][1];
return ret;
}
};
class bit{
#define lb(o) ((o)&-(o))
public:
sgt s;
il vd update(int pos,int num){while(pos<=n)s.ins(pos,num),pos+=lb(pos);}
il vd query(int pos,int num){while(pos)ans+=s.query(pos,num),pos-=lb(pos);}
il vd hehe(int pos){while(pos<=n)s.rt[pos]=0,pos+=lb(pos);}
#undef lb
};
il vd cdq(int l,int r){
if(l==r)return;
static frog tmp[maxn];
static bit g;
#define mid ((l+r)>>1)
cdq(l,mid),cdq(mid+1,r);
g.s.tot=0;
int _l=l,_r=mid+1,L=mid+1,R=r+1,cnt=l;
while((_l^L)&&(_r^R))
if(f[_l].a<f[_r].a)g.update(f[_l].b,f[_l].c),tmp[cnt++]=f[_l++];
else g.query(f[_r].b,f[_r].c),tmp[cnt++]=f[_r++];
while(_r^R)g.query(f[_r].b,f[_r].c),tmp[cnt++]=f[_r++];
for(rg int i=l;i<_l;++i)g.hehe(f[i].b);
while(_l^L)tmp[cnt++]=f[_l++];
#undef mid
rep(i,l,r)f[i]=tmp[i];
}
int main(){
freopen(Fname".in","r",stdin);
freopen(Fname".out","w",stdout);
n=gi();
rep(i,1,n)f[i].a=gi();
rep(i,1,n)f[i].b=gi();
rep(i,1,n)f[i].c=gi();
cdq(1,n),printf("%d\n",ans);
return 0;
}

最新文章

  1. 集合2--毕向东java基础教程视频学习笔记
  2. js动画之平抛运动
  3. html canvas 骰子1
  4. JavaScript函数柯里化
  5. JAVA如何调用C/C++方法
  6. TODO:C# Socket
  7. cocos2d 遍历CCAarray
  8. Wilddog - 野狗常用知识点
  9. IDEA激活服務器
  10. 2017年Unity开发环境与插件配置安装(总体介绍)
  11. ES4:ElasticSearch 使用C#添加和更新文档
  12. Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件
  13. [物理学与PDEs]第1章第8节 静电场和静磁场 8.3 静磁场
  14. Note of Jieba ( 词云图实例 )
  15. mysql权限参考
  16. Juc中Atomic原子类总结
  17. cat &lt;&lt;EOF
  18. SSH免费登录
  19. QR 编码原理(三)
  20. 关于Discuz! X系列远程代码执行漏洞

热门文章

  1. UIWindow,UINavigationController与UIViewController之间的关系
  2. EF CodeFirst示例
  3. 【洛谷】【扩欧】P1516 青蛙的约会
  4. [HNOI2002]营业额统计(splay基础)
  5. Hive学习之路 (十四)Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANK
  6. HBase学习之路 (十)HBase表的设计原则
  7. [译]OpenGL像素缓冲区对象
  8. 节点和Topic通信
  9. LeetCode872. Leaf-Similar Trees
  10. 以代码爱好者角度来看AMD与CMD(转)