三维偏序(陌上花开) CDQ分治
十分巧妙。
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 200000
#define N 3000000
#define ll long long
using namespace std;
int k,n;
int C[N],ans[maxn],cnt[maxn];
int lowbit(int x){ return x&(-x); }
void add(int pos,int x){
while(pos<=k) C[pos]+=x,pos+=lowbit(pos);
}
int query(int pos){
int sum=0;
while(pos>0) sum+=C[pos],pos-=lowbit(pos);
return sum;
}
struct OPT{
int x,y,z,w,idx;
}arr[maxn],opt[maxn];
int cmpx(OPT a,OPT b){ return (a.x==b.x&&a.y==b.y)?(a.z<b.z):((a.x==b.x)?a.y<b.y:a.x<b.x); }
int cmpy(OPT a,OPT b){ return (a.y==b.y)?a.z<b.z:a.y<b.y; }
void solve(int l,int r){
if(l>=r) return;
int mid=(l+r)>>1;
solve(l,mid),solve(mid+1,r);
sort(opt+l,opt+mid+1,cmpy),sort(opt+mid+1,opt+r+1,cmpy);
int p=l,q=mid+1;
for(;q<=r;++q){
while(opt[p].y<=opt[q].y&&p<=mid) add(opt[p].z,opt[p].w),++p;
ans[opt[q].idx]+=query(opt[q].z);
}
for(int i=l;i<p;++i) add(opt[i].z,-opt[i].w);
}
int main()
{
//setIO("input");
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)scanf("%d%d%d",&arr[i].x,&arr[i].y,&arr[i].z);
sort(arr+1,arr+1+n,cmpx);
int u=n,cc=0;
n=0;
for(int i=1;i<=u;++i){
++cc;
if(arr[i].x!=arr[i+1].x||arr[i].y!=arr[i+1].y||arr[i].z!=arr[i+1].z)
opt[++n]=arr[i],opt[n].w=cc,opt[n].idx=n,cc=0;
}
solve(1,n);
for(int i=1;i<=n;i++)
cnt[ans[opt[i].idx]+opt[i].w-1]+=opt[i].w;
for(int i=0;i<u;++i) printf("%d\n",cnt[i]);
return 0;
}
三维偏序(陌上花开) CDQ分治的更多相关文章
- BZOJ3262: 陌上花开(三维偏序,CDQ分治)
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...
- HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
Jam's problem again Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- hdu5618 (三维偏序,cdq分治)
给定空间中的n个点,问每个点有多少个点小于等于自己. 先来分析简单的二维的情况,那么只要将x坐标排序,那么这样的问题就可以划分为两个子问题,,这样的分治有一个特点,即前一个子问题的解决是独立的,而后一 ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1439 Solved: 648[Submit][Status][Discuss ...
- bzoj3262陌上花开 cdq分治
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2794 Solved: 1250[Submit][Status][Discus ...
- N维偏序:cdq分治
cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
随机推荐
- m_Orchestrate learning system---一、amazeui如何使用
m_Orchestrate learning system---一.amazeui如何使用 一.总结 一句话总结:先花几分钟把所有功能稍微看一下,然后做的时候就会特别快,所以,多学习,学得越多做的越快 ...
- javascript系列-class3.循环语句
欢迎加入前端交流群来py: 转载请标明出处! while循环 while(循环终止条件){ } 案例 输出0~100个数字 1 . 3 . 5 不输出 输出一百数字 ...
- javascript系列-class2.javascript 基本使用
欢迎加入前端交流群来py: 转载请标明出处! 逻辑运算 一门计算机语言,编程的核心在于逻辑思想,当我们在编写程序的时候,逻辑是否通顺,是能否正确写出程序的关键,可以说如 ...
- 50.AngularJs directive详解及示例代码
转自:https://www.cnblogs.com/best/tag/Angular/ 本教程使用AngularJs版本:1.5.3 AngularJs GitHub: https://github ...
- [luogu P2123] 皇后游戏 解题报告(贪心)
题目链接:https://www.luogu.org/problemnew/show/P2123 题目大意: 给定a数组和b数组,要求最小化c数组中的最大值 题解: 考虑微扰法,推一波式子先 设$x= ...
- Web前端错题模糊题记录
title: Web前端错题模糊题记录 toc: true date: 2018-09-20 10:04:36 categories: Web tags: HTML CSS JavaScript HT ...
- 跨域调用接口——WebClient通过get和post请求api
AJAX不可以实现跨域请求,经过特殊处理才行.一般后台可以通过WebClient实现跨域请求~ //get 请求 string url = string.Format("htt ...
- HTML 导航框架
首页效果图 点击链接一效果图 代码结构 index.jsp <%@ page language="java" import="java.util.*" p ...
- 在js中关于同名变量和函数的地位争夺问题
先上一段让大家比较蒙圈的代码,接下来再慢慢讲解 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- mysql 临时表和内存表
查看内存表的最大值: show variables like '%heap%'; mysql> show variables like '%heap%'; +------------------ ...