P3810 【模板】三维偏序(陌上花开)(cdq分治)
思路
看到这种偏序类的题目,而且不要求强制在线,可以立刻想到cdq分治
注意这题有一个问题,就是询问的是小于等于而不是小于,如果相等的话两个元素会相互贡献,而cdq的特点是右区间不能对左边有影响,所以要先去重,再然后就是板子
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,maxn;
namespace BIT{
int bit[200100];
int lowbit(int x){
return x&(-x);
}
void add(int pos,int val){
while(pos<=maxn){
bit[pos]+=val;
pos+=lowbit(pos);
}
}
int query(int pos){
int ans=0;
while(pos){
ans+=bit[pos];
pos-=lowbit(pos);
}
return ans;
}
void clear(int pos){
while(pos<=maxn){
if(bit[pos])
bit[pos]=0;
else
break;
pos+=lowbit(pos);
}
}
}
struct Num{
int a,b,c,val;
bool operator == (const Num &bx) const{
if(a==bx.a&&b==bx.b&&c==bx.c)
return true;
return false;
}
bool operator < (const Num &bx) const{
if(a<bx.a)
return true;
else if(a==bx.a&&b<bx.b)
return true;
else if(a==bx.a&&b==bx.b&&c<bx.c)
return true;
else return false;
}
}a[100100],num[100100];
int ans[100100],d[100100];
int cntnum=0,qid,aid;
struct Query{
int posx,valy,val,aid;
}query[100100<<1];
Query tmp[100100<<1];
void cdq(int L,int R){
// printf("%d %d\n",L,R);
if(R<=L+1)
return;
int mid=(L+R)>>1;
cdq(L,mid);
cdq(mid,R);
int l=L,r=mid,tot=0;
while(l<mid&&r<R){
if(query[l].posx<=query[r].posx){
BIT::add(query[l].valy,query[l].val);
tmp[++tot]=query[l++];
}
else{
ans[query[r].aid]+=BIT::query(query[r].valy);
tmp[++tot]=query[r++];
}
}
while(l<mid)
tmp[++tot]=query[l++];
while(r<R){
ans[query[r].aid]+=BIT::query(query[r].valy);
tmp[++tot]=query[r++];
}
for(int i=1;i<=tot;i++){
BIT::clear(tmp[i].valy);
query[i+L-1]=tmp[i];
}
}
int main(){
scanf("%d %d",&n,&maxn);
for(int i=1;i<=n;i++)
scanf("%d %d %d",&a[i].a,&a[i].b,&a[i].c),a[i].val=1;
sort(a+1,a+n+1);
// printf("ok\n");
// for(int i=1;i<=n;i++)
// printf("%d %d %d\n",a[i].a,a[i].b,a[i].c);
num[++cntnum]=a[1];
for(int i=1;i<=n-1;i++){
if(a[i]==a[i+1])
num[cntnum].val++;
else
num[++cntnum]=a[i+1];
}
for(int i=1;i<=cntnum;i++){
query[++qid].posx=num[i].b;
query[qid].aid=++aid;
query[qid].valy=num[i].c;
query[qid].val=num[i].val;
}
// printf("ok\n");
cdq(1,qid+1);
for(int i=1;i<=qid;i++){
d[ans[query[i].aid]+query[i].val-1]+=query[i].val;
}
for(int i=0;i<=n-1;i++)
printf("%d\n",d[i]);
return 0;
}
P3810 【模板】三维偏序(陌上花开)(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 ...
- N维偏序:cdq分治
cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...
- bzoj3262陌上花开 cdq分治
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2794 Solved: 1250[Submit][Status][Discus ...
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
随机推荐
- pycharm python3.5 神奇的导入问题
说明:pycharm目录中没有同名.py文件,则可以直接用import util导入: 若有同名.py文件,则导入的时候需要加入所在文件夹名称
- css中选项卡的实现
制作一个简单的选项卡,以供初学者参考:关于css书写的比较粗糙.请见谅 <!DOCTYPE html><html lang="en"><head> ...
- Flask的请求对象--request
request-Flask的请求对象 请求解析和响应封装大部分是有Werkzeug完成的,Flask子类化Werkzeug的请求(Request)对象和响应(Response)对象,并添加了和程序的特 ...
- Linux基础命令---显示登录用户w
w 显示哪些用户登录,并且显示用户在干什么.报头按此顺序显示当前时间.系统运行时间.当前登录用户数以及过去1.5和15分钟的系统平均负载.接着为每个用户显示以下条目:登录名.TTY名称.远程主机.登录 ...
- 转:C#线程系列讲座(1) BeginInvoke和EndInvoke方法
转载自:http://www.cnblogs.com/levin9/articles/2319248.html 开发语言:C#3.0IDE:Visual Studio 2008本系列教程主要包括如下内 ...
- JustOj 2043: N!
题目描述 输出N的阶乘.(注意时间限制150ms&&注意不能打表后输出,赛后我们会检查代码,如有发现,该位同学总分记0分处理) 打表的定义:在本地主机预先计算出了每个值对应的答案,并把 ...
- nmap扫描验证多种漏洞
nmap在Kali Linux中是默认安装的.它不仅可以用来确定目标网络上计算机的存活状态,而且可以扫描各个计算机的操作系统.开放端口.服务,还有可能获得用户的证书. 命令结构: nmap -sS - ...
- linux 安装sqlite3
python2个版本导致的问题. 网上找了好多方法都不行. 最后自己莫名其妙弄好了, 回想了一下大概是 安装sqlite3 重新安装python 最后 yum update 更新 就好了.
- Leetcode480-Sliding Window Median
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
- 斯坦福机器学习ex1.1(python)
使用的工具:NumPy和Matplotlib NumPy是全书最基础的Python编程库.除了提供一些高级的数学运算机制以外,还具备非常高效的向量和矩阵运算功能.这些对于机器学习的计算任务是尤为重要的 ...