bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description
Input
Output
Sample Input
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1
Sample Output
1
3
0
1
0
1
0
0
1
HINT
1 <= N <= 100,000, 1 <= K <= 200,000
Source
题目大意 三维偏序计数。
首先偏序问题对于5维以下,通常有两种做法
1)k-1层套树(我表示拒绝写这类程序,宁可写O(n2k)大暴力骗分,都不会去写这种"正解")
2)CDQ分治 + (k - 2)层套树(比上面那种方法好多了)
对于3维偏序,显然法2更优秀。可以参考上一道题(bzoj 1176)的做法。
按c维第1关键字,m为第二关键字,s为第三关键字进行排序。
对s进行CDQ分治。统计s在[l, mid]中的元素对[mid + 1, r]中的元素的贡献。用和上一道题同样的做法,将(c, m)看成一个点,左区间中的点看成修改操作,将点(c, m)的权值 + 1,右区间中的点看成查询一个子矩阵的点权和。然后做法一模一样。
当l == r的时候就当成2维偏序问题,用树状数组水过。此时注意对于重复的判断。
Code
/**
* bzoj
* Problem#3262
* Accepted
* Time:1628ms
* Memory:9012k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; typedef class Data {
public:
int val[];
int id; Data():val({, , }), id() { } friend boolean operator < (const Data& a, const Data &b) {
for(int i = ; i < ; i++)
if(a.val[i] != b.val[i])
return a.val[i] < b.val[i];
return a.val[] < b.val[];
} boolean operator == (Data b) {
return val[] == b.val[] && val[] == b.val[] && val[] == b.val[];
}
}Data; #define lowbit(x) ((x) & (-x)) typedef class IndexedTree {
public:
int s;
int *lis; IndexedTree():lis(NULL), s() { }
IndexedTree(int s):s(s) {
lis = new int[(s + )];
memset(lis, , sizeof(int) * (s + ));
} inline void add(int idx, int x) {
for(; idx <= s; idx += lowbit(idx))
lis[idx] += x;
} inline int getSum(int idx) {
int rt = ;
for(; idx; idx -= lowbit(idx))
rt += lis[idx];
return rt;
}
}IndexedTree; int n, K;
vector<Data> ds;
IndexedTree it;
int *scores;
int *cnts; inline void init() {
scanf("%d%d", &n, &K);
scores = new int[(n + )];
cnts = new int[(n + )];
memset(scores, , sizeof(int) * (n + ));
memset(cnts, , sizeof(int) * (n + ));
Data d;
for(int i = ; i < n; i++) {
for(int j = ; j < ; j++)
scanf("%d", &d.val[j]);
d.id = i;
ds.push_back(d);
}
} void CDQDividing(int l, int r, vector<Data> &q) {
if(q.empty()) return;
if(l == r) {
for(int i = , j; i < (signed)q.size(); i = j) {
it.add(q[i].val[], );
for(j = i + ; j < (signed)q.size() && q[j] == q[j - ]; j++)
it.add(q[j].val[], );
int c = it.getSum(q[i].val[]);
for(int k = i; k < j; k++)
scores[q[k].id] += c - ;
}
for(int i = ; i < (signed)q.size(); i++)
it.add(q[i].val[], -);
return;
} int mid = (l + r) >> ;
vector<Data> ql, qr;
for(int i = ; i < (signed)q.size(); i++) {
if(q[i].val[] <= mid)
it.add(q[i].val[], ), ql.push_back(q[i]);
else
scores[q[i].id] += it.getSum(q[i].val[]), qr.push_back(q[i]);
} for(int i = ; i < (signed)ql.size(); i++)
it.add(ql[i].val[], -); q.clear();
CDQDividing(l, mid, ql);
CDQDividing(mid + , r, qr);
} inline void solve() {
sort(ds.begin(), ds.end());
it = IndexedTree(K);
// for(int i = 0; i < n; i++)
// printf("%d %d %d\n", ds[i].val[0], ds[i].val[1], ds[i].val[2]);
CDQDividing(, K, ds);
for(int i = ; i < n; i++)
cnts[scores[i]]++;
for(int i = ; i < n; i++)
printf("%d\n", cnts[i]);
} int main() {
init();
solve();
return ;
}
bzoj 3262 陌上花开 - CDQ分治 - 树状数组的更多相关文章
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
- [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)
题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- BZOJ_3262_陌上花开_CDQ分治+树状数组
BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...
- LOJ3146 APIO2019路灯(cdq分治+树状数组)
每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...
随机推荐
- LINQ以及LINQ to Object 和LINQ to Entities
LINQ的全称是Language Integrated Query,中文译成“语言集成查询”,是一种查询技术. LINQ查询通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了查询过程.LIN ...
- python3学习笔记之安装
一.Python安装 1.下载地址: https://www.python.org/downloads/release/python-365/ 2. Linux系统自带Python2.7,如需安装3 ...
- Python记录1:基础知识常识
今日内容: 一,Python的数据类型 Python一共有以下几种常见的数据类型:int(整形) float(浮点型) str(字符串) list(列表) tuple元组 dict(字典) ...
- centos python2升级为python3 升级旧版本django
阿里云centos python3 及django的配置 安装python3后 pip 会把下载的包安入python2.7 下面解决该问题 python3.5安装1,安装依赖包#yum install ...
- DataSet 读取xml 报错有非法字符
private void Bind() { string strLogPath = ConfigurationSettings.AppSettings["LOG_PATH"].To ...
- Sitecore CMS中查看标准字段
什么是标准字段? 标准字段是字段及其字段组的集合,用于包含有关Sitecore中项目的可配置元数据.Sitecore中继承自“标准模板”模板的任何项目都将包含这些字段. 可以在“标准模板”模板项找到/ ...
- sitecore系统教程之媒体库
您可以管理媒体库中的所有媒体项目,例如要嵌入网页的图像或供访问者下载的图像.媒体库包含所有媒体项目,例如图像,文档,视频和音频文件. 在媒体库中,您可以: 将所有媒体文件保存在一个位置,并将其组织在与 ...
- 准备spring
下载对应版本:http://repo.spring.io/libs-release-local/org/springframework/spring/ Spring下载:https://spring. ...
- [openjudge-搜索]Lake Counting(翻译及实现)
题目原文 描述 Due to recent rains, water has pooled in various places in Farmer John's field, which is rep ...
- 城市里的间谍B901
城市里的间谍 城市里的间谍 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 某城市的地铁是线性的,有 n(2 <= n ...