hdu 5126 stars (四维偏序,离线,CDQ套CDQ套树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126
思路:支持离线,那么我们可以用两次CDQ分治使四维降为二维,降成二维后排个序用树状数组维护下就好了
实现代码:
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int M = 5e5+; int ans[M],c[M];
struct node
{
int x,y,z;
int kind,id;
node(){}
node(int x1,int y1,int z1,int k,int i):x(x1),y(y1),z(z1),kind(k),id(i){}
};
vector<node>q,q1,q2;
vector<int>v;
void init(){
q.clear();
v.clear();
memset(c,,sizeof(c));
} bool cmp(node a,node b){
if(a.x == b.x) return a.id < b.id;
return a.x < b.x;
} bool cmp1(node a,node b){
if(a.y == b.y) return a.id < b.id;
return a.y < b.y;
} int lowbit(int x){
return x&-x;
} void add(int x,int val){
while(x <= v.size()){
c[x] += val;
x += lowbit(x);
}
} int getsum(int x){
int sum = ;
while(x > ){
sum += c[x];
x -= lowbit(x);
}
return sum;
} void countstar(){
for(int i = ;i < q2.size();i ++){
if(q2[i].kind == ) add(q2[i].z,);
else ans[q2[i].id] += q2[i].kind*getsum(q2[i].z);
// cout<<q2[i].id<<" "<<ans[q2[i].id]<<endl;
}
for(int i = ;i < q2.size();i ++)
if(q2[i].kind == ) add(q2[i].z,-);
} void cdq1(int l,int r){
if(l >= r) return ;
int mid = (l + r) >> ;
cdq1(l,mid); cdq1(mid+,r);
q2.clear();
for(int i = l;i <= mid;i ++)
if(q1[i].kind == ) q2.push_back(q1[i]);
for(int i = mid+;i <= r;i ++)
if(q1[i].kind) q2.push_back(q1[i]);
sort(q2.begin(),q2.end(),cmp1);
countstar();
} void cdq(int l,int r){
if(l >= r) return ;
int mid = (l + r) >> ;
cdq(l,mid); cdq(mid+,r);
q1.clear();
for(int i = l;i <= mid;i ++)
if(q[i].kind == ) q1.push_back(q[i]);
for(int i = mid+;i <= r;i ++)
if(q[i].kind) q1.push_back(q[i]);
sort(q1.begin(),q1.end(),cmp);
cdq1(,q1.size()-);
} int main()
{
int t,n,op,x,y,z,x1,y1,z1,x2,y2,z2;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
init();
for(int i = ;i < n;i ++){
scanf("%d",&op);
if(op == ){
scanf("%d%d%d",&x,&y,&z);
q.push_back(node(x,y,z,,i));
v.push_back(z);
ans[i] = -;
}
else{
scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
x1--; y1--; z1--;
q.push_back(node(x1,y1,z1,-,i));
q.push_back(node(x2,y2,z2,,i));
q.push_back(node(x1,y2,z2,-,i));
q.push_back(node(x2,y1,z2,-,i));
q.push_back(node(x2,y2,z1,-,i));
q.push_back(node(x2,y1,z1,,i));
q.push_back(node(x1,y2,z1,,i));
q.push_back(node(x1,y1,z2,,i));
v.push_back(z1); v.push_back(z2);
ans[i] = ;
} }
//离散化
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
for(int i = ;i < q.size();i ++)
q[i].z = (lower_bound(v.begin(),v.end(),q[i].z)-v.begin())+;
cdq(,q.size()-);
for(int i = ;i < n;i ++)
if(ans[i] != -) printf("%d\n",ans[i]);
}
return ;
}
hdu 5126 stars (四维偏序,离线,CDQ套CDQ套树状数组)的更多相关文章
- HDU 5126 stars (四维偏序+树状数组)
题目大意:略 题目传送门 四维偏序板子题 把插入操作和询问操作抽象成$(x,y,z,t)$这样的四元组 询问操作拆分成八个询问容斥 此外$x,y,z$可能很大,需要离散 直接处理四维偏序很困难,考虑降 ...
- HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...
- HDU 5618 Jam's problem again (cdq分治+BIT 或 树状数组套Treap)
题意:给n个点,求每一个点的满足 x y z 都小于等于它的其他点的个数. 析:三维的,第一维直接排序就好按下标来,第二维按值来,第三维用数状数组维即可. 代码如下: cdq 分治: #pragma ...
- HDU 4918 Query on the subtree(动态点分治+树状数组)
题意 给定一棵 \(n\) 个节点的树,每个节点有点权.完成 \(q\) 个操作--操作分两种:修改点 \(x\) 的点权.查询与 \(x\) 距离小于等于 \(d\) 的权值总和. \(1 \leq ...
- HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
Jam's problem again Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- HDU 4247 Pinball Game 3D(cdq 分治+树状数组+动态规划)
Pinball Game 3D Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 【二维偏序】【树状数组】【权值分块】【分块】poj2352 Stars
经典问题:二维偏序.给定平面中的n个点,求每个点左下方的点的个数. 因为 所有点已经以y为第一关键字,x为第二关键字排好序,所以我们按读入顺序处理,仅仅需要计算x坐标小于<=某个点的点有多少个就 ...
- BZOJ2683: 简单题(cdq分治 树状数组)
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2142 Solved: 874[Submit][Status][Discuss] Descripti ...
- [luogu4479][BJWC2018]第k大斜率【二维偏序+二分+离散化+树状数组】
传送门 https://www.luogu.org/problemnew/show/P4479 题目描述 在平面直角坐标系上,有 n 个不同的点.任意两个不同的点确定了一条直线.请求出所有斜率存在的直 ...
随机推荐
- 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)
昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...
- python伪代码之爬取完美志愿全国历年文理分数线运行代码持续更新
最近好多小伙伴说想搞个项目实战类的,我就花了一点时间做了一个爬虫项目(在代码复制的时候可能会有点问题,缩格一下就没有问题了) 想要获取更多源码或者答疑或者或者交流学习可以加群:725479218 # ...
- BZOJ2125 最短路 圆方树、倍增
传送门 对仙人掌建立圆方树,然后对边定权 对于圆点和圆点之间的边,是原来仙人掌上的桥,边权保持不变 对于圆点和方点之间的边,将圆方树看做以一个圆点为根的有根树之后,一个方点的父亲一定是一个圆点.对于这 ...
- WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选)
原文:WPF中DataGrid中的DataGridCheckBoxColumn用法(全选,全否,反选) 前台代码 <DataGrid.Columns> <DataGridCheckB ...
- nginx location url解析过程
- (7)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 利用Polly+AOP+依赖注入封装的降级框架
创建简单的熔断降级框架 要达到的目标是: 参与降级的方法参数要一样,当HelloAsync执行出错的时候执行HelloFallBackAsync方法. public class Person { [H ...
- 作业20171019 alpha-1成绩
申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年11月21日 12:00. 总结 普遍成绩有明显上升,归功于1. 团队全都超额完成1次站立会议,多数团队完超额2次; ...
- Popush End
coconut: (咳咳)作为一名后台开发者,我觉得自己在这次作业完成中最大的收获就是跟node.js的异步模型打交道.首先我得出了一个这样的结论:异步模型能够提高服务器的高性能并发请求,但是却加大了 ...
- [Beta阶段]展示博客
一.团队成员简介与个人博客地址 团队博客地址:http://www.cnblogs.com/wowotoubuaa/ 江昊,项目经理http://www.cnblogs.com/haoj/ 王开,后端 ...
- linux内核期中总结
20135132陈雨鑫 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...