[BZOJ3262]陌上花开

题目大意:

\(n(n\le10^5)\)个三元组\((x,y,z)(x,y,z\le2\times10^6)\),求三位偏序。

思路:

CDQ分分治套树状数组。需要注意相同的三元组会互相产生贡献。

源代码:

#include<cstdio>
#include<cctype>
#include<vector>
#include<climits>
#include<algorithm>
inline int getint() {register char ch;while(!isdigit(ch=getchar()));register int x=ch^'0';while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');return x;
}
const int N=1e5+1,M=2e5+1;
int n,m,c,ans[N],cnt[N],w[N];
struct Node {int x,y,z,id,w;bool operator == (const Node &rhs) const {return x==rhs.x&&y==rhs.y&&z==rhs.z;}bool operator != (const Node &rhs) const {return x!=rhs.x||y!=rhs.y||z!=rhs.z;}
};
Node a[N];
inline bool cmp1(const Node &p1,const Node &p2) {if(p1.x==p2.x) {if(p1.y==p2.y) return p1.z<p2.z;return p1.y<p2.y;}return p1.x<p2.x;
}
inline bool cmp2(const Node &p1,const Node &p2) {if(p1.y==p2.y) return p1.z<p2.z;return p1.y<p2.y;
}
class FenwickTree {private:int val[M];int lowbit(const int &x) const {return x&-x;}public:void modify(int p,const int &x) {for(;p<=m;p+=lowbit(p)) val[p]+=x;}int query(int p) const {int ret=0;for(;p;p-=lowbit(p)) ret+=val[p];return ret;}
};
FenwickTree t;
void cdq(const int &b,const int &e) {if(b==e) {ans[a[b].id]+=a[b].w-1;return;};const int mid=(b+e)>>1;cdq(b,mid);cdq(mid+1,e);int p=b,q=mid+1;for(;q<=e;q++) {for(;p<=mid&&a[p].y<=a[q].y;p++) {t.modify(a[p].z,a[p].w);}ans[a[q].id]+=t.query(a[q].z);}while(--p>=b) t.modify(a[p].z,-a[p].w);std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp2);
}
int main() {n=getint(),m=getint();for(register int i=1;i<=n;i++) {const int x=getint(),y=getint(),z=getint();a[i]=(Node){x,y,z,i};}std::sort(&a[1],&a[n]+1,cmp1);for(register int i=1,tmp;i<=n;i++) {if(a[i-1]==a[i]) {a[i-1]=(Node){INT_MAX,INT_MAX,INT_MAX};} else tmp=0;a[i].w=++tmp;}std::sort(&a[1],&a[n]+1,cmp1);c=std::unique(&a[1],&a[n]+1)-&a[1];while(a[c]==(Node){INT_MAX,INT_MAX,INT_MAX}) c--;cdq(1,c);for(register int i=1;i<=c;i++) {cnt[ans[a[i].id]]+=a[i].w;}for(register int i=0;i<n;i++) {printf("%d\n",cnt[i]);}return 0;
}

转载于:https://www.cnblogs.com/skylee03/p/9459998.html

[BZOJ3262]陌上花开相关推荐

  1. bzoj3262: 陌上花开

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

  2. BZOJ3262 : 陌上花开

    先去重,然后一维排序,二维分治,三维树状数组维护,$O(n\log^2n)$ #include<cstdio> #include<algorithm> #define N 10 ...

  3. BZOJ3262: 陌上花开(cdq分治)

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

  4. Bzoj3262 陌上花开

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 1755  Solved: 764 Description 有n朵花,每朵花有三个属性:花形(s).颜 ...

  5. CDQ解决一些三维偏序的问题

    本来几天前就该记录的东西,硬生生被我拖到了现在,太懒了... 在cdq学习时,二维偏序已经解决了,无非就是先sort使第一维有序,然后再用cdq或者数据结构处理第二维.而三维偏序的时候呢,大佬的做法好 ...

  6. [总结]CDQ分治整体二分

    从昨天到现在除了90%的颓废时间一直在研究一些分治的姿势,主要就是CDQ分治和整体二分. 首先推荐一些学习资料: 陈丹琦 <从 < Cash > 谈一类分治算法的应用> 许昊然 ...

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

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

  8. BZOJ3262/Luogu3810 陌上花开 (三维偏序,CDQ)

    一个下午的光阴之死,凶手是细节与手残. 致命的一枪:BIT存权值时: for(; x <= maxx; x += x&-x) t[x] += w;//for(; x <= n; x ...

  9. 【BZOJ3262】 陌上花开

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

最新文章

  1. SQL中ISNULL的问题。
  2. C# 3.0下有限状态机的一种优雅的实现
  3. gulp 项目构建 代码压缩与混淆
  4. SAP table HRP1000的妙用
  5. 小学计算机三年级课程目录,小学生信息技术课本目录.doc
  6. LYNC文件传输功能开关
  7. SQL语句的一些重要操作
  8. 一个例子说明数据库union all的作用
  9. Oracle 联合主键
  10. 指针 多维数组 数组指针 指针数组
  11. 大数据的Java/Hbase+C云平台开发技术 课程
  12. access 江苏计算机二级_关于江苏省计算机二级MS OFFICE考试的建议
  13. Android SDK开发包 国内下载
  14. mysql语句大全及例子_SQL语句大全实例教程.pdf
  15. 成都亚马逊AWSome Day回顾
  16. 2048游戏DQN实验
  17. Efficientnet笔记:各个框架最适合的图像尺寸
  18. 万豪酒店品牌进驻江苏盐城,持续华东区拓展
  19. TC275——04Blinky-LED
  20. linux mint 17 输入法,LinuxMint17.1 Rebecca中安装设置输入法

热门文章

  1. 通过团体属性和特殊ACL控制聚合
  2. linux下grub的修复
  3. 在 C# 中 (x == X) 何时成立?
  4. 2019腾讯后台开发暑期实习面经汇总
  5. 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap
  6. [BZOJ 2756] 奇怪的游戏
  7. .net get set用法
  8. 网络编程中的大端和小端
  9. 线程的同步之Synchronized在单例模式中的应用
  10. Xstream解析报文