BZOJ 3262 陌上花开 ——CDQ分治
【题目分析】
多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间。
然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可。
挺有套路的一种算法。
时间的抽象很巧妙。
同种的花需要处理,合并在一起计算即可。
【代码】
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define ll long long
#define maxn 300005
struct flo{int a,b,c,id;}q[maxn],eq[maxn],nq[maxn];
int cnt,k,top=0,ans[maxn],T,c[maxn];
vector <int> v[maxn];
bool cmp(flo x,flo y)
{
if (x.a==y.a&&x.b==y.b) return x.c<y.c;
if (x.a==y.a) return x.b<y.b;
return x.a<y.a;
}
bool cmp2(flo x,flo y)
{
if (x.b==y.b&&x.c==y.c) return x.a<y.a;
if (x.b==y.b) return x.c<y.c;
return x.b<y.b;
}
struct Bit_Tree{
int v[maxn];
void init(){memset(v,0,sizeof v);}
void add(int x,int f)
{for (;x<=k;x+=x&(-x)) v[x]+=f;}
int sum(int x)
{
int ret=0;
for (;x;x-=x&(-x)) ret+=v[x];
return ret;
}
}t;
void solve(int l,int r)
{
if (l==r) return ;
int mid=(l+r)/2;
for (int i=l;i<=r;++i)
{
if (eq[i].a<=mid) t.add(eq[i].c,v[eq[i].id].size());
if (eq[i].a>mid)
{
int tmp=t.sum(eq[i].c);
for (int j=0;j<v[eq[i].id].size();++j)
ans[v[eq[i].id][j]]+=tmp;
}
}
int p1=l,p2=mid+1;
for (int i=l;i<=r;++i) if (eq[i].a<=mid) t.add(eq[i].c,-v[eq[i].id].size());
for (int i=l;i<=r;++i) if (eq[i].a<=mid) nq[p1++]=eq[i]; else nq[p2++]=eq[i];
for (int i=l;i<=r;++i) eq[i]=nq[i];
solve(l,mid);
solve(mid+1,r);
}
int main()
{
scanf("%d%d",&cnt,&k);
for (int i=1;i<=cnt;++i) scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].c),q[i].id=i;
sort(q+1,q+cnt+1,cmp);
for (int i=1;i<=cnt;++i)
{
if (!top) eq[++top]=q[i],v[top].push_back(q[i].id);
else if (eq[top].a!=q[i].a||eq[top].b!=q[i].b||eq[top].c!=q[i].c) eq[++top]=q[i],v[top].push_back(q[i].id);
else v[top].push_back(q[i].id);
eq[top].id=top;
}
for (int i=1;i<=top;++i) eq[i].a=i;
sort(eq+1,eq+top+1,cmp2);
solve(1,top);
for (int i=1;i<=top;++i)
for (int j=0;j<v[eq[i].id].size();++j)
ans[v[eq[i].id][j]]+=v[eq[i].id].size()-1;
for (int i=1;i<=cnt;++i) c[ans[i]]++;
for (int i=0;i<cnt;++i) printf("%d\n",c[i]);
}
BZOJ 3262 陌上花开 ——CDQ分治的更多相关文章
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 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 3262: 陌上花开 CDQ
这个题大部分人用了离散然后水之,然而.....作为一只蒟蒻我并没有想到离散,而是直接拿两个区间一个对应n,一个对应k来搞,当然这两个区间是对应的,我把第一维排序,第二维CDQ,第三维树状数组,然而由于 ...
- [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 三个属性 ...
- Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...
随机推荐
- JS学习:第一周——NO.4继承
1.[关于call] 作用:是用来改变this指向的,有两种参数 第一种:第一个参数,用来改变this指向 第二种:给call前面的函数传参,从第二个参数开始,给call前面的函数从左到右一个个的传参 ...
- ORA-01033 ORACLE 正在初始化或关闭
(借鉴:该方法本人亲自操作过,解决了问题!) 解决连接ORACLE错误一例:ORA-01033: ORACLE 正在初始化或关闭 客户发现连接数据库有问题,错误有: ORA-01033: ORACLE ...
- client offset screen 的区别
clientX 设置或获取鼠标指针位置相对于窗口客户区域的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条. clientY 设置或获取鼠标指针位置相对于窗口客户区域的 y 坐标,其中客户区域不包 ...
- IIS GZip
优点:提高网页响应速度(静态压缩会占用一定的存储空间,但是速度快,而动态压缩不占用存储空间,但是占用CPU时间,而且压缩比不恒定.) 缺点:动态压缩会影响CPU性能. win7:设置: iis管理器- ...
- 7九章算法强化班全解--------Hadoop跃爷Spark
------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...
- 卸载linux Mint自带jdk并安装最新jdk
查看安装的软件包sudo dpkg --list | grep -i jdk 删除jdksudo apt-get purge openjdk* 删除其他的包sudo apt-get purge ice ...
- 最新Mac OS X 10.12.1 安装cocoapods及使用详解
cocoapods官网:https://cocoapods.org 一.什么是CocoaPods 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如 Java 语言的 Maven,nodejs ...
- iOS web remote debug 正确的姿势
在使用iOS Remote debug需要做以下准备 1. iOS devices 开启java script and web inspector 开启方式如下: 2. mac OS 自带的Safar ...
- 重建索引提高SQL Server性能
大多数SQL Server表需要索引来提高数据的访问速度,如果没有索引,SQL Server 要进行表格扫描读取表中的每一个记录才能找到索要的数据.索引可以分为簇索引和非簇索引,簇索引通过重排表中的数 ...
- ios项目里扒出来的json文件
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...