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

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

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

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

那么我们看了题面后就发现:这就是一个三维偏序。只不过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. Bootstrap 面板(Panels)

    一.面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .panel-default 即可,如下面的 ...

  2. 解决tab标签页,相同id时切换失灵的问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  4. “耐撕”团队 2016.03.31 站立会议

    1. 时间: 19:30--19:50  共计20分钟. 2. 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:ht ...

  5. netstat -na 查看有大量TIME_WAIT解决办法(修改内核参数)

    # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c      16 CLOSING     130 ESTABLISHED     298 FIN_WA ...

  6. 1064 - You have an error in your SQL syntax;

    mysql 1064 错误: SQL语法错误,check the manual that corresponds to your MySQL server version for the right ...

  7. codeforces589I

    Lottery CodeForces - 589I Today Berland holds a lottery with a prize — a huge sum of money! There ar ...

  8. ng-click 发两次ajax请求的原因及解决方法

    http://blog.csdn.net/anmo/article/details/17083125

  9. python 脚本之 获取远程主机的hostname

    import sys, socket try: result = socket.gethostbyaddr("查询的IP") #查询完后获得一个元组 print (result) ...

  10. BZOJ1398Vijos1382寻找主人 Necklace——最小表示法

    题目描述 给定两个项链的表示,判断他们是否可能是一条项链. 输入 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). 输出 如果两条项链不可能同构,那么输出 ...