洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题
当然没那么简单.....
首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了:
这么好听的名字#(滑稽)
那么我们看了题面后就发现:这就是一个三维偏序。只不过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分治(三维偏序)的更多相关文章
- 洛谷 P3810 【模板】三维偏序(陌上花开) (cdq分治模板)
在solve(L,R)中,需要先分治solve两个子区间,再计算左边区间修改对右边区间询问的贡献. 注意,计算额外的贡献时,两子区间各自内部的顺序变得不再重要(不管怎么样左边区间的都发生在右边之前), ...
- [洛谷P3810]【模板】三维偏序(陌上花开)
题目大意:有$n$个元素,第$i$个元素有三个属性$a_i,b_i,c_i$,设$f(i)=\sum\limits_{i\not = j}[a_j\leqslant a_i,b_j\leqslant ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 洛谷P3810 陌上花开(CDQ分治)
洛谷P3810 陌上花开 传送门 题解: CDQ分治模板题. 一维排序,二维归并,三维树状数组. 核心思想是分治,即计算左边区间对右边区间的影响. 代码如下: #include <bits/st ...
- BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...
- BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)
题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...
- cdq分治·三维偏序问题
转载自FlashHu大佬的博客CDQ分治总结(CDQ,树状数组,归并排序),在讲述部分有部分删改,用了自己的代码 CDQ分治的思想 CDQ分治是基于时间的离线分治算法.这一类分治有一个重要的思想——用 ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
- 洛谷P3810 陌上花开 (cdq)
最近才学了cdq,所以用cdq写的代码(这道题也是cdq的模板题) 这道题是个三维偏序问题,先对第一维排序,然后去掉重复的,然后cdq分治即可. 为什么要去掉重复的呢?因为相同的元素互相之间都能贡献, ...
随机推荐
- 20181114教学sql
--精确查找:查询水表编号为30408的业主记录 ' --模糊查询:查询业主名称包含'刘'的业主记录 SELECT * FROM T_OWNERS WHERE NAME LIKE '%刘%' --AN ...
- admin快速搭建后台管理系统
一.基于admin后台管理系统的特点: 权限管理:权限管理是后台管理系统必不可少的部分,拥有权限管理,可以赋予用户增删改查表权限(可以分别赋予用户对不同的表有不同的操作权限): 前端样式少:后台管理主 ...
- k8s使用Glusterfs动态生成pv
一.环境介绍 [root@k8s-m ~]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4 ...
- python functools.wraps functools.partial实例解析
一:python functools.wraps 实例 1. 未使用wraps的实例 #!/usr/bin/env python # coding:utf-8 def logged(func): de ...
- delphi怎样在关闭程序时弹出窗口?
我想在关闭delphi编译的程序时,弹出“您是否确实要退出的窗口”点击否不退出,是退出 在主窗体的CloseQuery事件里,使用messagebox进行提示,根据选择的按钮对Canclose进行设置 ...
- C 语言----- 指针
指针是一个值为内存地址的变量, 指针的核心是它是一个变量, 只不过它是用来存放内存地址的, 所以在了解指针之前,先说一下什么是变量.变量就是在内存中开辟的一个空间.如int year, 就是在内存中开 ...
- 【C/C++】C/C++中的数组是怎么实现的?
几乎所有的语言都把数组作为一种固有的数据类型,数组也是我们最常用的数据结构之一.在语言底层,数组是如何实现的呢?本文以抽象数据类型的形式,定义.实现数组. 创建数组,理论上,我们可以使用创建任意维度的 ...
- HTC Vive 基础入门 基于Unity3D引擎
任务2: 01-概述 07:08 任务3: 02-HTC Vive设备的安装 08:33 任务4: 03-下载Steam与SteamVR 03:05 任务5: 04-使用Steam VR 调试设备 1 ...
- kubernetes 简单yaml文件运行例子deployment
运行一个deployment: kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2 基本例子: nginx-test.y ...
- 云服务器ECS
云服务器Elastic Compute Service(ECS)是阿里云提供的一种基础云计算服务.使用云服务器ECS就像使用水.电.煤气等资源一样便捷.高效.您无需提前采购硬件设备,而是根据业务需要, ...