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分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...
随机推荐
- c语言练习题:求1-1/2+1/3-1/4+... -1/100的值
/******************************************* 求1-1/2+1/3-1/4+... -1/100的值 *************************** ...
- B+树与B-树
前面已经介绍过B-树,接下来,我们主要介绍一下B+树. 1.B+树的概念 B+树是应文件系统所需而生的一种B-树和变形树.一棵m阶B+树和m阶的B-树的差异在于: (1)有n棵子树的结点中含有n个关键 ...
- Ajax cookie session form组件
. Cookie是什么 保存在浏览器端的键值对 为什么要有Cookie? 因为HTTP请求是无状态的 Cookie的原理? 服务端可以在返回响应的时候 做手脚 在浏览器上写入键值对(Cookie) 浏 ...
- C#设计模式-1简单工厂模式Simple Factory)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 简单的工 ...
- hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * ...
- Get、Post 提交的乱码问题
1.问题 在spring mvc开发的时候出现乱码问题: 2.解决方案 (1)Get提交:tomcat容器接收的造成的乱码问题,修改server.xml文件: (2)Post提交:在web.xml中配 ...
- shell判断文件后缀名是否为特定字符串
如果文件是 .css文件 或 .js文件,则进行处理. if [ "${file##*.}"x = "css"x ]||[ "${file##*.}& ...
- Yii2-设置和获取、删除Cookies空值分析(有代码)
Yii2-设置和获取,删除Cookies空值或值没有变化 原因: 1.不要使用相同的request url, 否则需要刷新才能获取值 可在不同的动作中设置和调用 2.不要在函数中使用exit来中止脚本 ...
- 10个办法让设计小白迅速get海报设计要点!
对于设计师而言,海报和宣传单的设计,几乎是每一个设计师的必修课.如今网页上的 Banner.宣传和促销的数字海报,大多脱胎于我们所熟知的海报设计. 对于推销产品.连接客户,海报始终是一种最为有趣和实用 ...
- RabbitVCS - Ubuntu VCS Graphical Client
Easy version control for Linux RabbitVCS is a set of graphical tools written to provide simple and s ...