NEUOJ 1702 撩妹全靠魅力值 (三维偏序)
2024-08-31 08:29:27
题目链接:http://acm.neu.edu.cn/hustoj/problem.php?id=1702
题目大意:就是问每个人三个属性同时不低于另外几个人。。。。人不分先后
经典的三维偏序问题
解题思路:CDQ分治练手题
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int const MAX_Z=+;
int const MAX_N=+;
struct Ope{
int x,y,z;
int ty,id;
Ope(int x,int y,int z,int ty,int id):x(x),y(y),z(z),ty(ty),id(id){}
Ope(){}
}; bool cmp_x(Ope a,Ope b){
if(a.x==b.x)return a.ty<b.ty;
return a.x<b.x;
}
bool cmp_y(Ope a,Ope b){
if(a.y==b.y)return a.ty<b.ty;
return a.y<b.y;
} vector<Ope> ope,ope2;
//vector<int> allZ;
vector<int>::iterator it;
int tree[MAX_Z];
int ans[MAX_Z];
void add(int x,int a){
while(x<MAX_Z){
tree[x]+=a;
x+=(x&(-x));
}
} int read(int x){
int sum=;
while(x){
sum+=tree[x];
x-=(x&(-x));
}
return sum;
} void work(){
for(int i=;i<ope2.size();i++){
if(ope2[i].ty==) add(ope2[i].z,);
else{
int temp=read(ope2[i].z);
ans[ope2[i].id]+=temp*ope2[i].ty;
}
}
for(int i=;i<ope2.size();i++)
if(ope2[i].ty==) add(ope2[i].z,-); } void CDQ(int L,int R){
if(L>=R)return;
int mid=(L+R)>>;
CDQ(L,mid);
ope2.clear();
for(int i=L;i<=mid;i++){
if(ope[i].ty==)
ope2.push_back(ope[i]);
}
for(int i=mid+;i<=R;i++){
if(ope[i].ty!=)
ope2.push_back(ope[i]);
}
sort(ope2.begin(),ope2.end(),cmp_y);
work();
CDQ(mid+,R);
} int main(){
int T;
int n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
ope.clear();
//allZ.clear();
memset(tree,,sizeof(tree));
memset(ans,,sizeof(ans));
for(int i=;i<=n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
ope.push_back(Ope(x,y,z,,i));
ope.push_back(Ope(x,y,z,,i));
//allZ.push_back(z);
}
/*
sort(allZ.begin(),allZ.end());
it=unique(allZ.begin(),allZ.end());
allZ.resize(distance(allZ.begin(),it));
for(int i=0;i<ope.size();i++){
ope[i].z=lower_bound(allZ.begin(),allZ.end(),ope[i].z)-allZ.begin()+1;
}
*/
sort(ope.begin(),ope.end(),cmp_x);
CDQ(,ope.size()-);
for(int i=;i<=n;i++){
printf("%d\n",ans[i]-);
}
}
return ;
}
CDQ分治就是将前半截对后半截的影响拿出来,把偏序问题降维。
三维的经过一次CDQ分治变成两维,四维的可以经过两次CDQ降成两维。
两维偏序问题,一维排序,另一维做树状数组处理就可以。
这里被注释掉的,是一种离散化的姿势,mark一下。
最新文章
- js中的null 和undefined
- 记CentOS-7-x86_64-DVD-1503与Windows7单硬盘双系统的安装
- 第三章SQL编程
- HTML5标签嵌套规则
- bzoj1837: [CROATIAN2009]cavli 凸包1
- svn 结合rsync 的代码发布系统
- Kibana 修改logo及汉化导航
- Linux下安装Android Studio (Centos 7)
- 解决dwr报错【 Error: java.lang.SecurityException: No class by name: service】
- RocksDB介绍:一个比LevelDB更彪悍的引擎
- PDO获取数据的方法fetch()、fetchAll()、setFetchMode()、bindColumn()
- Appium - iOS 各种问题汇总
- .Net中批量添加数据的几种实现方法比较
- iOS 2017年, 上传审核被拒绝.到奔溃
- Codeforces #451 Div2 F
- HDU [P1533]
- OKR相关4本书,好书3本
- postgresql之json操作
- 《Oracle查询优化改写技巧与案例》学习笔记-------使用数字篇
- python大法好——继承、多态
热门文章
- ThinkPHP搜索框需要注意的事项
- LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)
- Angular CLI 启动 版本ng 4
- JDK1.7源码阅读tools包之------ArrayList,LinkedList,HashMap,TreeMap
- 团体程序设计天梯赛-练习集-L1-028. 判断素数
- VMware VCSA 6.0安装过程 (转)
- BZOJ 1264: [AHOI2006]基因匹配Match DP_树状数组_LCS转LIS
- elasticsearch聚合函数
- C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数
- python面向对象三大特性之一封装