题意:一共有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=,f=;char ch=getchar();
  9. while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
  10. while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
  11. return x*f;
  12. }
  13. const int N=;
  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=;i<=n;i++) p[i].a=read(),p[i].b=read(),p[i].c=read();
  22. sort(p+,p+n+);
  23. for (int i=;i<=n;i++) Mx_b[p[i].a]=max(Mx_b[p[i].a],p[i].b);
  24. for (int i=;i<=n;i++) Mx_a[p[i].b]=max(Mx_a[p[i].b],p[i].a);
  25. for (int i=B-;i>=;i--) Mx_a[i]=max(Mx_a[i+],Mx_a[i]);
  26. for (int i=A-;i>=;i--) Mx_b[i]=max(Mx_b[i+],Mx_b[i]);
  27. for (int i=;i<=A;i++) sum_a[i]=sum_a[i-]+B-Mx_b[i];
  28. for (int i=;i<=B;i++) sum_b[i]=sum_b[i-]+A-Mx_a[i];
  29. for (int i=C,head=;i>=;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+]<mb+) ans+=(ll)(A-ma)*(B-mb);
  33. else ans+=sum_a[A]-sum_a[ma]-sum_b[mb];
  34. }
  35. printf("%lld\n",ans);
  36. return ;
  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)->排序。

soj98 卡牌的更多相关文章

  1. BZOJ 4205: 卡牌配对

    4205: 卡牌配对 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 173  Solved: 76[Submit][Status][Discuss] ...

  2. 使用UIKit制作卡牌游戏(三)ios游戏篇

    译者: Lao Jiang | 原文作者: Matthijs Hollemans写于2012/07/13 转自朋友Tommy 的翻译,自己只翻译了这第三篇教程. 原文地址: http://www.ra ...

  3. CCOrbitCamera卡牌翻转效果

    static CCOrbitCamera* create(float t, float radius, float deltaRadius, float angleZ, float deltaAngl ...

  4. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  5. JLOI 2013 卡牌游戏

    问题描述: N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先 ...

  6. cocos2d-x 卡牌翻牌效果的实现

    转自:http://blog.csdn.net/yanghuiliu/article/details/9115833 这个能实现翻牌的action就是CCOrbitCamera. static CCO ...

  7. [JLOI2013]卡牌游戏

    [题目描述 Description] N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡 ...

  8. [bzoj3191] [JLOI2013]卡牌游戏

    概率DP. 首先由题解可得>_<,胜出概率只与剩余人数.与庄家的相对位置有关. 所以设f[i][j]表示剩下i个人,从庄家开始第j个人的胜利概率... 根据卡牌一通乱搞即可... #inc ...

  9. bzoj 3191: [JLOI2013]卡牌游戏

    Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X ...

随机推荐

  1. csp-s模拟测试94

    csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间, ...

  2. PyTorch常用函数总结

    将一个tensor分到多个GPU上:torch.cuda.comm.scatter

  3. solr +zookeeper+Jetty 集群搭建

    solr版本:4.10.4 这里使用solr自带的jetty内置服务器 zk集群的 安装参照上篇文章: 在节点1example下上启动solr服务: java -DzkHost=192.168.0.1 ...

  4. SPRING+JPA+Hibernate配置方法

    1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  5. gcc 4步编译过程

    一. gcc编译过程  1. 预处理: 主要进行宏替换以及头文件的展开  gcc  -E   *.c  -o  *.i 2.  编译::编译生成汇编文件,会检查语法错误   gcc  -S   *.i ...

  6. python 取出aws中ip有,zabbix中没有的ip

    #!/usr/bin/env python3# coding=utf-8import requestsimport jsonimport boto3 headers = {'Content-Type' ...

  7. C# interface (接口基础知识详解)

    Interface(接口) (本文转载地址:http://blog.sina.com.cn/s/blog_574c993d0100d59n.html) 介绍:C#中的接口提供了一种实现运行时的多态.通 ...

  8. Chrome DNS_PROBE_FINISHED_NXDOMAIN

    win10 下的Chrome访问网站时,提示DNS_PROBE_FINISHED_NXDOMAIN 解决方法很简单: 用管理员身份打开cmd后,运行如下指令即可解决问题. 运行命令: netsh wi ...

  9. Batch - Windows Batch 常用命令

    比较符号(不能用 < , >) The reason operators like > are not used is because they have special meani ...

  10. Java 基础 - public、private、protected区别

    ref: https://www.cnblogs.com/pengfeiliu/p/3745934.html 类中的数据成员和成员函数据具有的访问权限包括:public.private.protect ...