luogu_3810

就是将逆序对转化到了三维上去

原理等我寒假再补

第一维sort解决

第二维并归排序(cdq)解决

第三维树状数组

// luogu-judger-enable-o2
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using std::sort; const int maxn=101000;
const int Max=201000; struct node
{
int a,b,c;
int size,ans;
bool operator <= (const node &A)
{
if(b!=A.b) return b<=A.b;
if(c!=A.c) return c<=A.c;
return c<=A.c;
}
}; node Q[maxn],tmp[maxn];
int base[Max],t[Max],len,Tim;
int TOT[Max<<1];
int n,m; void add(int pos,int val,int T)
{
while(pos<=len)
{
if(t[pos]!=T)
{
t[pos]=T;
base[pos]=0;
}
base[pos]+=val;
pos+=(pos&(-pos));
}
return ;
} int sum(int pos,int T)
{
int res=0;
while(pos)
{
if(t[pos]!=T)
{
t[pos]=T;
base[pos]=0;
}
res+=base[pos];
pos-=(pos&(-pos));
}
return res;
} bool compare(const node &a,const node &b)
{
if(a.a!=b.a) return a.a<b.a;
if(a.b!=b.b) return a.b<b.b;
return a.c<b.c;
} void cdq(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>1,o=0,T=++Tim;
cdq(l,mid);cdq(mid+1,r);
int q=l,p=mid+1;
while(q<=mid&&p<=r)
{
if(Q[q]<=Q[p])//按照第二维顺序,左区间的元素算贡献(利用bit),右区间的元素进行第三维元素的顺序对查询
{
add(Q[q].c,Q[q].size,T);//利用时间戳
tmp[o++]=Q[q++];//回收元素
}
else
{
Q[p].ans+=sum(Q[p].c,T);
tmp[o++]=Q[p++];
}
}
while(q<=mid) tmp[o++]=Q[q++];//将没有处理的元素压回tmp
while(p<=r)
{
Q[p].ans+=sum(Q[p].c,T);
tmp[o++]=Q[p++];
}
for(int i=0;i<o;i++) Q[l+i]=tmp[i];//回填
return ;
} int main()
{
scanf("%d%d",&n,&m);
len=m;
for(int i=1;i<=n;i++)
scanf("%d%d%d",&tmp[i].a,&tmp[i].b,&tmp[i].c);
sort(tmp+1,tmp+1+n,compare);//解决第一位顺序
int T=0;
for(int i=1,pas=1;i<=n;i++)//去重,cdq无法正确处理相同原元素
{
if(tmp[i].a!=tmp[i+1].a||tmp[i].b!=tmp[i+1].b||tmp[i].c!=tmp[i+1].c)
{
Q[++T]=tmp[i];
Q[T].size=pas;Q[T].ans=0;
pas=1;
}
else pas++;
}
cdq(1,T);
for(int i=1;i<=T;i++) TOT[Q[i].ans+Q[i].size-1]+=Q[i].size;
for(int i=0;i<n;i++) printf("%d\n",TOT[i]);
}

三维偏序 cdq的更多相关文章

  1. Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治

    Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...

  2. 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)

    链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...

  3. bzoj3262: 陌上花开 三维偏序cdq分治

    三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************* ...

  4. [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解

    原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...

  5. BZOJ3262 陌上花开 —— 三维偏序 CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit ...

  6. BZOJ 2716/2648 SJY摆棋子 (三维偏序CDQ+树状数组)

    题目大意: 洛谷传送门 这明明是一道KD-Tree,CDQ分治是TLE的做法 化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$ 而$CDQ$分治只能解决$x1 \leq x ...

  7. BZOJ 1176/2683 Mokia (三维偏序CDQ+树状数组)

    题目大意: 洛谷传送门 三维偏序裸题.. 每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $ 询问操作拆成$4$个容斥 接下来就是$CDQ$了,外层按t排序, ...

  8. BZOJ 2244 [SDOI2011]拦截导弹 (三维偏序CDQ+线段树)

    题目大意: 洛谷传送门 不愧为SDOI的duliu题 第一问?二元组的最长不上升子序列长度?裸的三维偏序问题,直接上$CDQ$ 由于是不上升,需要查询某一范围的最大值,并不是前缀最大值,建议用线段树实 ...

  9. BZOJ 2141 排队 (三维偏序CDQ+树状数组)

    题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作 ...

  10. BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)

    题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...

随机推荐

  1. CodeForces 606A(水)

    这道题之前没注意到at least,审题不仔细啊,两个问题解法还是有些许区别的 有at least的 #include <iostream> #include <string> ...

  2. SQL修改表结构

    --(1)向数据库Student表中添加Name字段 use MR_NXT alter table student add Name char(20) --(2)将Student表中Name的字段的数 ...

  3. 前端动画小记---bilibili ( ゜-゜)つロ客户下载小动画

    逛哔哩哔哩 ( ゜-゜)つロPC版的时候看到一个蛮有意思的动画,指导用户去下载客户端,于是摸索实现了一个. 原动画效果 可以看到,一个静止的小电视人,当鼠标移动到电视人身上时,电视人慢慢变身成为一个小 ...

  4. eslint规则记录

    "off"或者0 //关闭规则关闭 "warn"或者1 //在打开的规则作为警告(不影响退出代码) "error"或者2 //把规则作为一个 ...

  5. sql With(NoLock),With(ReadPast)

    --------------- create table tmp1 ( id int primary key, name ) ) ----------- insert into tmp1(id,nam ...

  6. LaTeX 使用:itemize,enumerate,description 用法

    itemize和enumerate还有description 是LaTeX里列举的三种样式,分别讲一些使用技巧.itemize(意为分条目): \begin{itemize} \item[*] a \ ...

  7. 单选按钮(RadioButton)

    一:RadioButton的相关属性: 1.Activity //单选按钮 public class RadioButtonActivity extends Activity { private Co ...

  8. MSDN版、OEM版、RTM版、VOL版等的区别

    我们常常听说操作系统的MSDN版.OEM版.RTM版.VOL版等等,它们到底是什么意思,有什么不同呢? (一)MSDN (Microsoft Developer Network)版MSDN软件是微软公 ...

  9. C#:安装Windows服务,动态指定服务名及描述(转载)

    来源:http://www.cnblogs.com/Fooo/p/3476675.html Installer.cs public Installer() { InitializeComponent( ...

  10. C++ Primer(6) 模板和泛型编程(上)

    问题聚焦: 泛型编程是独立于变量类型的方式编写代码: 模板是泛型编程的基础. 本篇主要介绍模板的基础知识,包括:模板的定义和模板的实例化. 1 模版定义 必要性: Demo int compare(c ...