[BZOJ3262]陌上花开
[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]陌上花开相关推荐
- bzoj3262: 陌上花开
bzoj3262: 陌上花开 陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的 ...
- BZOJ3262 : 陌上花开
先去重,然后一维排序,二维分治,三维树状数组维护,$O(n\log^2n)$ #include<cstdio> #include<algorithm> #define N 10 ...
- BZOJ3262: 陌上花开(cdq分治)
Time Limit: 20 Sec Memory Limit: 256 MB Submit: 3627 Solved: 1705 [Submit][Status][Discuss] Descri ...
- Bzoj3262 陌上花开
Time Limit: 20 Sec Memory Limit: 256 MB Submit: 1755 Solved: 764 Description 有n朵花,每朵花有三个属性:花形(s).颜 ...
- CDQ解决一些三维偏序的问题
本来几天前就该记录的东西,硬生生被我拖到了现在,太懒了... 在cdq学习时,二维偏序已经解决了,无非就是先sort使第一维有序,然后再用cdq或者数据结构处理第二维.而三维偏序的时候呢,大佬的做法好 ...
- [总结]CDQ分治整体二分
从昨天到现在除了90%的颓废时间一直在研究一些分治的姿势,主要就是CDQ分治和整体二分. 首先推荐一些学习资料: 陈丹琦 <从 < Cash > 谈一类分治算法的应用> 许昊然 ...
- 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 1439 Solved: 648 [Submit][Status][Discu ...
- BZOJ3262/Luogu3810 陌上花开 (三维偏序,CDQ)
一个下午的光阴之死,凶手是细节与手残. 致命的一枪:BIT存权值时: for(; x <= maxx; x += x&-x) t[x] += w;//for(; x <= n; x ...
- 【BZOJ3262】 陌上花开
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
最新文章
- SQL中ISNULL的问题。
- C# 3.0下有限状态机的一种优雅的实现
- gulp 项目构建 代码压缩与混淆
- SAP table HRP1000的妙用
- 小学计算机三年级课程目录,小学生信息技术课本目录.doc
- LYNC文件传输功能开关
- SQL语句的一些重要操作
- 一个例子说明数据库union all的作用
- Oracle 联合主键
- 指针 多维数组 数组指针 指针数组
- 大数据的Java/Hbase+C云平台开发技术 课程
- access 江苏计算机二级_关于江苏省计算机二级MS OFFICE考试的建议
- Android SDK开发包 国内下载
- mysql语句大全及例子_SQL语句大全实例教程.pdf
- 成都亚马逊AWSome Day回顾
- 2048游戏DQN实验
- Efficientnet笔记:各个框架最适合的图像尺寸
- 万豪酒店品牌进驻江苏盐城,持续华东区拓展
- TC275——04Blinky-LED
- linux mint 17 输入法,LinuxMint17.1 Rebecca中安装设置输入法