soj98 卡牌
题意:一共有n张牌,每张牌有三个属性ai,bi,ci。问在属性上限为A,B,C的所有牌中有多少张牌满足至少有两个属性可以完全压制(严格大于)那n张牌?
n<=50W。
标程:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
const int N=;
int n,A,B,C,Mx_a[N],Mx_b[N],ma,mb;
ll ans,sum_a[N],sum_b[N];
struct node{int a,b,c;}p[N];
bool operator < (const node &A,const node &B){return A.c>B.c;}
int main()
{
n=read();A=read();B=read();C=read();
for (int i=;i<=n;i++) p[i].a=read(),p[i].b=read(),p[i].c=read();
sort(p+,p+n+);
for (int i=;i<=n;i++) Mx_b[p[i].a]=max(Mx_b[p[i].a],p[i].b);
for (int i=;i<=n;i++) Mx_a[p[i].b]=max(Mx_a[p[i].b],p[i].a);
for (int i=B-;i>=;i--) Mx_a[i]=max(Mx_a[i+],Mx_a[i]);
for (int i=A-;i>=;i--) Mx_b[i]=max(Mx_b[i+],Mx_b[i]);
for (int i=;i<=A;i++) sum_a[i]=sum_a[i-]+B-Mx_b[i];
for (int i=;i<=B;i++) sum_b[i]=sum_b[i-]+A-Mx_a[i];
for (int i=C,head=;i>=;i--)
{
while (head<=n&&p[head].c==i) ma=max(ma,p[head].a),mb=max(mb,p[head].b),head++;
if (Mx_b[ma+]<mb+) ans+=(ll)(A-ma)*(B-mb);
else ans+=sum_a[A]-sum_a[ma]-sum_b[mb];
}
printf("%lld\n",ans);
return ;
}
易错点:注意前缀和统计时的循环下标勿混。
题解:前缀和+数形结合
考场上我写了个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 卡牌的更多相关文章
- BZOJ 4205: 卡牌配对
4205: 卡牌配对 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 173 Solved: 76[Submit][Status][Discuss] ...
- 使用UIKit制作卡牌游戏(三)ios游戏篇
译者: Lao Jiang | 原文作者: Matthijs Hollemans写于2012/07/13 转自朋友Tommy 的翻译,自己只翻译了这第三篇教程. 原文地址: http://www.ra ...
- CCOrbitCamera卡牌翻转效果
static CCOrbitCamera* create(float t, float radius, float deltaRadius, float angleZ, float deltaAngl ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JLOI 2013 卡牌游戏
问题描述: N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先 ...
- cocos2d-x 卡牌翻牌效果的实现
转自:http://blog.csdn.net/yanghuiliu/article/details/9115833 这个能实现翻牌的action就是CCOrbitCamera. static CCO ...
- [JLOI2013]卡牌游戏
[题目描述 Description] N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡 ...
- [bzoj3191] [JLOI2013]卡牌游戏
概率DP. 首先由题解可得>_<,胜出概率只与剩余人数.与庄家的相对位置有关. 所以设f[i][j]表示剩下i个人,从庄家开始第j个人的胜利概率... 根据卡牌一通乱搞即可... #inc ...
- bzoj 3191: [JLOI2013]卡牌游戏
Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X ...
随机推荐
- P1802 5倍经验日
P1802 5倍经验日 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却无奈的看着那一些比他等级高的好友,想着能否把他们干掉.干掉能拿不少经验的. 题目描述 现在absi20 ...
- detours3.0文档翻译
拦截二进制函数 Detours库可以在运行过程中动态拦截函数调用.detours将目标函数前几个指令替换为一个无条件跳转,跳转到用户定义的detour函数.被拦截的函数保存在trampoline函数中 ...
- 全局唯一标识符(GUID,Globally Unique Identifier)
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况 ...
- C#-Api:身份证识别
ylbtech-C#-Api:身份证识别 通过POST上传base64格式的图片内容,可识别二代身份证.驾照.行驶证.军官证.中华人民共和国往来港澳通行证.台湾居民往来大陆通行证.大陆居民往来台湾通行 ...
- StringUtils里的isEmpty方法和isBlank方法的区别
原文地址:https://blog.csdn.net/a1102325298/article/details/80410740 isEmpty public static boolean isEmpt ...
- AT指令集之Call
1.//unsolicited result code,URC表示BP->AP+ESIPCPI:<call_id>,<dir>,<sip_msg_type>, ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 G. Colorful String 回文树
签到提: 题意:求出每一个回文串的贡献 (贡献的计算就是回文串不同字符的个数) 题解: 用回文树直接暴力即可 回文树开一个数组cost[ ][26] 和val[ ] 数组: val[i]表示回文树上节 ...
- mysql主从复制原理分析
1.主从复制这类NFS存储数据通过inotify+rsync同步到备份的NFS服务器,只不 过Mysql的复制方案是其自带的工具inotify 是一种文件系统的变化通知机制,如文件增加.删除等事件可以 ...
- shell 基本系统命令,关机重启,查看版本,查手册,日期,磁盘,历史命令
1. 查看系统版本及内核版本 cat /etc/issue 查看系统版本 uname -r 查看内核版本 2. 关机重启命令 关机: shutdown -h now 立即关机 shut ...
- JS对象 提取指定数目的字符substr() substr() 方法从字符串中提取从 startPos位置开始的指定数目的字符串。
提取指定数目的字符substr() substr() 方法从字符串中提取从 startPos位置开始的指定数目的字符串. 语法: stringObject.substr(startPos,length ...