分治法:三维偏序问题之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的序列,要处 ...
随机推荐
- HUST学期助教总结
春节还没过完,在回广州的高铁上收到是否愿意担任一次软测助教的询问.想了一天,答应了.而内心其实是有点恐慌的,有几点原因: 大学从来没有学过软件测试这门课程.对于自己的软件测试只是体系并不是很有自信. ...
- “Hello World!”团队第七次Scrum立会
"Hello world!"团队召开第七次Scrum立会.博客内容: 1.会议时间 2.会议成员 3.会议地点 4.会议内容 5.Todo list 6.会议照片 7.燃尽图 一. ...
- C++ auto_ptr智能指针的用法
C++中指针申请和释放内存通常采用的方式是new和delete.然而标准C++中还有一个强大的模版类就是auto_ptr,它可以在你不用的时候自动帮你释放内存.下面简单说一下用法. 用法一: std: ...
- linux应用自启动配置
Linux在启动时,会自动执行/etc/rc.d目录下的初始化程序,因此我们可以把启动任务放到该目录下: 1.因为其中的rc.local是在完成所有初始化之后执行,因此可以把启动脚本写到里面: 2.用 ...
- sysbench 环境安装,压测mysql
源码路径:https://github.com/akopytov/sysbench 版本linux 6.8sysbench 0.5mysql 5.6.29 1.安装pip略 2.pip 安装bzr p ...
- 查询出menupath字段中 出现 “- "(横杆)大于3次的 记录
- mysql中一些表选项
表选项列表 表选项就是,创建一个表的时候,对该表的整体设定,主要有如下几个: charset = 要使用的字符编码, engine = 要使用的存储引擎(也叫表类型), auto_increment ...
- 守护线程以及要使用时注意的一点(Daemon Thread)
在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) Daemon的作用是为其他线程的运行提供便利服务,比如垃圾回收线程就是一个很称职的守护者.User和 ...
- BZOJ 1483 梦幻布丁(链表+启发式合并)
给出一个长度为n的序列.支持两种操作: 1.把全部值为x的修改成y.2.询问序列有多少连续段. 我们可以对于每个值建立一个链表.对于操作1,则可以将两个链表合并. 对于操作2,只需要在每次合并链表的时 ...
- OSPF协议介绍及配置 (下)
4.特殊区域详解 为了让我们的讲解更加的通俗易懂,我们看上面这个拓扑,这是一个根据客户业务逻辑结构所涉及的OSPF网络,共有三个区域(实际上远远不止),骨干区域area0为一级行及二级行所部署,*** ...