BZOJ3262 陌上花开 —— 三维偏序 CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3262
3262: 陌上花开
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 3188 Solved: 1472
[Submit][Status][Discuss]
Description
Input
Output
包含N行,分别表示评级为0...N-1的每级花的数量。
Sample Input
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1
Sample Output
1
3
0
1
0
1
0
0
1
HINT
Source
题解:
单纯的三维偏序问题,上CDQ分治。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int MOD = 1e9+;
const int MAXN = 2e5+; struct node
{
int x, y, z, s, id;
bool operator<(const node& b)const{
if(x==b.x){
if(y==b.y) return z<b.z;
return y<b.y;
}
return x<b.x;
}
};
node a[MAXN], b[MAXN]; int n, k, c[MAXN];
int lowbit(int x) {return x&(-x);}
void add(int x, int val) {for(int i=x;i<=k;i+=lowbit(i)) c[i]+=val;}
int sum(int x) {int ret=; for(int i=x;i>;i-=lowbit(i))ret+=c[i]; return ret;} // 第一维排序,第二维CDQ,第三维树状数组
void CDQ(int l, int r)
{
if(l==r) return; int mid = (l+r)/;
CDQ(l, mid); CDQ(mid+, r);
int p1 = l, p2 = mid+;
for(int i = l; i<=r; i++) //按y排序,归并排序
{
//必须是:a[p1].y<=a[p2].y,不能少了==这个判断,因为当a[p1].y==a[p2].y时,必定p1排在前面,因为p1的z比p2小
if(p2>r||(p1<=mid&&a[p1].y<=a[p2].y)) b[i] = a[p1++];
else b[i] = a[p2++];
}
//此时y按从小到大排序,当y相等时,x小的排前面。
for(int i = l; i<=r; i++)
{
a[i] = b[i]; //b为a归并排序时的临时存储,应把值放回到a里
if(a[i].id<=mid) add(a[i].z, ); //当x小于等于mid,则把它的z加入到树状数组中,被别人统计
else a[i].s += sum(a[i].z); //当x大于mid时,拿自己的z到线段树中统计
}
for(int i = l; i<=r; i++) //撤回在线段树中的操作
if(a[i].id<=mid) add(a[i].z, -);
} int ans[MAXN];
int main()
{
while(scanf("%d%d", &n,&k)!=EOF)
{
for(int i = ; i<=n; i++)
{
scanf("%d%d%d", &a[i].x,&a[i].y,&a[i].z);
a[i].s = ;
}
sort(a+,a++n);
memset(c, , sizeof(c));
for(int i = ; i<=n; i++)
a[i].id = i;
CDQ(,n); memset(ans, , sizeof(ans));
for(int i = n-; i>=; i--) //一样的点,选值最大的
if(a[i].x==a[i+].x&&a[i].y==a[i+].y&&a[i].z==a[i+].z)
a[i].s = a[i+].s; for(int i = ; i<=n; i++)
ans[a[i].s]++;
for(int i = ; i<n; i++)
printf("%d\n", ans[i]);
}
}
BZOJ3262 陌上花开 —— 三维偏序 CDQ分治的更多相关文章
- bzoj3262: 陌上花开 三维偏序cdq分治
三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************* ...
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
- BZOJ3262: 陌上花开(三维偏序,CDQ分治)
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...
- [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...
- BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等 ...
- BZOJ 3295:[Cqoi2011]动态逆序对(三维偏序 CDQ分治+树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那 ...
- bzoj3262陌上花开 三维数点 cdq+树状数组
大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...
- 三维偏序[cdq分治学习笔记]
三维偏序 就是让第一维有序 然后归并+树状数组求两维 cdq+cdq不会 告辞 #include <bits/stdc++.h> // #define int long long #def ...
- BZOJ3262/Luogu3810 陌上花开 (三维偏序,CDQ)
一个下午的光阴之死,凶手是细节与手残. 致命的一枪:BIT存权值时: for(; x <= maxx; x += x&-x) t[x] += w; //for(; x <= n; ...
随机推荐
- Android4.4电池管理
一.概述 Android4.4的电池管理功能用于管理电池的充.放电功能. 整个电池管理的部分包含Linux电池驱动.Android电池服务.电池属性和參数.电池曲线优化四个部分. Linux电池驱动用 ...
- JAVA Eclipse开发Android如何让超出界面的部分自动显示滚动条
在原有布局的最外围添加一层ScrollView,注意原有布局的声明也要删了 <ScrollView xmlns:android="http://schemas.android.com/ ...
- 百科知识 国内的创业项目如何众筹,能登录Kickstarter吗
一个国内的团队登陆Kickstarter到底有多难? 300万用户,4.8亿美元筹款,Kickstarter在2013年交出了一份惊艳的答卷.对于美英澳加新荷六国的创业团队来说,Kickstarter ...
- 新版本号的tlplayer for android ,TigerLeapMC for windows公布了
tlplayer for android 新版本号修正了图像倾斜等等问题,添加了动态水印功能. 支持hls(m3u8),http,rtsp,mms,rtmp等网络协议. 声明tlplayer 上的变速 ...
- 重装系统后恢复wubi安装的Ubuntu(未实测)
wubi安装成功,但是后来windows系统重装了,如何修复ubuntu系统的引导?[另外完全可以复制别人的wubi安装的ubuntu,但是要放在同一个盘符下] 将X:/ubuntu/winboo ...
- RF--- selenium
- bit-map再显身手:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数。限制: 可用内存为600MB.
先看看这个题目:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数. 限制: 可用内存为600MB. 又是大数据. 看到42亿, 有灵感没? 要知道, 2的32次方 ...
- Smart Battery Specification Revision 1.1
1.SBS Specifications 2.System Management Bus (SMBus) Specification
- MongoDB--安装部署
MongoDB安装 说明: 本次安装教程: 版本:mongoDB-3.2.4 安装环境:windows 10 ,64位操作系统 准备:安装包.Robomongo(客户端用于查看mongoDB里面的数据 ...
- 跟着实例学习设计模式(6)-生成器模式builder(创建型)
生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...