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分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...
随机推荐
- 文件操作 day8
一,文件操作基本流程. 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...
- Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"
https://blog.csdn.net/saucyj/article/details/79043443
- C++中的getline()
总结: 尽量使用全局函数string类中的getline(),其读入的第二个参数为string类型,不设置默认是遇到回车停止读入操作 cin.getline是针对数组字符串的,以指定的地址为存放第一个 ...
- 洛谷1984 [SDOI2008]烧水问题
一道找规律 原题链接 显然要将烧得的温度最大化利用,即每次都去热传递. 设水沸腾为\(x\). 第一杯直接烧水,需提高\(x\). 第二杯先与第一杯进行热传递,这样只需提高\(\dfrac{x}{2} ...
- [都是原创]Php simplexml 添加节点
Php simplexml 添加节点 原始代码如下 //================<? //创建xml对象$xml = new SimpleXMLElement('<Messages ...
- 用户态处理arp、ndisc neighbour solication 报文
问题背景: 想要协议栈给不是接口ip的报文,ipv4回复arp request,ipv6回复 ndisc solication. #include <stdio.h> //调用该函数成为一 ...
- jmeter脚本录制的两种方式
完成一次完整的性能测试: 1.创建用户: 2.选择协议(HTTP) 3.使用工具去模拟协议操作(1.手工编写(抓包工具):2.工具自带录制) 4.运行工具进行压力测试
- 实现SQL express版做自动备份数据库的方法
SQL Server 2005/2008 Express版没有代理组件,不支持维护计划.可以采用下面的办法实现每日备份: 一.在要备份的数据库中创建存储过程. 存储过程名称:sp_BackupData ...
- Hbase常用操作(增删改查)
Hbase常用操作(增删改查) [日期:2014-01-03] 来源:Linux社区 作者:net19880504 [字体:大 中 小] 运行Eclipse,创建一个新的Java工程“HBa ...
- (转贴)fusionCharts属性参考API
一.FusionCharts的分类 关于FusionCharts的基本介绍我就不在这里浪费篇幅了,想了解的朋友自己去www.baigoogedu.com里面找吧.我就说说FusionCharts的官方 ...