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 个不同的点.任意两个不同的点确定了一条直线.请求出所有斜率存在的直 ...
随机推荐
- Excel 2007 底层实现方式
一.EXCEL的底层实现 能力有限,了解的比较浅,有不足之处望指正,首先看下图: 一. excel2007是使用xml格式来存储的,把一个excel文件后缀改为.zip,打开之后就直接可以看到一个ex ...
- SQL Server中使用convert进行日期转换(转载)
一般存入数据库中的时间格式为yyyy-mm-dd hh:mm:ss 如果要转换为yyyy-mm-dd 短日期格式.可以使用convert函数.下面是sqlserver帮助中关于convert函数的声 ...
- 使用第三方库(Senparc)完成小程序支付 - z
https://www.cnblogs.com/zmaiwxl/p/8931585.html
- jetty 客服端 与服务端
jetty 服务端,客服端有请求buffter 检查 默认4kb 4096 客服端 HttpClient client=new HttpClient(); client.setRequestBuffe ...
- Scala学习(五)---Scala中的类
Scala中的类 摘要: 在本篇中,你将会学习如何用Scala实现类.如果你了解Java或C++中的类,你不会觉得这有多难,并且你会很享受Scala更加精简的表示法带来的便利.本篇的要点包括: 1. ...
- sql语句——行列互换
SELECT 年份, SUM(case when 季度=1 then 销量 else 0 end) as 一季度, SUM(case when 季度=2 then 销量 else 0 end) as ...
- C# 获取文件MD5值的方法
可用于对比文件是否相同 /// <summary> /// 获取文件MD5值 /// </summary> /// <param name="fileName& ...
- 【下一代核心技术DevOps】:(二)Rancher的应用及优点简介
1.环境选择 安装Rancher环境,一定要在干净的linux主机上进行,避免出现因配置导致的莫名其妙的问题.服务器操作系统建议CentOS7.4(内核3.10以上)低于这个版本的系统 如7.3 7. ...
- zabbix邮件报警功能的验证
zabbix里面设置了很多监控项,有很多重要的监控预警,必须保证zabbix邮件报警功能正常,以确保那些告警信息能及时发送到运维人员的邮箱里. 所以需要每天8:30发一封确认zabbix邮件报警功能正 ...
- PHP中报500错误时如何查看错误信息
在执行代码中加入下面两行代码即可 ini_set("display_errors","On"); error_reporting(E_ALL);