[COGS2479]偏序
[COGS2479]偏序
题目大意:
\(n(n\le50000)\)个四元组,求四维偏序。
思路:
CDQ分治套CDQ分治套树状数组。
细节:
第二层CDQ之前要备份数组\(a\),否则第二层CDQ结束以后\(a\)就不对了。
源代码:
#include<cstdio>
#include<cctype>
#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=50001;
int n,ans;
struct Node {int id,x,y,z,type;
};
Node a[N],tmp[N];
inline bool cmp1(const Node &p1,const Node &p2) {return p1.x<p2.x;
}
inline bool cmp2(const Node &p1,const Node &p2) {return p1.y<p2.y;
}
class FenwickTree {private:int val[N];int lowbit(const int &x) const {return x&-x;}public:void modify(int p,const int &x) {for(;p<=n;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 cdq2(const int &b,const int &e) {if(b==e) return;const int mid=(b+e)>>1;cdq2(b,mid);cdq2(mid+1,e);int p=b,q=mid+1;for(;q<=e;q++) {if(a[q].type==1) continue;for(;p<=mid&&a[p].y<a[q].y;p++) {if(a[p].type==1) t.modify(a[p].z,1);}ans+=t.query(a[q].z);}while(--p>=b) {if(a[p].type==1) t.modify(a[p].z,-1);}std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp2);
}
void cdq1(const int &b,const int &e) {if(b==e) return;const int mid=(b+e)>>1;cdq1(b,mid);cdq1(mid+1,e);for(register int i=b;i<=mid;i++) a[i].type=1;for(register int i=mid+1;i<=e;i++) a[i].type=2;std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp1);std::copy(&a[b],&a[e]+1,&tmp[b]);cdq2(b,e);std::copy(&tmp[b],&tmp[e]+1,&a[b]);
}
int main() {freopen("partial_order.in","r",stdin);freopen("partial_order.out","w",stdout);n=getint();for(register int i=1;i<=n;i++) a[i].id=i;for(register int i=1;i<=n;i++) a[i].x=getint();for(register int i=1;i<=n;i++) a[i].y=getint();for(register int i=1;i<=n;i++) a[i].z=getint();cdq1(1,n);printf("%d\n",ans);return 0;
}
转载于:https://www.cnblogs.com/skylee03/p/9464898.html
[COGS2479]偏序相关推荐
- CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)
题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...
- BZOJ 2131 免费的馅饼(DP,二维偏序问题 / 旋转坐标轴转化问题)【BZOJ 修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2131 是 hydro 的 BZOJ ...
- CDQ分治嵌套模板:多维偏序问题
CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1struct Node{int a,b,c,d,bg;}; ...
- 中石油训练赛 - Check List(线段树维护偏序问题)
题目大意:给出 n 个点,需要计算出满足下列条件的三元对 ( i , j , k ) 的数量: x[ i ] < x[ j ] < x[ k ] y[ k ] > y[ i ] &g ...
- HDU - 5517 Triple(三维偏序-二维树状数组/CDQ分治)
题目链接:点击查看 题目大意:给出 n 个二元对 ( a , b ) 和 m 个三元对 ( c , d , e ),对于所有 b == e 的二元对和三元对,可以通过某种运算形成一个新的三元对 ( a ...
- 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)
题目链接:点击查看 题目大意:给出 n 个点,每个点有三个属性 a , b , c ,对于每个点 i 来说,求出有多少个 j 满足 a[ j ] <= a[ i ] && b[ ...
- CodeForces - 1321E World of Darkraft: Battle for Azathoth(二维偏序+线段树)
题目链接:点击查看 题目大意:给出 n 个武器及花费,m 个防具及花费,以及 k 个怪物及属性,每个怪物的属性同样有着攻击力,防御力以及价值,初始时可以选择一个武器以及一个防具,如果此时的攻击力大于怪 ...
- CodeForces - 1295E Permutation Separation(线段树+二维偏序,好题)
题目链接:点击查看 题目大意:给出一个1~n的排列,现在要求选择一个合适的分割点,将整个排列分为两个部分,要求通过适当的移动使得前半部分的所有数值都小于后半部分的数值,现在给出移动每个数字所花费的代价 ...
- CodeForces - 160E Buses and People(线段树+三维偏序)
题目链接:点击查看 题目大意:(网上复制一下别人的题意..懒) 有n辆公交车,每辆公交车有s(起始点),f(终点),t(发车时间) (行驶不需要时间) 有m个人,每个人有l(起点),r(终点),t(出 ...
- P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...
最新文章
- ORACLE 存储过程异常捕获并抛出
- 转[再谈应用环境下的TIME_WAIT和CLOSE_WAIT]
- 白炽灯可控硅调光程序
- jpa 动态查询条件 数组_Spring data jpa 复杂动态查询方式总结
- Hi3516A开发-- OSD功能实现
- 网上选课系统java大作业_Java面向对象设计大作业——公选课选课系统
- Android开发面试题Service之startService和bindService之间的区别
- 开发一个自己的 CSS 框架(五)
- matlab中gama,matlab积分结果中的gamma()函数参数问题,急求解答!!!
- G1垃圾回收器总结一
- python分支和循环的思维导图_思维导图的绘制步骤【PDCA管理循环】
- 汇编学习从入门到精通
- _beginThread如何传递多个参数
- 基于Qt5实现的截图工具分享(仿QQ截图功能)
- 万兆交换机用什么网线_现在国内没有万兆宽带,那为什么有万兆网线呢?
- Arduino 结构语法详解(含示例)二
- Progress ThemeBuilder updated Crack
- python随机函数random、画、星轨_教你绘制梵高的星空
- 这篇数据库设计规范建议,我必须分享给你
- 使用jquery做一个简单的当月日历插件