分治法:三维偏序问题之CDQ分治


我怀疑那个k是用来定界限用的
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct edge{
int x,y,z,ans,cnt;
} a[];
int n,i,k,num,t;
int tr[],f[];
int read(){
int sum=;
char c=getchar();
while (c<''||c>'') c=getchar();
while (c>=''&&c<='') {
sum=sum*+c-'';
c=getchar();
}
return sum;
}
bool cmp2(edge a,edge b) {
if (a.y==b.y) return a.z<b.z;
else return a.y<b.y;
}
bool cmp1(edge a,edge b) {
if (a.x==b.x) return cmp2(a,b);
else return a.x<b.x;
}
void add(int x,int y){
while (y<=t) {
tr[y]+=x;
y=y+(y&(-y));
}
}
int query(int y){
int s=;
while (y>) {
s+=tr[y];
y=y-(y&(-y));
}
return s;
}
void cdq(int l,int r) {
if (l==r) return;
int mid=(l+r)>>;
cdq(l,mid); cdq(mid+,r);
sort(a+l,a+mid+,cmp2);
sort(a+mid+,a+r+,cmp2);
int l1,t,i;
l1=l;
for (i=mid+;i<=r;i++){
while (a[i].y>=a[l1].y&&l1<=mid) {
add(a[l1].cnt,a[l1].z);
l1++;
}
a[i].ans+=query(a[i].z);
}
// if (l1==mid) l1++;
for (i=l;i<=l1-;i++)
add(-a[i].cnt,a[i].z);
}
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
n=read(); t=read();
for (i=;i<=n;i++) {
a[i].x=read();a[i].y=read();a[i].z=read();}
sort(a+,a+n+,cmp1);
for (i=;i<=n;) {
k=i+;
while (a[i].x==a[k].x&&a[i].y==a[k].y&&a[i].z==a[k].z&&k<=n) k++;
num++;
a[num]=a[i];
a[num].cnt=k-i;
i=k;
}
cdq(,num);
for (i=;i<=num;i++) {
f[a[i].ans+a[i].cnt-]+=a[i].cnt;
}
for (i=;i<=n-;i++)
printf("%d\n",f[i]);
}
分治法:三维偏序问题之CDQ分治的更多相关文章
- BZOJ3262陌上花开(三维偏序问题(CDQ分治+树状数组))+CDQ分治基本思想
emmmm我能怎么说呢 CDQ分治显然我没法写一篇完整的优秀的博客,因为我自己还不是很明白... 因为这玩意的思想实在是太短了: fateice如是说道: 如果说对于一道题目的离线操作,假设有n个操作 ...
- 陌上花开(三维偏序)(cdq分治)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 其实就是三位偏序的模板,cdq分治入门题. 学习cdq分治请看__stdcall大 ...
- 偏序问题及CDQ分治详解
CDQ用来解决分治时左半部分对右半部分造成影响的问题. CDQ分治的经典问题是三维偏序问题. 要想解决三维偏序问题,首先你要知道什么是偏序.(废话) 一维偏序: 给出直线上的n个点,问有多少对点满足x ...
- 【CJOJ2375】 【HZOI 2015】偏序 II(cdq分治,树状数组)
传送门 CJOJ Solution 具体实现参考上一篇Blog(四维偏序) 代码实现1(cdq+cdq+cdq+BIT) /* mail: mleautomaton@foxmail.com autho ...
- 【CJOJ2616】 【HZOI 2016】偏序 I(cdq分治,树状数组)
传送门 CJOJ Solution 考虑这是一个四维偏序对吧. 直接cdq套在一起,然后这题有两种实现方法(树状数组的更快!) 代码实现1(cdq+cdq+cdq) /* mail: mleautom ...
- [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...
- 『cdq分治和多维偏序问题』
更新了三维偏序问题的拓展 cdq分治 \(cdq\)分治是一种由\(IOI\ Au\)选手\(cdq\)提出的离线分治算法,又称基于时间的分治算法. 二维偏序问题 这是\(cdq\)分治最早提出的时候 ...
- 初学cdq分治学习笔记(可能有第二次的学习笔记)
前言骚话 本人蒟蒻,一开始看到模板题就非常的懵逼,链接,学到后面就越来越清楚了. 吐槽,cdq,超短裙分治....(尴尬) 正片开始 思想 和普通的分治,还是分而治之,但是有一点不一样的是一般的分治在 ...
- 「分治」-cdq分治
cdq分治是一种分治算法: 一种分治思想,必须离线,可以用来处理序列上的问题(比如偏序问题),还可以优化1D/1D类型的DP.• 算法的大体思路我们可以用点对来描述.假定我们有一个长度为n的序列,要处 ...
随机推荐
- PSP DAILY软件功能说明书
PSP DAILY软件功能说明书 一.开发背景 你在完成了一周的软件工程作业后,需要提交一个PSP图表,里面有4项,如下所示: 1.本周PSP表格,包含每项任务的开始.中断.结束.最终时间,格式如下: ...
- 第五周PSP作业
PSP表格: 累积进度条: 折线图: 饼状图:
- 冲刺ing-4
第四次Scrum冲刺 队员完成的任务 队员 完成任务 吴伟华 Leangoo的看板截图,燃尽图 蔺皓雯 编写博客,学习后端设计 蔡晨旸 学习后端设计 曾茜 后端设计 鲁婧楠 服务器建构 杨池宇 学习后 ...
- oracle数据库 expdp/impdp 和 exp/imp
--EXPDP导出,需要系统用户权限,一般不使用--sqlplus--1.创建dmp导出逻辑目录 create directory 目录名 as '目录路径' create directory exp ...
- lintcode-445-余弦相似度
445-余弦相似度 Cosine similarity is a measure of similarity between two vectors of an inner product space ...
- 蜗牛慢慢爬 LeetCode 8. String to Integer (atoi) [Difficulty: Medium]
题目 Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cas ...
- 西南大学校园网客户端共享网络之路由器开wifi
1年前出了NetKeeper,让寝室只能一个人用一个账号,而且,在寝室平板手机什么的只能靠360wifi什么的来维持了,电脑一直不能关,确实让人不爽. 最近学校又出台了swu-wifi-dorm来让寝 ...
- Graph-Based image segmentation method
1.Graph-Based 方法简介 基于图的图像分割方法将图像伪造成带权值无向图的形式 : G = (V, E) 其中,V是顶点集合,把图像中的每个像素或者每个区域看成图的一个顶点:E是边的集合,连 ...
- 【bzoj4542】[Hnoi2016]大数 莫队算法
题目描述 给出一个数字串,多次询问一段区间有多少个子区间对应的数为P的倍数.其中P为质数. 输入 第一行一个整数:P.第二行一个串:S.第三行一个整数:M.接下来M行,每行两个整数 fr,to,表示对 ...
- Django 2.0 学习(17):Django 用户认证(auth模块)
Django 用户认证(auth模块) 一.认证登陆 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中:如果用户存在于数据库中,然后再验证用户输入 ...