bzoj3262陌上花开 三维数点 cdq+树状数组
大早上的做了一道三维数点一道五位数点,神清气爽!
先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问)
然后cdq分治,再变回静态,考虑前半段对后半段的影响
这时对第二维排序,又变成动态一维数点
树状数组屠之
(不妨再cdq一次变成零维数点,也就是询问一个询问之前有几次修改)(手动滑稽)
另外因为x y z都相同时互相产生影响,特判掉
来上个又臭又长的代码
#include <bits/stdc++.h>
using namespace std;
struct t
{
int x,y,z,num,ans;
} a[],b[];
int tr[],ans[];
int n,m;
bool comx(t a,t b)
{
return (a.x<b.x)||(a.x==b.x &&(a.y<b.y || (a.y==b.y &&a.z<b.z)));
}
bool same(t a,t b)
{
return (a.x==b.x && a.y==b.y && a.z==b.z);
}
void add(int x,int y)
{
while(x<=m)
tr[x]+=y,x+=x&-x;
}
int que(int x)
{
int ans=;
while(x)
ans+=tr[x],x-=x&-x;
return ans;
}
void cdq(int l,int r)
{
if(l==r)
return;
int mid=l+r>>;
cdq(l,mid);cdq(mid+,r);
for(int i=l,j=l,k=mid+;i<=r;i++)
if(j<=mid &&(k>r || a[j].y<=a[k].y)) b[i]=a[j++];
else b[i]=a[k++];
for(int i=l;i<=r;i++)
{
a[i]=b[i];
if(a[i].num<=mid)
add(a[i].z,);
else
a[i].ans+=que(a[i].z);
}
for(int i=l;i<=r;i++)
if(a[i].num<=mid)
add(a[i].z,-);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sort(a+,a+n+,comx);
t tem;int te=;
for(int i=n;i>=;i--)
if(same(tem,a[i])) a[i].ans+=te,++te;
else tem=a[i],te=;
// puts("");
// for(int i=1;i<=n;i++)
// printf("%d %d %d\n",a[i].x,a[i].y,a[i].z);
for(int i=;i<=n;i++)
a[i].num=i;
cdq(,n);
// for(int i=1;i<=n;i++)
// printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].z,a[i].ans);
for(int i=;i<=n;i++)
++ans[a[i].ans];
for(int i=;i<n;i++)
printf("%d\n",ans[i]);
return ;
}
bzoj3262陌上花开 三维数点 cdq+树状数组的更多相关文章
- BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{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 2141 排队 (三维偏序CDQ+树状数组)
题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作 ...
- BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...
- 洛谷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可以处理的问题,一共有三维空间,对于第一维我们 ...
- bzoj 3295 动态逆序对 (三维偏序,CDQ+树状数组)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 思路: 可以将这道题看成倒着插入,这样就可以转化成求逆序对数,用CDQ分治降维,正反用 ...
随机推荐
- JAVA基础之Date类、DateFormat类及Calendar类
个人理解: 关于Date类,进行截取或者转换时一定要注意好数据类型,long类型后面要加上L.时间的原点是1970年.用DateFormat则完成日期与文本之间的转换,特别注意的是:月是用M,时是用H ...
- java容器集合
java 集合分为 Collection 和 Map 两大类 Collection 是 Java 集合框架的顶层接口,它是对容器类进行增.删.改.查的定义,同时继承了 Iterable 接口,具有对集 ...
- JSON(未完待续,等讲到对象时再加)
1 定义 JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言:JSON 使用 Jav ...
- PhpStorm 2017汉化补丁 2017.1 免费中文版
PhpStorm 2017汉化补丁是一款可以让PhpStorm 2017.1版实现中文界面显示的汉化包工具,本站提供了PhpStorm 2017.1汉化补丁下载地址,有需要的朋友们欢迎前来下载使用. ...
- countUp 动画展示数字变化
html <p id="countUp" style="font-size:25px;height:25px;background-color:#0aa;" ...
- Jquery 日期差函数 修改 对火狐进行兼容
function DateDiff(sDate1, sDate2) { //sDate1和sDate2是yyyy-MM-dd格式 var aDate, oDate1, oDate2, iDays; a ...
- java校验maven下载的jar文件
有时候maven真的很坑! 有时候提示invalid LOC header (bad signat signature), 但又有时候什么都不提示,工程报错,情况有肯多中,不知道大家遇到过几种诡异的. ...
- 洛谷 P1001 A+B Problem
题目描述 输入两个整数a,b,输出它们的和(|a|,|b|<=10^9). 注意 1.pascal使用integer会爆掉哦! 2.有负数哦! 3.c/c++的main函数必须是int类型,而且 ...
- CVE-2011-0065
环境 备注 操作系统 Windows 7 x86 sp1 专业版 漏洞软件 Firefox 版本号:3.6.16 调试器 Windbg 版本号:6.12.0002.633 0x00 漏洞描述 在F ...
- word中在空白处加下划线不显示解决
终极解决:Ctrl + Shift + Space Alt + 选择,竖向选择.和VS,其他一些编辑器一样