BZOJ 3262: 陌上花开

题意概述

有N朵花,对于每一朵花,有三个属性:ss,cc,mm.
当且仅当si>sj,ci>cj,mi>mjs_i>s_j,c_i>c_j,m_i>m_j,有花i比花j美丽.
一朵花的评级为比其他花更美丽的数量(不包括自己),输出评级为0 N−10~N-1的花的数量.

题目分析:

初学CDQ分治,写了一下午.orz……

这是一个三维偏序的问题,可以用CDQ来搞一搞.
当然此题当中,一朵花既是修改操作,又是询问操作.
先以一维s从小到大排序,开始CDQ分治.
对于每一次完成两个子问题后,合并时,先按照c从小到大排序,第三维m用树状数组维护,对于当前花,若是左区间的花,树状数组add操作,否则,查询m比其小的花的个数.

(千万要注意三个属性均相同的花的处理,一种方法是先去重,再计算)

代码:

//Continue
#include<cstdio>
#include<iostream>
#include<algorithm>using namespace std;const int maxn=100000+10;int read() {char ch=getchar();int ret=0;while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();return ret;
}struct Flower {int s,c,m,k,cnt,ans;//k:0 add操作,1 sum操作 //cnt记录这种花有多少,ans指的是这种花的评级 Flower(int cnt=0,int ans=0){}bool operator < (const Flower& rhs) const {return c<rhs.c||(c==rhs.c&&(m<rhs.m||(m==rhs.m&&s<rhs.s)));}bool operator == (const Flower& rhs) const {return s==rhs.s&&c==rhs.c&&m==rhs.m;}void input() {s=read();c=read();m=read();}
}t[maxn],f[maxn];#define lowbit(x) (x&-x)int bit[maxn],N,K;void add(int d,int v) {for(;d<=K;d+=lowbit(d)) bit[d]+=v;
}int sum(int d,int ret=0) {for(;d;d-=lowbit(d)) ret+=bit[d];return ret;
}#define mid ((l+r)>>1)int cmp(const Flower& a,const Flower& b) {return a.s<b.s||(a.s==b.s&&(a.c<b.c||(a.c==b.c&&a.m<b.m)));
}void solve(int l,int r) {if(l==r) return ;//先递归解决左右子区间内部更新 solve(l,mid);solve(mid+1,r);//此时解决左右区间间的更新 for(int i=l;i<=mid;i++) f[i].k=0;//左区间修改 for(int i=mid+1;i<=r;i++) f[i].k=1;//右区间查询 sort(f+l,f+r+1);//按照c排序 for(int i=l;i<=r;i++)if(f[i].k) f[i].ans+=sum(f[i].m);//右区间查询 else add(f[i].m,f[i].cnt);//左区间修改 //注意在用分治求解的时候不能引入序列长度的时间复杂度,否则会造成时间复杂度退化 for(int i=l;i<=r;i++) if(!f[i].k) add(f[i].m,-f[i].cnt);//采用倒着修改回去的方法
}int ans[maxn],tot;int main() {N=read();K=read();for(int i=1;i<=N;i++) t[i].input();sort(t+1,t+N+1,cmp);for(int i=1;i<=N;i++)//先去重操作 if(i==1||!(t[i]==t[i-1])) f[++tot]=t[i],f[tot].cnt=1;else ++f[tot].cnt;for(int i=1;i<=tot;i++) f[i].ans=f[i].cnt-1;//一开始评级赋值为个数-1 sort(f+1,f+tot+1,cmp);//按s排序 solve(1,tot);for(int i=1;i<=tot;i++) ans[f[i].ans]+=f[i].cnt;for(int i=0;i<N;i++) printf("%d\n",ans[i]);return 0;
}

BZOJ 3262: 陌上花开 (CDQ分治)相关推荐

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

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

  2. 陌上花开 HYSBZ - 3262 (CDQ分治)

    陌上花开 HYSBZ - 3262 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另 ...

  3. 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 1439  Solved: 648 [Submit][Status][Discu ...

  4. BZOJ 3262 陌上花开

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

  5. bzoj 3262: 陌上花开

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

  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. BZOJ3262: 陌上花开(cdq分治)

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 3627  Solved: 1705 [Submit][Status][Discuss] Descri ...

  9. BZOJ 4285 使者 (CDQ分治+dfs序)

    题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...

  10. bzoj 4237: 稻草人 cdq分治

    求有多少个点对  其一个点为左下角  一个点为右下角所形成的矩形内部没有点 每个x与y都不同 一开始的思路: 先按照x坐标排序  进行cdq分治 然后在cdq内对y进行排序  枚举mid+1-r的点作 ...

最新文章

  1. HDU 2833 WuKong
  2. 邓迎春绘画201702作品08
  3. 每日一笑 | 程序员的日常,这也太真实了......
  4. python主线程和子线程_python 在threading中如何处理主进程和子线程的关系
  5. 课程笔记--复习专用
  6. Just Say It!——DNN在语音识别系统中的应用
  7. 51黑单片机论坛c语言,51黑论坛_51单片机轻松入门—基于STC15W4K系列
  8. Android 9.0的One UI系统,三星S9/S9+更新One UI 安卓9.0已正式推送
  9. 运筹学实验_指派问题
  10. Java开发之消息队列
  11. 我们雇佣了一只大猴子...
  12. 微型计算机硬件系统包括什么,微型计算机硬件系统由什么组成(6个基本组成部件)...
  13. Python画玫瑰花源代码
  14. 阿里10年:一个普通技术人的成长之路
  15. 支付宝信用卡还款攻略:这样操作仍可以免手续费!
  16. Pool thread stack traces: Thread[C3P0PooledConnectionPoolManager[identityToken-原因解决办法
  17. python 资源站_python资源
  18. vmware 远程桌面 usb设备ukey无法识别,usb无法重定向问题解决
  19. Win11找不到本地用户和组怎么办
  20. 逛网上书店、看书评 and .....买书

热门文章

  1. 机顶盒(Iptv)EPG页面实现视频播放
  2. 本地机房连接阿里云专有网络VPC构建混合云解决方案
  3. 计算机有哪些知识,电脑基本操作知识有哪些
  4. 单片机闪灯c语言,PIC单片机入门之闪灯程序
  5. 辰视冯良炳博士作为专家出席演讲的2021视觉系统设计会议圆满闭幕
  6. 小米Max详细刷成开发版开启Root超级权限的经验
  7. 圆角矩形大小怎么调整html,html圆角矩形
  8. Python_day04
  9. 【联盛德W806上手笔记】十、ADC
  10. php微信 api,PHP微信API接口类