题目链接 BZOJ3262
洛谷P3810

/*
5904kb  872ms
对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会。。)
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define lb(x) (x)&-(x)
const int N=1e5+5;int n,Ans[N];
int read();
struct Operation
{int x,y,z,cnt,res;inline void Init(){x=read(),y=read(),z=read(),cnt=1;}bool operator <(const Operation &a)const{return x==a.x?(y==a.y?z<a.z:y<a.y):x<a.x;}
}q[N],tmp[N];namespace BIT
{//三维:树状数组 int Max,t[N<<1];void Add(int p,int v){while(p<=Max) t[p]+=v,p+=lb(p);}int Query(int p){int res=0;while(p) res+=t[p],p-=lb(p);return res;}
}
inline int read()
{int now=0,f=1;register char c=gc();for(;!isdigit(c);c=gc()) if(c=='-') f=-1;for(;isdigit(c);now=now*10+c-'0',c=gc());return now*f;
}
void CDQ(int l,int r)
{//处理第二维 if(l<r){int m=l+r>>1; CDQ(l,m), CDQ(m+1,r);int p1=l,p2=m+1,cnt=0;while(p1<=m&&p2<=r){if(q[p1].y<=q[p2].y)//这里的条件要是<= BIT::Add(q[p1].z,q[p1].cnt), tmp[cnt++]=q[p1++];else q[p2].res+=BIT::Query(q[p2].z), tmp[cnt++]=q[p2++];}while(p1<=m) BIT::Add(q[p1].z,q[p1].cnt), tmp[cnt++]=q[p1++];//先加上 方便再减去 while(p2<=r) q[p2].res+=BIT::Query(q[p2].z), tmp[cnt++]=q[p2++];for(int i=l; i<=m; ++i) BIT::Add(q[i].z,-q[i].cnt);for(int i=0; i<cnt; ++i) q[l+i]=tmp[i];}
}int main()
{n=read(),BIT::Max=read();for(int i=1; i<=n; ++i) q[i].Init();std::sort(q+1,q+1+n);int cnt=1;for(int i=2; i<=n; ++i)if(q[i].x==q[i-1].x&&q[i].y==q[i-1].y&&q[i].z==q[i-1].z) ++q[cnt].cnt;else q[++cnt]=q[i];CDQ(1,cnt);for(int i=1; i<=cnt; ++i) Ans[q[i].res+q[i].cnt-1]+=q[i].cnt;//f[i]为res[i]+cnt[i]-1, 贡献为cnt[i] for(int i=0; i<n; ++i) printf("%d\n",Ans[i]);return 0;
}

3.30:

/*
5904kb  840ms
是对x,y,z都相同的元素去重,不是对z。。sb了。
去重后的贡献是q[p].cnt!
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define lb(x) (x)&-(x)
const int N=1e5+5,MAXN=2e5+5;int n,Ans[N];
int read();
struct Node
{int x,y,z,cnt,ans;void Init(){x=read(),y=read(),z=read(),cnt=1;}bool operator <(const Node &a)const{return x==a.x?(y==a.y?z<a.z:y<a.y):x<a.x;}
}q[N],tmp[N];inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
namespace BIT
{int n,val[MAXN];inline void Add(int p,int v){while(p<=n) val[p]+=v,p+=lb(p);}inline int Query(int p){int res=0;while(p) res+=val[p],p-=lb(p);return res;}inline void Clear(int p){while(p<=n)if(val[p]) val[p]=0,p+=lb(p);else break;}
}
void CDQ(int l,int r)
{if(l<r){int m=l+r>>1; CDQ(l,m), CDQ(m+1,r);int p1=l,p2=m+1,t=0;while(p1<=m&&p2<=r){if(q[p1].y<=q[p2].y) BIT::Add(q[p1].z,q[p1].cnt), tmp[t++]=q[p1++];//只是排y,别去管什么z。。else q[p2].ans+=BIT::Query(q[p2].z), tmp[t++]=q[p2++];}if(p1<=m){for(int i=l; i<p1; ++i) BIT::Clear(q[i].z);while(p1<=m) tmp[t++]=q[p1++];}else if(p2<=r){while(p2<=r) q[p2].ans+=BIT::Query(q[p2].z), tmp[t++]=q[p2++];for(int i=l; i<=m; ++i) BIT::Clear(q[i].z);}for(int i=0; i<t; ++i) q[l+i]=tmp[i];}
}int main()
{n=read(),BIT::n=read();for(int i=1; i<=n; ++i) q[i].Init();std::sort(q+1,q+1+n);int cnt=1;for(int i=2; i<=n; ++i)if(q[i].z!=q[i-1].z||q[i].y!=q[i-1].y||q[i].x!=q[i-1].x) q[++cnt]=q[i];else ++q[cnt].cnt;CDQ(1,cnt);for(int i=1; i<=cnt; ++i) Ans[q[i].ans+q[i].cnt-1]+=q[i].cnt;for(int i=0; i<n; ++i) printf("%d\n",Ans[i]);return 0;
}

19.4.5
上BZOJ前三啦。

//6196KB    688MS
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define MAXIN 300000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5,M=2e5+5;int Ans[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Node
{int x,y,z,cnt,ans;bool operator <(const Node &a)const{return x==a.x?(y==a.y?z<a.z:y<a.y):x<a.x;}bool operator !=(const Node &a)const{return x!=a.x||y!=a.y||z!=a.z;}
}q[N],tmp[N];
struct BIT
{int n,t[M];//M!#define lb(x) (x&-x)inline void Add(int p,int v){for(; p<=n; p+=lb(p)) t[p]+=v;}inline int Query(int p){int res=0;for(; p; p^=lb(p)) res+=t[p];return res;}inline void Clear(int p){for(; p<=n&&t[p]; p+=lb(p)) t[p]=0;}
}T;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now;
}
void CDQ(int l,int r)
{if(l<r){int m=l+r>>1; CDQ(l,m), CDQ(m+1,r);int p1=l,p2=m+1,p=l;while(p1<=m&&p2<=r){if(q[p1].y<=q[p2].y) T.Add(q[p1].z,q[p1].cnt), tmp[p++]=q[p1++];//q[p1].cnt!else q[p2].ans+=T.Query(q[p2].z), tmp[p++]=q[p2++];}while(p2<=r) q[p2].ans+=T.Query(q[p2].z), tmp[p++]=q[p2++];for(int i=l; i<p1; ++i) T.Clear(q[i].z);//<p1while(p1<=m) tmp[p++]=q[p1++];for(int i=l; i<=r; ++i) q[i]=tmp[i];}
}int main()
{int n=read(); T.n=read();for(int i=1; i<=n; ++i) q[i]=(Node){read(),read(),read(),1,0};//cnt不能是0啊= = std::sort(q+1,q+1+n); int cnt=1;for(int i=2; i<=n; ++i)if(q[i]!=q[i-1]) q[++cnt]=q[i];else ++q[cnt].cnt;CDQ(1,cnt);for(int i=1; i<=cnt; ++i) Ans[q[i].ans+q[i].cnt-1]+=q[i].cnt;for(int i=0; i<n; ++i) printf("%d\n",Ans[i]);return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/8574905.html

BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)相关推荐

  1. bzoj 3262: 陌上花开(cdq分治)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 2433  Solved: 1087 [Submit][Status][Disc ...

  2. 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)

    题目链接:点击查看 题目大意:给出 n 个点,每个点有三个属性 a , b , c ,对于每个点 i 来说,求出有多少个 j 满足 a[ j ] <= a[ i ] && b[ ...

  3. bzoj 3262: 陌上花开

    3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 5800 Solved: 2804 [Submit][Status][Discus ...

  4. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

  5. BZOJ 3262 陌上花开

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 2590  Solved: 1159 [Submit][Status][Disc ...

  6. BZOJ - 3262 陌上花开

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 5433  Solved: 2623 [Submit][Status][Disc ...

  7. bzoj 3262 陌上花开

    本质是一个三维偏序,一位排序后cdq分治,一维在子函数里排序,一维用树状数组维护. 把三维相等的合并到一个里面. 1 #include<iostream> 2 #include<cs ...

  8. P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...

  9. P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)

    题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...

  10. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

最新文章

  1. Quartz.Net 1.30的一些设置说明
  2. 【错误记录】Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )
  3. 微服务通信带来的问题
  4. dbutils java_Dbutils工具类的使用
  5. 泰坦尼克号是怎么从2D转成3D的?
  6. 第一太阳能公司(First Solar)在罗斯资本公司的评级上调
  7. 数据:灰度比特币信托基金溢价达41%创近一年新高
  8. 黄山旅游自助攻略住宿行程路线篇
  9. 组合体计算机绘图的实验原理,《机械制图及计算机绘图》实验教案.pdf
  10. HTML5 九宫格拼图游戏
  11. magisk卸载内置软件_GJ2x_免root搞机工具箱V6.71 更新:增加卸载内置功能
  12. 视频剪辑素材哪里找?这个几个网站就够了。
  13. Windows10下的FPN_TensorFlow复现
  14. 用户头像的背景为头像的模糊头像时候
  15. DNS提示错误无法上网怎么办?苹果电脑如何修改DNS?
  16. mysql 跨服务器复制_mysql数据库跨服务器间复制与迁移
  17. bat 直接运行vue项目命令
  18. 白加黑过360启动项工具源码发布 多文件过启动项代码
  19. 周志明架构课--01.原始分布式时代
  20. pyspark mysql rdd_PySpark之RDD操作

热门文章

  1. SAP BC470 课程中文自学笔记
  2. Windows移动开发(五)——初始XAML
  3. mac 查看端口的使用情况
  4. 第三周阶段性小结——Object对象、String类、StringBuffer、StringBuilder、System、Runtime、Date...
  5. 神经网络一(Neural Network)
  6. 【诗和远方】一个蒟蒻的年初展望
  7. hdu 1718 Rank
  8. 1:A+B Problem
  9. Cookie使用基础
  10. java day51【综合案例day03】