Codeforces 12D Ball(线段树)
N ladies attend the ball in the King's palace. Every lady can be described with three values: beauty, intellect and richness. King's Master of Ceremonies knows that ladies are very special creatures. If some lady understands that there is other lady at the ball which is more beautiful, smarter and more rich, she can jump out of the window. He knows values of all ladies and wants to find out how many probable self-murderers will be on the ball. Lets denote beauty of the i-th lady by Bi, her intellect by Ii and her richness by Ri. Then i-th lady is a probable self-murderer if there is some j-th lady that Bi < Bj, Ii < Ij, Ri < Rj. Find the number of probable self-murderers.
The first line contains one integer N (1 ≤ N ≤ 500000). The second line contains N integer numbers Bi, separated by single spaces. The third and the fourth lines contain sequences Ii and Ri in the same format. It is guaranteed that 0 ≤ Bi, Ii, Ri ≤ 109.
Output the answer to the problem.
3
1 4 2
4 3 2
2 5 3
1
题意:给你一组人,每个人有三个数值a,b,c,如果存在一个人x的三个值均大于另一个人y的三个值,y将自杀,求最终有多少个人自杀?
思路:一开始以为是三维偏序……幸好并非如此.
如果只有两维的话,自然好解决,将一维从大到小排序,二维扔进一颗线段树,每次比较线段树中的最大值与当前要扔进的值,因为先放入的一维必然大,若此时二维又比线段树中已有二维小,这个数必然产生贡献.
那么如何拓展到三维呢?
刚刚的线段树还没有发挥到极致,比如区间求最小值.
看看数据emmmm500000
当然是离散化喽!
将第一个值离散化作为线段树中的插入的位置
将第二维从大到小排序这样可以忽略第二维的影响
因为逐个插入线段树的第二维一定是递减的
然后线段树中插入值的位置为第一维离散后的值
存储的数为第三维的值
对于每个新插入的数只要保证他插入的位置后面有一个值比他大的就产生了贡献(因为后放入所以y已经小了,插入的位置后面的数说明x也小了,若z再小说明此人跳楼自杀)
然后就好啦!
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define lson root<<1
#define rson root<<1|1
#define maxn 500005 int t[maxn<<],h[maxn],m,n;
struct node
{
int x,y,z;
}tr[maxn]; bool cmp(node a,node b)
{
return a.y>b.y;
} void push_up(int root)
{
t[root]=max(t[lson],t[rson]);
} void build(int l,int r,int root)
{
t[root]=;
if(l==r)
{
return ;
}
int mid=(l+r)>>;
build(l,mid,lson);
build(mid+,r,rson);
} void update(int l,int r,int root,int p,int x)
{
if(l==r)
{
t[root]=max(t[root],x);
return;
}
int mid=(l+r)>>;
if(p<=mid)
{
update(l,mid,lson,p,x);
}
else
{
update(mid+,r,rson,p,x);
}
push_up(root);
} int query(int l,int r,int root,int li,int ri)
{
if(li<=l&&r<=ri)
{
return t[root];
}
int mid=(l+r)>>;
int val=;
if(li<=mid)
{
val=max(query(l,mid,lson,li,ri),val);
}
if(r>mid)
{
val=max(query(mid+,r,rson,li,ri),val);
}
return val;
} void init()
{
sort(h,h+m);
m=unique(h,h+m)-h;
build(,m,);
for(int i=;i<n;i++)
{
tr[i].x=lower_bound(h,h+m,tr[i].x)-h+;
}
sort(tr,tr+m,cmp);
} int main()
{
int ans,i,j,k;
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d",&tr[i].x);
h[i]=tr[i].x;
}
for(int i=;i<n;i++)
{
scanf("%d",&tr[i].y);
}
for(int i=;i<n;i++)
{
scanf("%d",&tr[i].z);
}
m=n;
ans=;
init();
for(i=;i<n;i=j)
{
j=i;
while(j<n&&tr[j].y==tr[i].y)
{
if(query(,m,,tr[j].x+,m)>tr[j].z)
{
ans++;
}
j++;
}
for(k=i;k<j;k++)
{
update(,m,,tr[k].x,tr[k].z);
}
}
printf("%d\n",ans);
return ;
}
Codeforces 12D Ball(线段树)的更多相关文章
- Ball CodeForces - 12D (线段树)
题目链接:https://cn.vjudge.net/problem/CodeForces-12D 题目大意:给你一个人的三个信息,如果存在一个人比当前人的这三个信息都大,那么这个人就会退出,问你最终 ...
- codeforces 12D Ball
codeforces 12D Ball 这道题有两种做法 一种用树状数组/线段树维护区间最值,一种用map维护折线,昨天我刚遇见了一道类似的用STL维护折线的题目: 392D Three Arrays ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- Vasya and a Tree CodeForces - 1076E(线段树+dfs)
I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...
- Codeforces 787D. Legacy 线段树建模+最短路
D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- hdu 1556 Color the ball (线段树+代码详解)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 1556 Color the ball(线段树区间维护+单点求值)
传送门:Color the ball Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/3276 ...
- ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
Color the Ball Time Limit: 2 Seconds Memory Limit: 65536 KB There are infinite balls in a line ...
随机推荐
- 转载:解决eclipse导出javadoc时的“错误: 编码GBK的不可映射字符”问题
转自:http://blog.csdn.net/psy1100/article/details/51179342 今天要将自己的API接口和MODEL导出来一份java doc参考文档, 但是在导出的 ...
- DHCP(一)
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...
- FPGA前世今生(三)
上期介绍了关于FPGA的IOB单元,这期我们介绍一下FPGA内部的其他资源,这些都是学好FPGA的基础.不管前世的沧桑,还是后世的风光,我们都要把我现在的时光,打好基础,学好FPGA. 大多数FPGA ...
- 【转】学习使用Jmeter做压力测试(一)--压力测试基本概念
一.性能测试的概念 性能测试是通过自动化的测试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行测试.负载测试和压力测试都属于性能测试,两者可以结合进行. 通过负载测试,确定在各种工作负载下 ...
- java.输入水果的编号,求它对应的单价
总结:可以if-else 循环或switch循环 package com.b; import java.util.Scanner; /*以下4种水果的单价分别是3.00元/公斤,2.50元/公斤,4. ...
- php图像处理函数imagecopyresampled
语法 bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , i ...
- Python中调用设置环境变量的bat
工作中用到一个python脚本,自动化运行某目录下的多个vc工程代码. 编译工程代码的命令如下,直接运行会失败,系统找不到devenv,我们需要添加devenv.exe所在的目录到环境变量中. os. ...
- Sql server 2008 R2 正在关闭[0x80041033]
1. 事件起因, 昨天还访问的好好的, 然后系统一更新, 今天访问的时候, 就报什么 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是 ...
- 关系数据库域关系演算语言QBE
QBE: Query By Example 基于屏幕表格的查询语言 查询要求:以填写表格的方式构造查询 用示例元素(域变量)来表示查询结果可能的情况 查询结果:以表格形式显示 QBE操作框架 ...
- 如何查看apache加载了哪些模块
apache2/bin/apachectl -l 可以看到类似下面的结果: 这是编译时就已编译在apache中的模块,启动时自然会加载. 另外一部分,要看apach的配置文件(httpd.conf)的 ...