cogs2479 偏序 cdq+树套树
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;
}
cogs2479 偏序 cdq+树套树的更多相关文章
- 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)
[题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)
题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...
- 2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组,CDQ分治
TMD...这题卡内存卡的真优秀... 所以以后还是别用主席树的写法...不然怎么死的都不知道... 树套树中,主席树方法开权值线段树...会造成空间的浪费...这道题内存卡的很紧... 由于树套树已 ...
- BZOJ4170 极光(CDQ分治 或 树套树)
传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...
- bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】
模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...
- bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- bzoj2253纸箱堆叠(动态规划+cdq分治套树状数组)
Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , 之后,即可自动化生产三边边长为 (a mod P,a^2 mod p,a^3 mod P) (a^4 ...
- Codechef-ANCESTOR(树套树/CDQ分治)
题意: 给定两棵有根树,各有 N 个点.两棵树上的点分别被从 1 到 N 标号.两棵树的根均为标号为 1 的节点. 你的任务非常简单:对于每个 i,找到一个 j(j != i),使得在两棵树中 j 都 ...
随机推荐
- [C++] 用Xcode来写C++程序[3] Constants
用Xcode来写C++程序[3] Constants 以下是一些基本数据的含义: 75 // int 75u // unsigned int 75l // long 75ul // unsigned ...
- 连接Mysql错误 error 1042 can't get hostname for your address
背景: 1.etc下的hosts文件有: 127.0.0.1 localhost 2.MySQL的my.ini配置文件: [mysqld] 节点下已经加入以下两行代码 skip-n ...
- [转载]Matlab中插值函数汇总和使用说明
http://blog.sciencenet.cn/blog-457143-679275.html MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,' ...
- November 17th 2016 Week 47th Thursday
Don't cry because it is over. Smile because it happened. 不要因为结束而哭泣:微笑吧,因为我们曾经拥有. My ex-girlfriend ha ...
- (十一)T检验-第二部分
了解什么是有效大小,尝试一个单一样本t检验的完整示例. 效应量 调查研究的一个重要方面是效应量,在实验性研究中或存在处理变量的研究中,效应量是指处理效应的大小,意思很直观: 在非实验性研究中,效应量是 ...
- ZOJ 4103 浙江省第16届大学生程序设计竞赛 D题 Traveler 构造
这个题,正赛的时候也没有过,不过其实已经有了正确的解法,可惜时间不多了,就没有去尝试. 题意是有n个点,i点能通向i-1,然后i和i*2.i*2+1互通. 请你构造一种路径从1能走完所有点,并且不重复 ...
- Ubuntu16.04如何彻底删除Apache2
虽然作为运维人员通常情况不建议随意删除Linux系统上面的任何软件,主要指生产环境下,测试环境也不能太随意. 但是有的时候,比如系统环境要变一变,我们就需要替换一些淘汰的软件,对此我们一般都会删除. ...
- Angular动态表单生成(八)
动态表单生成之拖拽生成表单(下) 我们的动态表单,最终要实现的效果与Form.io的在线生成表单的效果类似,可以参考它的demo地址:https://codepen.io/travist/full/x ...
- ASP.NET MVC中Section、Partial View 和 Child Action(转载)
概括的讲,View中的内容可以分为静态和动态两部分.静态内容一般是html元素,而动态内容指的是在应用程序运行的时候动态创建的内容.给View添加动态内容的方式可归纳为下面几种: Inline cod ...
- Linux 内存使用方法详细解析
我是一名程序员,那么我在这里以一个程序员的角度来讲解Linux内存的使用. 一提到内存管理,我们头脑中闪出的两个概念,就是虚拟内存,与物理内存.这两个概念主要来自于linux内核的支持. Linux在 ...