BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)
题目大意:
三维偏序裸题
首先,把三元组关于$a_{i}$排序
然后开始$CDQ$分治,回溯后按$b_{i}$排序
现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等于右侧
而$c_{i}$这一维需要用权值树状数组维护
归并排序时,已知左侧右侧两个指针分别是$i,j$
如果$b_{i} \leq bj$,将左侧已经遍历过的三元组的$c_{i}$推入树状数组,然后$i++$
如果$b_{i}>bj$,那么右侧能取到的贡献就是树状数组内$\leq c_{j}$的三元组数量,然后$j++$
可三元组有重复的啊!
如果我们不去重,假设有两个相同的三元组,靠前的三元组会得不到后面的贡献
还需要去重,并额外记录相同三元组数量
这道题的判定条件三个元是小于等于
发现我们只关于$a_{i}$排序也不行啊
在归并过程中会发现有一些$b_{i}$或者是$c_{i}$明明比较大,却得不到后面较小的贡献
这是由于小于等于的情况也合法,而我们必须让较大的在后面,才能保证后面能取到前面的贡献
所以排序过程中第二维还要按$b_{i}$排序,第三维按$c_{i}$
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 100100
#define ll long long
#define dd double
#define inf 0x3f3f3f3f3f3f3f3fll
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,nn,K;
struct node{
int id,num,a,b,c;
friend bool operator == (const node &s1,const node &s2)
{return (s1.a==s2.a)&&(s1.b==s2.b)&&(s1.c==s2.c);}
friend bool operator < (const node &s1,const node &s2)
{
if(s1.a!=s2.a) return s1.a<s2.a;
if(s1.b!=s2.b) return s1.b<s2.b;
return s1.c<s2.c;
}
}p[N1],t[N1],tmp[N1]; struct b_{i}T{
int s[N1<<];
void update(int x,int w){for(int i=x;i<=K;i+=(i&(-i))) s[i]+=w;}
int query(int x){int ans=; for(int i=x;i>;i-=(i&(-i))) ans+=s[i]; return ans;}
}b;
int f[N1],hs[N1],que[N1],tl;
void CDQ(int L,int R)
{
if(R-L<=) return;
int M=(L+R)>>;
CDQ(L,M); CDQ(M,R);
int i=L,j=M,cnt=;
while(i<M&&j<R)
{
if(t[i].b<=t[j].b){
b.update(t[i].c,t[i].num);
tmp[++cnt]=t[i]; i++; que[++tl]=cnt;
}else{
f[t[j].id]+=b.query(t[j].c);
tmp[++cnt]=t[j]; j++;
}
}
while(i<M){tmp[++cnt]=t[i]; i++;}
while(j<R){f[t[j].id]+=b.query(t[j].c); tmp[++cnt]=t[j]; j++;}
while(tl) i=que[tl--],b.update(tmp[i].c,-tmp[i].num);
for(i=L;i<R;i++) t[i]=tmp[i-L+];
} int main()
{
scanf("%d%d",&n,&K);
int i;
for(i=;i<=n;i++) p[i].a=gint(),p[i].b=gint(),p[i].c=gint();
sort(p+,p+n+);
for(i=;i<=n;i++)
if(!(p[i]==p[i-])) t[++nn]=p[i],t[nn].num=;
else t[nn].num++;
for(i=;i<=nn;i++) t[i].id=i;
CDQ(,nn+);
for(i=;i<=nn;i++) hs[f[t[i].id]+t[i].num-]+=t[i].num;
for(i=;i<n;i++) printf("%d\n",hs[i]);
return ;
}
BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)的更多相关文章
- BZOJ 2141 排队 (三维偏序CDQ+树状数组)
题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作 ...
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
- BZOJ 2716/2648 SJY摆棋子 (三维偏序CDQ+树状数组)
题目大意: 洛谷传送门 这明明是一道KD-Tree,CDQ分治是TLE的做法 化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$ 而$CDQ$分治只能解决$x1 \leq x ...
- BZOJ 1176/2683 Mokia (三维偏序CDQ+树状数组)
题目大意: 洛谷传送门 三维偏序裸题.. 每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $ 询问操作拆成$4$个容斥 接下来就是$CDQ$了,外层按t排序, ...
- BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...
- bzoj3262陌上花开 三维数点 cdq+树状数组
大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...
- 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)
链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- bzoj3262: 陌上花开(CDQ+树状数组处理三维偏序问题)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 题目大意:中文题目 具体思路:CDQ可以处理的问题,一共有三维空间,对于第一维我们 ...
随机推荐
- iOS tcpdump抓包方法(需越狱)
前提条件:机器要破解,cydia能打开 需要工具1.openssh2.tcpdump 安装工具方法:1.连接网络,打开cydia2.确认Cydia设置为开发者模式(管理->设置->开发者) ...
- vue 上传图片到阿里云(前端直传:不推荐)
为何要这样做:减轻后端数据库压力(个人觉得于前端没啥用,谁返回来都行) 代码部分: <template> <div class="upLoad"> < ...
- Git学习总结(11)——Git撤销操作详解
本文主要讨论和撤销有关的 git 操作.目的是让读者在遇到关于撤销问题时能够方便迅速对照执行解决问题,而不用去翻阅参数繁多的 git 使用说明. 一开始你只需了解大致功能即可,不必记住所有命令和具体参 ...
- 剑指Offer读书笔记(持续更新中)
(1)定义一个空的类型,里面没有不论什么成员变量和成员函数,对该类型求sizeof,得到的结果是多少? 答案是1.空类型的实例中不包括不论什么信息,本来求sizeof应该是0,可是当我们声明该类型实例 ...
- 略微复杂的sql逻辑(从数据库逆序查找有限条记录(limit))并按相反顺序输出
项目中有一个业务需求是:默认载入15条历史记录(按时间顺序从早到晚). 以下是我构造的sql逻辑,mark一下,亲測可行. SELECT * FROM (SELECT *FROM group_chat ...
- Spring Batch(4): Job详解
Spring Batch(4): Job详解 2016-03-26 18:46 870人阅读 评论(1) 收藏 举报 分类: Spring(6) 版权声明:本文为博主原创文章,未经博主允许不得转载 ...
- 连载:面向对象葵花宝典:思想、技巧与实践(30) - SRP原则
前面具体阐述了"高内聚低耦合"的整体设计原则.但怎样让设计满足这个原则,并非一件简单的事情.幸好各位前辈和大牛已经帮我们归纳总结出来了,这就是"设计原则"和&q ...
- 【scikit-learn】交叉验证及其用于參数选择、模型选择、特征选择的样例
内容概要¶ 训练集/測试集切割用于模型验证的缺点 K折交叉验证是怎样克服之前的不足 交叉验证怎样用于选择调节參数.选择模型.选择特征 改善交叉验证 1. 模型验证回想¶ 进行模型验证的一个重要目 ...
- 拥抱Mac之码农篇
拥抱Mac之码农篇 使用Mac大概两年时间.之前用着公司配的一台27寸的iMac.无奈机械硬盘严重拖慢速度,影响工作心情.于是入手Macbook Retina 13.这两年的开发工作所有在Mac上完毕 ...
- Codeforces 456B Fedya and Maths 打表找规律
Description Fedya studies in a gymnasium. Fedya's maths hometask is to calculate the following expre ...