bzoj 3263 陌上花开(cdq分治,BIT)
【题意】
求满足Ai<=Aj,Bi<=Bj,Ci<=Cj的数对的数目。
【思路】
cdq分治
借网上一句话:第一维排序,第二维cdq分治,第三维树状数组维护。
首先合并三维都是相同的项。
先按照第一维排序然后cdq分治。
定义solve(l,r)为解决区间l,r内所有询问且solve结束后区间有序,设mid=(l+r)/2,
1) Solve(l,mid)
2) Solve(mid+1,r)
//因为经过第一维排序,所以左区间的a都小于等于右区间的a。
3) 处理跨立影响。因为已经排过序,所以左区间的a都要小于右区间的a,因为solve后区间有序,所以左右区间都各自按照b排好了序。按照归并排序的思路,计算左区间对每一个右区间内点的贡献:处理到右区间的l2时,将所有左区间内比他的b小的加入BIT,这时候只要查询一次就可以得出左区间对l2的贡献。
4) 清理BIT,并按照b c大小将左右区间合并使区间有序
最后根据题目要求转化一下。
总的时间为O(nlog^2n),bingo
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int N = *1e5+; struct Node {
int a,b,c,s,ans;
}que[N],a[N]; bool cmp1(const Node& x,const Node& y) {
return x.b<y.b||(x.b==y.b&&x.c<y.c);
}
bool cmp2(const Node& x,const Node& y) {
if(x.a==y.a&&x.b==y.b) return x.c<y.c;
else if(x.a==y.a) return x.b<y.b;
else return x.a<y.a;
} int n,K,C[N],ans[N]; void add(int x,int v)
{
for(;x<=K;x+=x&-x) C[x]+=v;
}
int query(int x)
{
int res=;
for(;x;x-=x&-x) res+=C[x];
return res;
}
Node t[N];
void solve(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>;
solve(l,mid) , solve(mid+,r);
int l1=l,l2=mid+;
while(l2<=r) {
while(l1<=mid && que[l1].b<=que[l2].b) {
add(que[l1].c,que[l1].s);
l1++;
}
que[l2].ans+=query(que[l2].c);
l2++;
}
for(int i=l;i<l1;i++)
add(que[i].c,-que[i].s);
l1=l,l2=mid+; int pos=l;
while(l1<=mid||l2<=r) {
if(l2>r||(l1<=mid&&cmp1(que[l1],que[l2]))) t[pos++]=que[l1++];
else t[pos++]=que[l2++];
}
for(int i=l;i<=r;i++) que[i]=t[i];
}
void read(int& x)
{
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*+c-'',c=getchar();
}
int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);
read(n),read(K);
for(int i=;i<=n;i++)
read(a[i].a),read(a[i].b),read(a[i].c);
sort(a+,a+n+,cmp2);
int cnt=,sz=;
for(int i=;i<=n;i++) {
cnt++;
if(a[i].a!=a[i+].a||a[i].b!=a[i+].b||a[i].c!=a[i+].c)
{
que[++sz]=a[i];
que[sz].s=cnt;
cnt=;
}
}
solve(,sz);
for(int i=;i<=sz;i++)
ans[que[i].ans+que[i].s-]+=que[i].s;
//评级为0~n-1的每级花的数量
for(int i=;i<n;i++)
printf("%d\n",ans[i]);
return ;
}
bzoj 3263 陌上花开(cdq分治,BIT)的更多相关文章
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- BZOJ 3262 陌上花开 ——CDQ分治
[题目分析] 多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间. 然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可. 挺有套路的一种算法. 时间的抽象很巧妙. 同种 ...
- BZOJ 3262 陌上花开 CDQ分治
= =原来复杂度还是nlog^2(n) Orz 被喷了 #include<cstdio> #include<cstdlib> #include<algorithm> ...
- BZOJ 3262: 陌上花开 (cdq分治,三维偏序)
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; c ...
- [BZOJ 3456]城市规划(cdq分治+FFT)
[BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...
- [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)
[BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
- [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...
随机推荐
- linux 添加用户
1.下面就开始来说怎么添加新用户 我们以添加一个用户名为jorcen的新用户为例来说明,执行下面的命令: # useradd jorcen 2.那么就新用户就添加完成,但是没有任何信息,新用户添加完成 ...
- js按钮点击展开收起
$('.tab').click(function(){ var index = $('.tab').index(this), //缓存第一次点击的li的索引值 ele = $(this).find(' ...
- mac下设置maven环境
在mac系统下设置maven环境. 1.首先通过终端打开 .bash_profile 2.设置maven解压后的路径地址 环境变量设置如下: MAVEN_HOME .PATH 两个变量即可 3. ...
- 【搜索】BZOJ 3990: 【Sdoi 2015】排序
3990: [SDOI2015]排序 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 336 Solved: 164[Submit][Status][ ...
- Jenkins任务启动的后台进程被自动kill
在Jenkins的使用中,遇到过的一个场景是:在web代码更改之后,能自动的部署到测试服务器,我们写了run.sh脚本来重启服务,在使用Jenkins的任务自动跑这个脚本后发现,服务没有起来.开始以为 ...
- Host Definition
Description: A host definition is used to define a physical server, workstation, device, etc. that r ...
- Google Play市场考察报告-2
接上文,本次继续考察App. (6)CNBETA win8平板客户端 cnBeta是国内少有的科技类资讯网站,在程序员群体中具有很大影响力.面向程序员的软件应用在APP中一向属于少数,然而程序员群体已 ...
- [itint5]下一个排列
http://www.itint5.com/oj/#6 首先,试验的时候要拿5个来试,3,4个都太少了.好久没做所以方法也忘了,是先从后往前找到第一个不合顺序的,然后在后面找到比这个大的最小的来交换, ...
- Servlet课程0426(十一)Servlet Cookie实现两周内不用重复登录
Welcome.java //登录界面 package com.tsinghua; import javax.servlet.http.*; import java.io.*; import java ...
- JavaEE的13种核心技术
Java的大方向就是JavaEE,JavaEE不仅仅是socket编程,具体包括13中核心技术. JavaEE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于We ...