三维偏序 cdq
就是将逆序对转化到了三维上去
原理等我寒假再补
第一维sort解决
第二维并归排序(cdq)解决
第三维树状数组
// luogu-judger-enable-o2
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using std::sort;
const int maxn=101000;
const int Max=201000;
struct node
{
int a,b,c;
int size,ans;
bool operator <= (const node &A)
{
if(b!=A.b) return b<=A.b;
if(c!=A.c) return c<=A.c;
return c<=A.c;
}
};
node Q[maxn],tmp[maxn];
int base[Max],t[Max],len,Tim;
int TOT[Max<<1];
int n,m;
void add(int pos,int val,int T)
{
while(pos<=len)
{
if(t[pos]!=T)
{
t[pos]=T;
base[pos]=0;
}
base[pos]+=val;
pos+=(pos&(-pos));
}
return ;
}
int sum(int pos,int T)
{
int res=0;
while(pos)
{
if(t[pos]!=T)
{
t[pos]=T;
base[pos]=0;
}
res+=base[pos];
pos-=(pos&(-pos));
}
return res;
}
bool compare(const node &a,const node &b)
{
if(a.a!=b.a) return a.a<b.a;
if(a.b!=b.b) return a.b<b.b;
return a.c<b.c;
}
void cdq(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>1,o=0,T=++Tim;
cdq(l,mid);cdq(mid+1,r);
int q=l,p=mid+1;
while(q<=mid&&p<=r)
{
if(Q[q]<=Q[p])//按照第二维顺序,左区间的元素算贡献(利用bit),右区间的元素进行第三维元素的顺序对查询
{
add(Q[q].c,Q[q].size,T);//利用时间戳
tmp[o++]=Q[q++];//回收元素
}
else
{
Q[p].ans+=sum(Q[p].c,T);
tmp[o++]=Q[p++];
}
}
while(q<=mid) tmp[o++]=Q[q++];//将没有处理的元素压回tmp
while(p<=r)
{
Q[p].ans+=sum(Q[p].c,T);
tmp[o++]=Q[p++];
}
for(int i=0;i<o;i++) Q[l+i]=tmp[i];//回填
return ;
}
int main()
{
scanf("%d%d",&n,&m);
len=m;
for(int i=1;i<=n;i++)
scanf("%d%d%d",&tmp[i].a,&tmp[i].b,&tmp[i].c);
sort(tmp+1,tmp+1+n,compare);//解决第一位顺序
int T=0;
for(int i=1,pas=1;i<=n;i++)//去重,cdq无法正确处理相同原元素
{
if(tmp[i].a!=tmp[i+1].a||tmp[i].b!=tmp[i+1].b||tmp[i].c!=tmp[i+1].c)
{
Q[++T]=tmp[i];
Q[T].size=pas;Q[T].ans=0;
pas=1;
}
else pas++;
}
cdq(1,T);
for(int i=1;i<=T;i++) TOT[Q[i].ans+Q[i].size-1]+=Q[i].size;
for(int i=0;i<n;i++) printf("%d\n",TOT[i]);
}
三维偏序 cdq的更多相关文章
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
- 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)
链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...
- bzoj3262: 陌上花开 三维偏序cdq分治
三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************* ...
- [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...
- BZOJ3262 陌上花开 —— 三维偏序 CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit ...
- 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 2244 [SDOI2011]拦截导弹 (三维偏序CDQ+线段树)
题目大意: 洛谷传送门 不愧为SDOI的duliu题 第一问?二元组的最长不上升子序列长度?裸的三维偏序问题,直接上$CDQ$ 由于是不上升,需要查询某一范围的最大值,并不是前缀最大值,建议用线段树实 ...
- BZOJ 2141 排队 (三维偏序CDQ+树状数组)
题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作 ...
- BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...
随机推荐
- K:hash(哈希)碰撞攻击
相关介绍: 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值 ...
- html和css入门 (二)
CSS基础 什么是CSS 简单来说,层叠样式表(Cascading Style Sheet)是一种专门用来控制界面外观风格的文档. CSS发展历史 1996年 CSS 1.0 规范面世,其中加入了字体 ...
- Freebsd10.3(FreeBSD11 Beta1)使用手记
Freebsd10.3(FreeBSD11 Beta1)使用手记 1.安装系统. 2.设置ssh2登录,并开启ftp. (1)编辑/etc/ssh/sshd_config文件,设置如下: Permit ...
- canvas createPattern()方法详解
createPattern作用 createPattern() 方法在指定的方向内重复指定的元素. 元素可以是图片.视频,或者其他 <canvas> 元素. 被重复的元素可用于绘制/填充矩 ...
- curl 模拟发起百度地图API post请求
注:开始做的是get请求,比较简单,然后又查询了一番就做成了post请求,有几个地方特别说明一下: 一,$address,是必须传的,$city可不传: 二,ak跟之前的key一直,需要申请,我的好像 ...
- 微信小程序-scroll-view组件
<view class="section"> <view class="section__title">vertical scroll& ...
- LeetCode赛题390----Elimination Game
# 390. Elimination Game There is a list of sorted integers from 1 to n. Starting from left to right, ...
- 获取所有后缀DDE打开命令
概述: 由于需要使用DDE方式打开文件,所以把支持DDE方式打开文件的参数都导出来到文件,方便查找. 并且提供运行DDE命令的工具,可以用于测试DDE功能. 1.运行脚步GetDDE.vbs可以获取系 ...
- centos ntfs-3g 安装和使用
安装fuse 下载fuse(ntfs-3g依赖fuse):http://vdisk.weibo.com/s/ajww5fZsUq50L?from=page_100505_profile&wvr ...
- 什么是TTL值?(简单明了的解释)
什么是TTL值? TTL值全称是“生存时间(Time To Live)”,简单的说它表示DNS记录在DNS服务器上的缓存时间. 要理解TTL值,请先看下面的一个例子:假设,有这样一个域名myhost. ...