初学CDQ分治-NEU1702
关于CDQ分治,首先需要明白分治的复杂度。
T(n) = 2T(n/2)+O(kn), T(n) = O(knlogn)
T(n) = 2T(n/2)+O(knlogn), T(n) = O(knlog^2n)
T(n) = 2T(n/2)+O(k), T(n) = O(kn)
那么我们要处理[l, r]内的询问,我们可以分别处理[l, m]和[m+1, r]的询问,然后以较小的复杂度计算出[l, m]对[m+1, r]的贡献。
最简单的cdq就是三维偏序问题。
两点(x1, y1, z1)和(x2, y2, z2),同时满足x1 < x2, y1 < y2, z1 < z2,则前面的点小于后面的点。
首先按第一维x排序。
则处理的问题变成对于排在前面的点,统计多少个点满足y维与z维同时小于该点。
CDQ分治。
假设已处理出[l, m]与[m+1, r]。对于[m+1, r]内的所有点,我们还要统计[l, m]内有多少个点相比它更小。
对[l, r]按y维排序,对z维用树状数组统计。
扫描一遍排序后的[l, r]。
若该点在排序前属于[l, m],树状数组单点修改;否则该点在排序前属于[m+1, r],统计一次。
复杂度为O(nlognlogn)
CDQ分治算法的核心就在于:去掉时间的限制,将所有查询要求发生的时刻同化,化动态修改为静态查询
(其实对于有些问题来说可以把某一维的限制通过排序看作时间限制然后运用CDQ分治)
这类分治的特殊性在于分治的左右两部分的合并,作用两部分在合并的时候作用是不同的,比如,通过左半部分的影响来更新右半部分,所以分治开始前都要按照某一个关键字排序,然后利用这个顺序,考虑一个区间[l, r]的两部分间的影响。
框架为
void cdq(int l, int r){
if(l == r) return ;
int m = (l+r)/;
cdq(l, m);
cdq(m+, r); //统计[l, m]对[m+1, r]的贡献。整体排序后统计。
sort(pp+l, pp+r+, yzx);
for(int i = l; i <= r; i++)
if(pp[i].x <= m)
add(pp[i].z, );
else
ans[ pp[i].n ] += sum(pp[i].z);
for(int i = l; i <= r; i++)
if(pp[i].x <= m)
add(pp[i].z, -);
}
题意:一个人的魅力值是相对于周围人来说的,如果他的颜值,内涵和智慧值同时不低于另外一个人,那么他的魅力值就会加1,给你一些人的颜值,内涵,和智慧值,请输出这些人的魅力值。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+;
struct p{
int n, x, y, z;
p(){}
p(int n, int x, int y, int z): n(n), x(x), y(y), z(z){}
bool operator <(const p& A) const{
if(x != A.x) return x < A.x;
return y != A.y? y < A.y: z < A.z;
}
bool operator ==(const p& A) const{
return x == A.x&&y == A.y&&z == A.z;
}
};
bool yzx(p A, p B){//y z x
if(A.y != B.y) return A.y < B.y;
return A.z != B.z? A.z < B.z : A.x < B.x;
}
bool cmpn(p A, p B){//n
return A.n < B.n;
}
p pp[maxn]; int c[maxn], Maxn;
int lowbit(int x){ return x&-x;}
int add(int x, int d){
for(int i = x; i <= Maxn; i += lowbit(i))
c[i] += d;
}
int sum(int x){
int ret = ;
for(int i = x; i; i -= lowbit(i))
ret += c[i];
return ret;
} int ans[maxn]; void cdq(int l, int r){
if(l == r) return ;
int m = (l+r)/;
cdq(l, m);
cdq(m+, r);
sort(pp+l, pp+r+, yzx);
for(int i = l; i <= r; i++)
if(pp[i].x <= m)
add(pp[i].z, );
else
ans[ pp[i].n ] += sum(pp[i].z);
for(int i = l; i <= r; i++)
if(pp[i].x <= m)
add(pp[i].z, -);
} int same[maxn];// smae[i] 表示 下标为i的ans 与 下标为same[i]相同 int main(){
int T; scanf("%d", &T);
while(T--){
int n;scanf("%d", &n);
for(int i = ; i < n ; i++){
pp[i].n = i;
scanf("%d%d%d", &pp[i].x, &pp[i].y, &pp[i].z);
Maxn = max(pp[i].z, Maxn);
}
sort(pp, pp+n);//x y z for(int i = ; i < n; ){
int j = i+;
while(j < n&&pp[i] == pp[j]) j++;
while(i < j)
same[ pp[i++].n ] = pp[j-].n;
}
for(int i = ; i < n; i++)
pp[i].x = i; memset(ans, , sizeof(int)*(n+) );
cdq(, n-); sort(pp, pp+n, cmpn);
for(int i = ; i < n; i++)
printf("%d\n", ans[ same[ pp[i].n ] ]);
}
return ; }
初学CDQ分治-NEU1702的更多相关文章
- 初学cdq分治学习笔记(可能有第二次的学习笔记)
前言骚话 本人蒟蒻,一开始看到模板题就非常的懵逼,链接,学到后面就越来越清楚了. 吐槽,cdq,超短裙分治....(尴尬) 正片开始 思想 和普通的分治,还是分而治之,但是有一点不一样的是一般的分治在 ...
- ACdream1157 Segments(CDQ分治 + 线段树)
题目这么说的: 进行如下3种类型操作:1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]2)C i (1-base) 删除第i条增加的线段, ...
- 「分治」-cdq分治
cdq分治是一种分治算法: 一种分治思想,必须离线,可以用来处理序列上的问题(比如偏序问题),还可以优化1D/1D类型的DP.• 算法的大体思路我们可以用点对来描述.假定我们有一个长度为n的序列,要处 ...
- CDQ分治&整体二分学习个人小结
目录 小结 CDQ分治 二维LIS 第一道裸题 bzoj1176 Mokia bzoj3262 陌上花开 bzoj 1790 矩形藏宝地 hdu5126四维偏序 P3157 [CQOI2011]动态逆 ...
- 【教程】简易CDQ分治教程&学习笔记
前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦! CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...
- BZOJ 2683 简单题 ——CDQ分治
[题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...
- HDU5618 & CDQ分治
Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...
- 初识CDQ分治
[BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 200 ...
- HDU5322 Hope(DP + CDQ分治 + NTT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...
随机推荐
- PHP 页面编码声明与用header或meta实现PHP页面编码的区别
php的header来定义一个php页面为utf编码或GBK编码 php页面为utf编码 header("Content-type: text/html; charset=utf-8&quo ...
- TEXT、TINYTEXT、MEDIUMTEXT、LONGTEXT选择 和 char varchar varchar2 的区别
TEXT.TINYTEXT.MEDIUMTEXT.LONGTEXT选择: 储存不区分大小写的字符数据 TINYTEXT 最大长度是 255 (2^8 - 1) 个字符. TEXT 最大长度是 6553 ...
- 通达OA 同步中控考勤机 增强版
如果你用的是中控考勤机且考勤机能联网,那恭喜有福了! 最近发现考勤机提供web方式查询,经过调试可以用程序直接读取考勤机数据跨过考勤机软件及其access数据库,数据同步及时性.可靠性大幅提高. 通达 ...
- android应用的数据应该保存到哪儿
王永超王永超嫖娼 做android app开发会涉及到不同数据的保存,比如数据缓存,客户登陆信息保存,客户状态的保存等等. 那针对这不同的数据我们应该保存在什么地方呢? 1.应用卸载也不会删除的数据 ...
- WIN7 64位系统注册银行支付组件
WIN7 64位系统注册银行支付组件目前只尝试注册了银联的chinapay.dll和工行的icbcebankutil.dll 1.将dll文件拷贝到windows\syswow64\文件夹下(Win7 ...
- 【转】cvs2svn 把CVS档案库转换为SVN档案库
转载地址:http://jackdown.blog.sohu.com/66646130.html 在linux下的操作 1).安装 下载:Python 2.0 地址:http://www.pyth ...
- 2015-11-04 asp.net 弹出式日历控件 选择日期 Calendar控件
html代码: <%@ Page Language="C#" CodeFile="calendar.aspx.cs" Inherits="cal ...
- libevent安装及使用
一.安装libevent 官网:http://libevent.org/ 选择最新版本下载,我选择的是libevent-2.0.22-stable.tar.gz,然后安装README文件中描述的方法编 ...
- #ifdef _DEBUG
#ifdef _DEBUG virtual void AssertValid() const; //assert(断言)valid(有效的,正确的) virtual void Dump(CDumpCo ...
- Winform容器标签 打印标签 对话框控件
一.容器标签 布局: Anchor:锁定位置,指定与窗口容器的边缘位置,会随着窗口大小的改变而改变: Dock:填充窗口的位置.一般与容器标签同时使用. 1.Panel:对控件进行分组.可以独立布局, ...