好,这是一道三维偏序的模板题

当然没那么简单.....

首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了:

这么好听的名字#(滑稽)

那么我们看了题面后就发现:这就是一个三维偏序。只不过ans不加在一起,而是加在每朵花内部。

很裸的一道CDQ分治,CDQ一维,sort一维,TreeArray一维,然后就爆0了......

把cmp函数改完备之后还是爆0,为什么呢?

看一下这一组样例:

5 3

1 3 3

3 3 3

3 3 3

3 3 3

3 3 3

看得出来正确答案是1 0 0 0 4

但是我们的程序无情的输出了1 1 1 1 1

这表明了什么?要去重!

就用类似离散化的方式去重,然后就——爆0了!

......

然后发现是代码里一个小细节写错了,害得我调了一晚上...

上代码。

 #include <cstdio>
#include <algorithm>
using namespace std;
const int N = ,K = ;
struct Node
{
int a,b,c,ans,sum;
bool operator==(const Node &x)const
{
return (this->a==x.a)&&(this->b==x.b)&&(this->c==x.c);
}
}node[N];
bool cmp_a(Node x,Node y) /// !!!!
{
if(x.a!=y.a)return x.a<y.a;
if(x.b!=y.b)return x.b<y.b;
return x.c<y.c;
}
bool cmp_b(Node x,Node y)
{
if(x.b!=y.b)return x.b<y.b;
return x.c<y.c;
}
int lowbit(int x){return x&(-x);}
int TA[K],n,k;
void add(int x,int a)
{
if(!x) return;
for(int i=x;i<=k;i+=lowbit(i)) TA[i]+=a;
return;
}
int getsum(int x)
{
if(!x)return ;int ans=;
for(int i=x;i>;i-=lowbit(i)) ans+=TA[i];
return ans;
}
void merge(int l,int r)
{
//printf("merge:%d %d\n",l,r);
int mid=(l+r)>>;
sort(node+l,node+mid+,cmp_b);
sort(node+mid+,node+r+,cmp_b);
int i=l,j=mid;
while(j<r)
{
j++;
while(node[i].b<=node[j].b&&i<=mid)
add(node[i].c,node[i].sum),i++;
node[j].ans+=getsum(node[j].c);//printf("node[%d].ans+=%d\n",j,getsum(node[j].c));
}
for(j=l;j<i;j++) add(node[j].c,-*node[j].sum);/// !!!!
//fill(TA,TA+K,0);
return;
}
void CDQ(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>;
CDQ(l,mid);CDQ(mid+,r);
merge(l,r);
return;
}
int ans[N];
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%d%d%d",&node[i].a,&node[i].b,&node[i].c);
sort(node+,node+n+,cmp_a);
int t=,c=;
for(int i=;i<=n+;i++)/// !!!!!!!
{
if(node[i]==node[i-])
{
c++;
}
else
{
node[++t]=node[i-];
node[t].sum=c;
c=;
}
}
//for(int i=1;i<=t;i++) printf("%d %d %d %d\n",node[i].a,node[i].b,node[i].c,node[i].sum);
CDQ(,t);
sort(node+,node++t,cmp_a);
//for(int i=1;i<=t;i++) printf("%d ",node[i].ans);printf("\n");
for(int i=;i<=t;i++) ans[node[i].ans+node[i].sum-]+=node[i].sum;///这里加上去掉的重复桦
for(int i=;i<=n;i++) printf("%d\n",ans[i-]);
return ;
}

AC代码:

第一次写CDQ,繁琐的细节好多...

洛谷P3810 陌上花开 CDQ分治(三维偏序)的更多相关文章

  1. 洛谷 P3810 【模板】三维偏序(陌上花开) (cdq分治模板)

    在solve(L,R)中,需要先分治solve两个子区间,再计算左边区间修改对右边区间询问的贡献. 注意,计算额外的贡献时,两子区间各自内部的顺序变得不再重要(不管怎么样左边区间的都发生在右边之前), ...

  2. [洛谷P3810]【模板】三维偏序(陌上花开)

    题目大意:有$n$个元素,第$i$个元素有三个属性$a_i,b_i,c_i$,设$f(i)=\sum\limits_{i\not = j}[a_j\leqslant a_i,b_j\leqslant ...

  3. BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  4. 洛谷P3810 陌上花开(CDQ分治)

    洛谷P3810 陌上花开 传送门 题解: CDQ分治模板题. 一维排序,二维归并,三维树状数组. 核心思想是分治,即计算左边区间对右边区间的影响. 代码如下: #include <bits/st ...

  5. BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...

  6. BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)

    题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...

  7. cdq分治·三维偏序问题

    转载自FlashHu大佬的博客CDQ分治总结(CDQ,树状数组,归并排序),在讲述部分有部分删改,用了自己的代码 CDQ分治的思想 CDQ分治是基于时间的离线分治算法.这一类分治有一个重要的思想——用 ...

  8. P3810 陌上花开 CDQ分治

    陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...

  9. 洛谷P3810 陌上花开 (cdq)

    最近才学了cdq,所以用cdq写的代码(这道题也是cdq的模板题) 这道题是个三维偏序问题,先对第一维排序,然后去掉重复的,然后cdq分治即可. 为什么要去掉重复的呢?因为相同的元素互相之间都能贡献, ...

随机推荐

  1. spring后置处理器BeanPostProcessor

    BeanPostProcessor的作用是在调用初始化方法的前后添加一些逻辑,这里初始化方法是指在配置文件中配置init-method,或者实现了InitializingBean接口的afterPro ...

  2. K3CLOUD常用数据表

    一.数据库查询常用表 --查询数据表select * from ( select convert(varchar(4000),t1.FKERNELXML.query('//TableName')) a ...

  3. drf信号量

    Django信号量回顾及drf信号量常用操作 一.在写接口视图时,保存/删除/更新数据前后需要对序列化后的数据进行处理的方法: 1.重写mixins.CreateModelMixin中恩的create ...

  4. linux ps命令用法

    -A    列出所有的进程-w    显示加宽可以显示较多的资讯-au    显示较详细的资讯-aux    显示所有包含其他使用者的行程 -A 显示所有进程(等价于-e)(utility)-a 显示 ...

  5. python3文字转语音

    #安装库(必须先安装pywin32) pip3 install pyttsx3 简单测试 import pyttsx3 engine = pyttsx3.init() text='name' engi ...

  6. 阿里p3c(代码规范,eclipse插件、模版,idea插件)

    阿里p3c 一.说明 代码规范检查插件p3c,是根据<阿里巴巴Java开发手册>转化而成的自动化插件. (高级黑:P-3C“Orion”,反潜巡逻机,阿里大概取p3c先进,监测,发现潜在问 ...

  7. APP测试重点(转载)

      1.安装卸载测试: app在不同的操作系统(安卓和ios),不同的版本,不同的机型上是否都能安装成功: 在安装过程中,突然断网或网络不好,是否给出有好的提示,网络恢复之后是否能正常下载: 在安装过 ...

  8. Windows上安装 TensorFlow及简单命令

    1.官网及帮助文档 官网: https://www.tensorflow.org/install/install_windows 中文帮助文档:https://efeiefei.gitbooks.io ...

  9. vue中组件绑定事件时是否加.native

    组件绑定事件时 1. 普通组件绑定事件不能添加.native, 添加后事件失效 2. 自定义组件绑定事件需要添加.native, 否则事件无效 <template> <!-- < ...

  10. springboot+jpa+mysql+swagger整合

    Springboot+jpa+MySQL+swagger整合 创建一个springboot web项目 <dependencies> <dependency>      < ...