zoukankan      html  css  js  c++  java
  • soj98 卡牌

    题意:一共有n张牌,每张牌有三个属性ai,bi,ci。问在属性上限为A,B,C的所有牌中有多少张牌满足至少有两个属性可以完全压制(严格大于)那n张牌?

    n<=50W。

    标程:

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 using namespace std;
     5 typedef long long ll;
     6 int read()
     7 {
     8    int x=0,f=1;char ch=getchar();
     9    while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
    10    while (ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    11    return x*f;
    12 }
    13 const int N=500005;
    14 int n,A,B,C,Mx_a[N],Mx_b[N],ma,mb;
    15 ll ans,sum_a[N],sum_b[N];
    16 struct node{int a,b,c;}p[N];
    17 bool operator < (const node &A,const node &B){return A.c>B.c;}
    18 int main()
    19 {
    20     n=read();A=read();B=read();C=read();
    21     for (int i=1;i<=n;i++) p[i].a=read(),p[i].b=read(),p[i].c=read();
    22     sort(p+1,p+n+1);
    23     for (int i=1;i<=n;i++) Mx_b[p[i].a]=max(Mx_b[p[i].a],p[i].b);
    24     for (int i=1;i<=n;i++) Mx_a[p[i].b]=max(Mx_a[p[i].b],p[i].a);
    25     for (int i=B-1;i>=1;i--) Mx_a[i]=max(Mx_a[i+1],Mx_a[i]);
    26     for (int i=A-1;i>=1;i--) Mx_b[i]=max(Mx_b[i+1],Mx_b[i]);
    27     for (int i=1;i<=A;i++) sum_a[i]=sum_a[i-1]+B-Mx_b[i];
    28     for (int i=1;i<=B;i++) sum_b[i]=sum_b[i-1]+A-Mx_a[i];
    29     for (int i=C,head=1;i>=1;i--)
    30     {
    31         while (head<=n&&p[head].c==i) ma=max(ma,p[head].a),mb=max(mb,p[head].b),head++;
    32         if (Mx_b[ma+1]<mb+1) ans+=(ll)(A-ma)*(B-mb);
    33         else ans+=sum_a[A]-sum_a[ma]-sum_b[mb];
    34     }
    35     printf("%lld
    ",ans);
    36    return 0;
    37 }

    易错点:注意前缀和统计时的循环下标勿混。

    题解:前缀和+数形结合

    考场上我写了个n^2,在数据随机时nlogn居然跑过去了。。。

    n^2暴力:按照ci从大到小排序,枚举选取的C,那么对于ci<C的点,只要ai,bi其一被压制即可。对于ci>=C的点,两个都得被压制,维护一个A,B取值的max转移即可,并且单调。再按照B进行排序,用类似的方法可以计算出A的取值范围。

    正解:同样按照C从大到小排序,对于ci>=C的max限制也一样。而对于ci<C的点,我们将关于A,B的函数图像画出来,发现是一个阶梯形的结构。Mx_a[i]表示i取i~B时ai的最大值,Mx_b[i]同理。如果不考虑前面的max限制,答案就是A*B-下阶梯的面积。

    如果有限制,就相当于是一条竖线一条横线即一个矩形的限制。如果矩形和阶梯有交,那么取外阶梯的面积-前段排除面积-后段排除面积即可。用前缀和预处理。反之,就是直接取一个矩形的面积。时间复杂度O(nlogn)->排序。

  • 相关阅读:
    GNSS学习笔记-观测量模型和定位定速方程
    矩阵学习-基本矩阵分类
    矩阵学习-QR分解和最小二乘问题求解
    ARM 处理器 MIPS/DMIPS/MFLOPS 理解
    GNSS学习笔记-信号频率分配表
    左移右移为负数的情况
    GNSS学习笔记-坐标转换
    GCC预编译宏查看
    Windows Store无法联网时安装WSL
    Virtual box中Ubuntu虚拟机磁盘碎片整理和空间清理方法
  • 原文地址:https://www.cnblogs.com/Scx117/p/8919279.html
Copyright © 2011-2022 走看看