洛谷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分治即可. 为什么要去掉重复的呢?因为相同的元素互相之间都能贡献, ...
随机推荐
- 前K个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...
- Centos6.8 安装nginx
1.安装相关依赖 (1)yum install gcc 备注:可以通过gcc -v 查看版本信息,来确定是否安装过. (2)yum install pcre-devel (3)yum install ...
- mvn clean deploy
如果是 mthrift的话,需要部署,就用 mvn clean deploy; 先进入 cd qcs.appeal.client ,然后执行:mvn clean deploy;
- Java第一次实训
package com.wsy.work; public class JudgeNumber { public static void main(String[] args) { int a = 5; ...
- Fiddler-学习笔记-远程抓包
1 操作系统低于win7用 fiddler 2 win7 或win7以上版本,用 fiddler4片本 2 fiddler开关:左下角或点击F12控件fiddler开关,开=capturing 3 启 ...
- solr单机版搭建
需要把solr服务器安装到linux环境: 第一步:安装linux.jdk.tomcat. [root@bogon ~]# ll total 8044 -rw-r--r--. 1 root root ...
- 学习 Spring (九) 注解之 @Required, @Autowired, @Qualifier
Spring入门篇 学习笔记 @Required @Required 注解适用于 bean 属性的 setter 方法 这个注解仅仅表示,受影响的 bean 属性必须在配置时被填充,通过在 bean ...
- 【python练习题】程序10
#10.题目:暂停一秒输出,并格式化当前时间. import time print(time.time())#timestamp print(time.localtime(time.time()))# ...
- JQuery invoke remote webservice
Sending the Access-Control-Allow-Origin header allows basic cross-origin access, but calling ASP.NET ...
- SharePoint 2016 installation error The program can not start because api-ms-win-crt-runtime-l1-1-0.dll is missing
In this post we will discuss how we can resolve the issue The program can not start because api-ms-w ...