bzoj3262(cdq分治模板)
裸的cdq,注意去重;
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=,maxm=;
int tot,n,k,tr[maxm],h[maxn],t1,t2,len1,len2,ans[maxn];
void add(int pos,int v){
for(int i=pos;i<maxm;i+=i&(-i))
tr[i]+=v;
}
int qs(int pos){
int res=;
for(int i=pos;i;i-=i&(-i))
res+=tr[i];
return res;
}
struct node{
int ls,lc,lm,id,cnt;
}tt[maxn],t[maxn],tmp1[maxn],tmp2[maxn];
int cmp1(node a,node b){
if(a.lm!=b.lm)return a.lm<b.lm;
if(a.lc!=b.lc)return a.lc<b.lc;
return a.ls<b.ls;
}
int cmp2(node a,node b){
if(a.lc!=b.lc)return a.lc<b.lc;
return a.ls<b.ls;
}
void cdq(int l,int r){
if(l==r){
h[t[l].id]+=t[l].cnt-;
return;
}
int mid=l+r>>;
cdq(l,mid);cdq(mid+,r);
t1=t2=;
for(int i=l;i<=mid;++i)tmp1[++t1]=t[i];
for(int i=mid+;i<=r;++i)tmp2[++t2]=t[i];
sort(tmp1+,tmp1+t1+,cmp2);
sort(tmp2+,tmp2+t2+,cmp2);
len1=t1,len2=t2;
t1=t2=;
for(t2=;t2<=len2;++t2){
while(tmp1[t1].lc<=tmp2[t2].lc&&t1<=len1){
add(tmp1[t1].ls,tmp1[t1].cnt);++t1;
}
h[tmp2[t2].id]+=qs(tmp2[t2].ls);
}
for(int i=;i<t1;++i)add(tmp1[i].ls,-tmp1[i].cnt);
}
int main(){
cin>>n>>k;
for(int i=;i<=n;++i){
scanf("%d%d%d",&tt[i].ls,&tt[i].lc,&tt[i].lm);
}
sort(tt+,tt+n+,cmp1);
for(int i=;i<=n;++i){
if(i!=&&tt[i-].lm==tt[i].lm&&tt[i-].ls==tt[i].ls&&tt[i-].lc==tt[i].lc){
t[tot].cnt++;
}
else t[++tot]=tt[i],t[tot].cnt=;
}
for(int i=;i<=tot;++i)t[i].id=i;
cdq(,tot);
for(int i=;i<=tot;++i){
ans[h[i]]+=t[i].cnt;
}
for(int i=;i<n;++i){
printf("%d\n",ans[i]);
}
system("pause");
return ;
}
bzoj3262(cdq分治模板)的更多相关文章
- 洛谷 P3810 【模板】三维偏序(陌上花开) (cdq分治模板)
在solve(L,R)中,需要先分治solve两个子区间,再计算左边区间修改对右边区间询问的贡献. 注意,计算额外的贡献时,两子区间各自内部的顺序变得不再重要(不管怎么样左边区间的都发生在右边之前), ...
- CDQ分治模板
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #defi ...
- [BOI2007]Mokia 摩基亚(CDQ分治)
upd:\((x1,y1)(x2,y2)\)表示以\((x1,y1)\)为左上端点 \((x2,y2)\)为右下端点的矩形 本来以为是一道二位树状数组的模板,但是看数据范围之后就放弃了,边界既然到了2 ...
- P3157 [CQOI2011]动态逆序对 CDQ分治
一道CDQ分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...
- 洛谷P3810 陌上花开(CDQ分治)
洛谷P3810 陌上花开 传送门 题解: CDQ分治模板题. 一维排序,二维归并,三维树状数组. 核心思想是分治,即计算左边区间对右边区间的影响. 代码如下: #include <bits/st ...
- Educational Codeforces Round 41 967 E. Tufurama (CDQ分治 求 二维点数)
Educational Codeforces Round 41 (Rated for Div. 2) E. Tufurama (CDQ分治 求 二维点数) time limit per test 2 ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
- [模板] CDQ分治&&BZOJ3262:陌上花开
简介 CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\). 它可以用来顶替一些高级(log)数据结构等. 一般地, CDQ分治 ...
- 【BZOJ3262】陌上花开(CDQ分治)
[BZOJ3262]陌上花开(CDQ分治) 题解 原来放过这道题目,题面在这里 树套树的做法也请点上面 这回用CDQ分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...
随机推荐
- code first 添加外键时,与原有的数据冲突ALTER TABLE 语句与 FOREIGN KEY 约束"FK_XXXXX"冲突
问题的原因是新增的外键字段没有默认值,造成的,有很多方法可以解决,我这里通过修改生成的迁移文件,设定为可空,或者设置默认值即可.具体看情况使用.
- visual studio 2017 30天到期,不能输入注册码
官网下载了visual studio 2017后,第一次安装没有登陆,导致只有30天试用期,虽然还在试用期内,但是无法使用注册码永久使用 解决办法: 1.注册一个微软账号,直接百度搜索“微软账号登陆” ...
- HTTP.ContentType
1. multipart/x-mixed-replace http://blog.dubbelboer.com/2012/01/08/x-mixed-replace.html
- 修改别人写的Hibernate数据库操作代码
最近正在维护别人写的一个关于Hibernate操作数据库的项目,在运行测试的时候(向表中插入记录),报了一个错误:cannot insert a null into column(XXX字段名,下文统 ...
- ok,机房小感
难得一次能早来机房,趁今天考完试没啥事,随便写两句牢骚. 学习与编程 老师曾经在招生的时候认真讨论过这个问题,这两者彼此协调并不是一件容易事,很明显,编程是一门大课.它虽然与理科有一定联系,但不代表它 ...
- .net中反射技术的应用
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Ref ...
- java基本知识归集
类中可以有几种东西:属性,方法,构造器,初始化块 new创建对象时, 1.类属性和类初始化块分配空间. 2.执行默认初始化 如有父类,先为父类执行父类自己的1和2步骤,再执行上面的1和2. 一个类执行 ...
- MVVM Light 笔记
4.关于子视图, MVVMLight Using Two Views:http://www.codeproject.com/Articles/323187/MVVMLight-Using-Two-Vi ...
- log4j介绍和使用
1.apache推出的开源免费日志处理的类库 2.为什么需要日志?? 2.1 在项目中编写system.out.println();输出到控制台,当项目发布到tomcat后,没有控制台(在命令界面能看 ...
- 8个开发必备的PHP功能--转(柒捌玖零)
做过PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PHP功能,个个都非常实用,希望各位PHP开发者能够掌握. 1.传 ...