Ball CodeForces - 12D

传送门

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.

Input

The first line contains one integer N (1 ≤ N ≤ 500000). The second line contains Ninteger 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

Output the answer to the problem.

Examples

Input

31 4 24 3 22 5 3

Output

1

题意:一个人的三个值都小于另一个人,这个人就会自杀,问有几个人自杀题解:线段树降维,然而并不是很会
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<stack>
#include<cstdlib>
#include <vector>
#include <set>
#include<queue>
using namespace std;

#define ll long long
#define llu unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int maxn =  5e5+5;
const ll mod = 1e9+7;

int n;
struct node
{
    int x,y,z;
}a[maxn];

int h[maxn];

struct Tree
{
    int l,r,Max;
}segTree[maxn<<2];

void push_up(int i)
{
    segTree[i].Max = max(segTree[i<<1].Max,segTree[(i<<1)|1].Max);
}
void build(int i,int l,int r)
{
    segTree[i].l = l;
    segTree[i].r = r;
    segTree[i].Max = 0;
    if(l == r)
        return;
    int mid = (l + r)/2;
    build(i<<1,l,mid);
    build((i<<1)|1,mid+1,r);
}

int query(int i,int l,int r)
{
    if(segTree[i].l == l && segTree[i].r == r)
        return segTree[i].Max;
    int mid = (segTree[i].l + segTree[i].r)/2;
    if(r < mid)
        return query(i<<1,l,r);
    else if(l > mid)
        return query((i<<1)|1,l,r);
    else
        return max(query(i<<1,l,mid),query((i<<1)|1,mid+1,r));
}
void update(int i,int k,int val)
{
    if(segTree[i].l == k && segTree[i].r == k)
    {
        segTree[i].Max = max(segTree[i].Max,val);
        return;
    }
    int mid = (segTree[i].l + segTree[i].r)/2;
    if(k <= mid)
        update(i<<1,k,val);
    else
        update((i<<1)|1,k,val);
    push_up(i);
}
bool comp(node x,node y)
{
    if(x.x != y.x)
        return x.x > y.x;
    else if(x.y != y.y)
        return x.y > y.y;
    else
        return x.z > y.z;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i].x);
    for(int i=1;i<=n;i++)
    {
        scanf("%d", &a[i].y);
        h[i] = a[i].y;
    }
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i].z);
    sort(h+1,h+n+1);
    int Size = unique(h+1,h+1+n)-h-1;  //unique的作用是“去掉”容器中相邻元素的重复元素(不一定要求数组有序),所以如果想得到去重后的size,需要减去初始地址,lower_bound是得到地址
    //cout<<Size<<endl;
    build(1,1,Size+1);
    sort(a+1,a+1+n,comp);
    int preval = a[1].x;
    int prei,ans = 0;
    for(int i=1;i<=n;)
    {
        prei = i;
        for(;a[i].x == a[prei].x && i<=n;i++)
        {
            a[i].y = lower_bound(h+1,h+1+Size,a[i].y)-h;
            if(query(1,a[i].y+1,Size+1)>a[i].z)
                ans++;
        }
        for(;prei<i;prei++)
            update(1,a[prei].y,a[prei].z);
    }
    printf("%d\n",ans);
}


原文地址:https://www.cnblogs.com/smallhester/p/10390290.html

时间: 2024-10-16 16:42:50

Ball CodeForces - 12D的相关文章

Codeforces 12D Ball 树状数组模拟3个元素的排序

题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<a

codeforces 12D Ball

codeforces 12D Ball 这道题有两种做法 一种用树状数组/线段树维护区间最值,一种用map维护折线,昨天我刚遇见了一道类似的用STL维护折线的题目: 392D Three Arrays 参考题解:http://blog.csdn.net/rzo_kqp_orz/article/details/70666174 参考代码:http://codeforces.com/contest/392/submission/8930531 现在来谈谈这道题: (借一下另一题题解的图) 假设现在图

树状数组模拟3个元素的排序 Codeforces 12D Ball

http://codeforces.com/problemset/problem/12/d Ball time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output N ladies attend the ball in the King's palace. Every lady can be described with three val

CodeForces 12D Ball 多级排序 + 离散 + 线段树

给出B,I,R,对于Pi,若存在Pj满足 Bi < Bj && Ii < Ij && Ri < Rj ,则称Pi为 probable self-murderers.问存在多少个Pi. 首先对其升序排序,优先级为B > I > R. 然后发现对于i < j ,必有Bi <= Bj,所以这一层基本可以忽略. 然后由于数据范围较大,对 I 进行离散,建立线段树记录大于I的区间内最大的R是多少,当然此时要从后往前扫描,边更新边计数. #in

Codeforces 12D Ball 树形阵列模拟3排序元素

主题链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<a

线段树详解 (原理,实现与应用)

线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点. 线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是O(log2(n)). 线段树的原理,就是,将[1,n]分解成若干特定的子区间(数量不超过4*n),然后,将每个区间[L,R]都分解为 少量特定的子区

Codeforces Beta Round #12 (Div 2 Only) D. Ball sort/map

D. Ball Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/12/D Description 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

Codeforces Beta Round #12 D. Ball (线段树)

题目大意: n个女性中,如果有一个女性的三维比这个女性的三维都大,这个女性就要自杀.问要自杀多少个. 思路分析: 先按照第一维排序. 然后离散化第二维,用第二维的下标建树,树上的值是第三维,更新的时候取最大值. 注意是按照第一维度从大到小进入线段树. 而且还要严格递增. 所以处理第一维度比较大小的时候要分开处理,要把相同的先判断,再更新入树. 那么如何判断这个女性是否自杀. 首先,你知道第一维度是从大到小的,所以先进树了的节点的第一维度一定更大. 再次,我们考虑第二维度,我们去树上第二维度下标大

Codeforces Beta Round #12 (Div 2 Only) D. Ball 树状数组查询后缀、最值

http://codeforces.com/problemset/problem/12/D 这里的BIT查询,指的是查询[1, R]或者[R, maxn]之间的最值,这样就够用了. 设三个权值分别是b[1], b[2], b[2]; 首先,先把b[1]值离散化,离散成一个个id,那么只能是在id比较大的地方找了.然后把b[2]排序,倒序查询,也就是先查询最大的,当然它是没可能自杀的,因为它已经最大了,然后查询完后,把它压进bit后,以后在bit查询,就不需要管b[2]了,因为在bit里面的b[2