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

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

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

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

那么我们看了题面后就发现:这就是一个三维偏序。只不过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. CentOS7安装Jenkins,使用war方式直接运行或用yum方式安装运行

    jenkins最简单的安装方式呢,就是直接去官网下载jenkins的war包,把war丢到tomcat里运行,直接就能打开了. Jenkins官网:https://jenkins.io/downloa ...

  2. mysql的主从复制

    一.主从复制简介 二.主从复制原理 四.主从复制基本故障处理 五.延时从库 六.半同步复制 七.过滤复制 四.主从复制基本故障处理 SQL 线程为NO 一般情况下,因为主库一开始本来就有一些存在的库, ...

  3. Django模板渲染

    一 . 语法 # 关于模板渲染只需要记住两种语法就可以: 1.{{ }} # 里面写变量 2.{% %} # 里面写与逻辑相关的,比如for循环 二 . 变量名 在django的模板语言中按照语法: ...

  4. k8s容器的资源限制

    1.k8s支持内存和cpu的限制 requests:容器运行需求,最低保障limits:限制,硬限制(资源上限) CPU: 1颗逻辑CPU(1核CPU=4个逻辑CPU) 1物理核=1000个微核(mi ...

  5. PHP爬虫框架Beanbun使用

    第一 下载安装Beanbun框架 例如: mkdir -p BeanbunTest composer require kiddyu/beanbun 如图所示: 第二 简单下载网页的例子 <?ph ...

  6. ERP行业内幕看了这五个问题全懂了

    ERP系统是现代企业实现信息化管理的必经之路.但很多管理人员或已经在用ERP的人员,其实并不太懂ERP系统是什么意思,有哪些好处等,导致实际使用过程中经常大材小用,或者“英雄无用武之地”.所以,为了更 ...

  7. 对mysql 单表备份

    #!bin/bash cd C:\Program Files\MySQL\MySQL Server 5.5\bin set "Ymd=%date:~,4%%date:~5,2%%date:~ ...

  8. 安装zip版mysql

    MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...

  9. Condition线程通信(七)

    前言:对于线程通信,使用synchronized时使用wait.notify和notifyAll来实行线程通信.而使用Lock如何处理线程通信呢?答案就是本片的主角:Condition. 一.Cond ...

  10. gevent监测单线程下的io进行切换

    from gevent import monkey;monkey.patch_all() import gevent import time def eat(name): print('%s eat ...