BZOJ3262:陌上花开
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3262
我们可以将每个花看做是一次插入和一次询问,并且在时间轴上的顺序是按照第一关键字、第二关键字和第三关键字的优先级从小到大排好序的。由于相同的花之间会互相影响,也就是会存在后面插入的花对前面的花有贡献,所以我们就把相同的花合并,看做是在一瞬间插入\(cnt\)朵花。
然后由于排好序之后消除了第一维关键字的影响,所以我们只需在\(solve\)函数内做静态的二维数点问题即可。每朵花会被\(solve\) \(logn\)次,每次\(solve\)中在树状数组里更改和查询都是\(logn\)的,所以每朵花对复杂度的贡献是\(log^2n\)
时间复杂度:\(O(nlog^2n)\)
空间复杂度:\(O(n)\)
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
#define low(i) ((i)&(-(i)))
const int maxn=1e5+5;
int n,k,cnt;
int ans[maxn];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct flower {
int a,b,c,id,ans,cnt;
bool operator<(const flower &tmp)const {
if(a==tmp.a&&b==tmp.b)return c<tmp.c;
if(a==tmp.a)return b<tmp.b;
return a<tmp.a;
}
}p[maxn];
bool cmp(flower a,flower b) {
if(a.b==b.b)return a.id<b.id;
return a.b<b.b;
}
struct tree_array {
int c[maxn<<1];
void add(int pos,int v) {
for(int i=pos;i<=k;i+=low(i))
c[i]+=v;
}
int query(int pos) {
int res=0;
for(int i=pos;i;i-=low(i))
res+=c[i];
return res;
}
}T;
void solve(int l,int r) {
if(l==r)return;
int mid=(l+r)>>1;
solve(l,mid),solve(mid+1,r);
sort(p+l,p+r+1,cmp);
for(int i=l;i<=r;i++)
if(p[i].id<=mid)T.add(p[i].c,p[i].cnt);
else p[i].ans+=T.query(p[i].c);
for(int i=l;i<=r;i++)
if(p[i].id<=mid)T.add(p[i].c,-p[i].cnt);
}
int main() {
n=read(),k=read();
for(int i=1;i<=n;i++)
p[i].a=read(),p[i].b=read(),p[i].c=read();
sort(p+1,p+n+1);
for(int i=1;i<=n;i++)
if(p[i].a==p[i-1].a&&p[i].b==p[i-1].b&&p[i].c==p[i-1].c)
p[cnt].cnt++;
else p[++cnt]=p[i],p[cnt].cnt=1;
for(int i=1;i<=cnt;i++)p[i].id=i;
solve(1,cnt);
for(int i=1;i<=cnt;i++)
ans[p[i].ans+p[i].cnt-1]+=p[i].cnt;
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
return 0;
}
BZOJ3262:陌上花开的更多相关文章
- [BZOJ3262]陌上花开
[BZOJ3262]陌上花开 试题描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一 ...
- bzoj3262 陌上花开 cdq+树状数组
[bzoj3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...
- bzoj3262陌上花开 cdq分治
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2794 Solved: 1250[Submit][Status][Discus ...
- BZOJ3262 陌上花开 —— 三维偏序 CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit ...
- bzoj3262陌上花开 cdq分治入门题
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
- bzoj3262: 陌上花开(树套树)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- [模板] CDQ分治&&BZOJ3262:陌上花开
简介 CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\). 它可以用来顶替一些高级(log)数据结构等. 一般地, CDQ分治 ...
- [luogu3810][bzoj3262][陌上花开]
题目链接 思路 听说可以CDQ分治,然后我不会,所以我写树套树 首先肯定先按照a拍个序.然后就成了在b,c这两个数组中查询了.用一个树状数组套treap来维护.当插入一个数的时候,就在树状数组的b这个 ...
- bzoj3262: 陌上花开(CDQ+树状数组处理三维偏序问题)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 题目大意:中文题目 具体思路:CDQ可以处理的问题,一共有三维空间,对于第一维我们 ...
随机推荐
- 在看 jquery 源码中发现的一些优化方向
1. 避免使用 $.fn.each 或 $.each 因为它比原生的 for/while 真的会慢一些,循环次数越多差距越大. 另外,对象的 for-in 比 for 是要快一丢丢的,但数组的 for ...
- /usr/lib/update-notifier/updates-available
/usrb/update-notifier/update-motd-updates-available: 49: /usrb/update-notifier/update-motd-updates- ...
- python之json模块的基本使用
json模块的作用:将字符串和字典相互转换 json和eval的区别: eval函数不能识别null转换成None json可以将null转换成python可以识别的None json序列化和反序列化 ...
- python的语法错误总结
1.keyerror一般是你使用字典里不存在的key产生的错误. 2.TypeError一般是使用的数据类型不符合要求 join函数要求a都是string
- 七 、linux正则表达式
为处理大量的字符串而定义的一套规则和方法 1)linux正则表达式以行为单位处理 2)alians grep = “grep –color=auto”,让匹配的内容显示颜色 3)注意字符集,expor ...
- Kubernetes Metrics-Server
github地址:https://github.com/kubernetes-incubator/metrics-server 官网介绍:https://kubernetes.io/docs/task ...
- Oracle基本概念
1. 数据库和实例 什么是数据库,其实很简单,数据库就是存储数据的一种媒介.比如常用的文件就是一种,在Oracle10g中,数据的存储有好几种.第一种是文件形 式,也就是在你的磁盘中创建一批文件,然后 ...
- 在Java项目中部署使用Memcached[转]
在项目中使用到Memcached主要的目的是,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态.数据库驱动网站的速度.提高可扩展性.Memcached是一个高性能的分布式内存对象缓存系统,基于 ...
- Tomcat虚拟目录的配置
Tomcat可以作为应用服务器部署Java应用,同时可以创建虚拟目录存放图片,相当于一个图片服务器使用1. 创建目录 /usr/images/2. 编辑TOMCAT_HOME/conf/server. ...
- redis memcached MongoDB
我们现在使用的模式是,对于直接的key value对需缓存的直接用memcached.对于collection类型就使用Redis.对于大数据量的内容性的东西,我们打算尝试用mongoDB.也正在学习 ...