题意

美团点评上有很多餐馆优惠券,用户可以在美团点评App上购买。每张优惠券有一个唯一的正整数编号。当用户在相应餐馆就餐时,可以在餐馆使用优惠券进行消费。优惠券的购买和使用按照时间顺序逐行记录在日志文件中,运营人员会定期抽查日志文件看业务是否正确。业务正确的定义为:一个优惠券必须先被购买,然后才能被使用。
某次抽查时,发现有硬盘故障,历史日志中有部分行损坏,这些行的存在是已知的,但是行的内容读不出来。假设损坏的行可以是任意的优惠券的购买或者使用。
现在问这次抽查中业务是否正确。若有错,输出最早出现错误的那一行,即求出最大s,使得记录1到s-1满足要求;若没有错误,输出-1。

思路

对于每一次在有该优惠券的时候买入或者在没有该优惠券的时候卖使用都需要用一个?先进行一次使用或买入操作,而且只能动最后一次出现对这个优惠券操作之后的?才能保证不破坏之前的买入使用操作,用树状数组维护比某个数大的第一个数是多少,然后进行操作即可,如果出现需要?但没有符合条件的?的话那么就截止到这里了,如果到最后都没问题那记录就是正确的

代码

#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;
int status[100001],num[500001],e[100001];
char type[500001];
int BIT[500001];
int lowbit(int x)
{return x&(-x);
}
void update(int x,int d)
{while(x<=500000){BIT[x]+=d;x+=lowbit(x);}
}
int sum(int x)
{int ret=0;while(x>0){ret+=BIT[x];x-=lowbit(x);}return ret;
}
int find_kth(int k)
{int ans=0,cnt=0;for(int i=19;i>=0;i--){ans+=(1<<i);if(ans>500000||cnt+BIT[ans]>=k)ans-=(1<<i);else cnt+=BIT[ans];}return ans+1;
}
int main()
{int m,ans,cnt;int p;while(scanf("%d",&m)!=EOF){for(int i=1;i<=m;i++){scanf(" %c",&type[i]);if(type[i]!='?')scanf("%d",&num[i]);}ans=-1;cnt=0;for(int i=1;i<=m;i++)if(type[i]=='I'){if(status[num[i]]==0){status[num[i]]=1;e[num[i]]=i;}else{p=find_kth(sum(e[num[i]])+1);if(p==500001){ans=i;break;}else{update(p,-1);e[num[i]]=i;}}}else if(type[i]=='O'){if(status[num[i]]==1){status[num[i]]=0;e[num[i]]=i;}else{p=find_kth(sum(e[num[i]])+1);if(p==500001){ans=i;break;}else{update(p,-1);e[num[i]]=i;}}}else update(i,1);printf("%d\n",ans);for(int i=1;i<=100000;i++)status[i]=0;for(int i=1;i<=100000;i++)e[i]=0;for(int i=1;i<=500000;i++)BIT[i]=0;}return 0;
}

CodeM资格赛C 优惠券 题解相关推荐

  1. CodeM资格赛B 锦标赛 题解

    题意 组委会正在为美团点评CodeM大赛的决赛设计新赛制. 比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛.复赛的成绩,会有不同的积分.比赛采取锦标赛赛制,分轮次进行,设某一轮 ...

  2. loj 6085.「美团 CodeM 资格赛」优惠券

    题目: 一个有门禁的大楼,初始时里面没有人. 现在有一些人在进出大楼,每个人都有一个唯一的编号.现在有他们进出大楼的记录,但是有些被污染了,只能知道这里有一条记录,具体并不能知道. 一个人只有进大楼, ...

  3. LOJ#6085. 「美团 CodeM 资格赛」优惠券(set)

    题意 题目链接 Sol 考虑不合法的情况只有两种: 进去了 再次进去 没进去 但是出来了 显然可以用未知记录抵消掉 直接开个set维护一下所有未知记录的位置 最优策略一定是最后一次操作位置的后继 同时 ...

  4. CodeM资格赛E 数码 题解

    题意 给定两个整数 l 和 r ,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x 的所有约数全部写下来.对于每个写下来的数,只保留最高位的那个数码.求1-9每个数码出现的次数. ...

  5. 2018美团codeM资格赛——python代码

    2018美团codeM资格赛--python代码 第一题:下单 题目描述 美团在吃喝玩乐等很多方面都给大家提供了便利.最近又增加了一项新业务:小象生鲜.这是新零售超市,你既可以在线下超市门店选购生鲜食 ...

  6. 美团2017年CodeM资格赛题解

    最近想要参加今年的CodeM竞赛,所以把去年的题做了一遍,顺便写个题解,做个记录. 资格赛有A-F,共6道题,资格赛不限时,而且只要完成一道题就可以了. A.数码 题意:给定两个整数 l 和 r ,对 ...

  7. 美团codeM资格赛 优惠券

    优惠券 时间限制:1秒 空间限制:32768K 美团点评上有很多餐馆优惠券,用户可以在美团点评App上购买.每张优惠券有一个唯一的正整数编号.当用户在相应餐馆就餐时,可以在餐馆使用优惠券进行消费.优惠 ...

  8. CodeM资格赛D 送外卖 题解

    题意 n 个小区排成一列,编号为从 0 到 n-1 .一开始,美团外卖员在第0号小区,目标为位于第 n-1 个小区的配送站. 给定两个整数数列 a[0]~a[n-1] 和 b[0]~b[n-1] ,在 ...

  9. CodeM资格赛A 音乐研究 题解

    题意 美团外卖的品牌代言人袋鼠先生最近正在进行音乐研究.他有两段音频,每段音频是一个表示音高的序列.现在袋鼠先生想要在第二段音频中找出与第一段音频最相近的部分. 具体地说,就是在第二段音频中找到一个长 ...

最新文章

  1. 中科院、百度研究院等联合提出UGAN,生成图片难以溯源
  2. zabbix邮件监控配置
  3. [BZOJ 2523][Ctsc2001]聪明的学生(递归)
  4. 项目Beta冲刺——凡事预则立
  5. AVFoundation和 GPUImage初探
  6. 【雷达对抗】频率测量与频谱分析-概述
  7. Vivado无法双击打开xpr工程文件的解决办法
  8. C# Jpush 极光推送消息推送
  9. 关于压缩工具 7z(7-zip) 的选项 -u(更新压缩档案中的文件)的解读
  10. android 自定义水波纹点击效果Button
  11. vue iview组件表格 render函数的使用
  12. ws2812怎么调亮度_iOS 11 自动亮度调节,居然藏这么深!
  13. Python编程定义函数参数的小tips
  14. Imagination发布开源项目:适配PowerVR IP的Vulkan驱动和编译器合入Mesa 3D 图形库
  15. 使用AIDL实现Android的跨进程通信
  16. 移动地图应用普及给企业带来的利益
  17. 广西国家级自然保护区功能区划图(展示)
  18. 日记20050930
  19. 降噪、音质、游戏,实力非凡,泥炭Air3 Pro降噪耳机评测
  20. 多应用多平台支付模块设计-基础模块开篇

热门文章

  1. 血的教训, 通过中国银行app查询个人征信报告需要多久
  2. 虚幻代码底层——虚幻属性系统(虚幻C++的反射机制)
  3. Linux:ip addr命令分析
  4. 图解最常用的10个机器学习算法!(必须收藏)
  5. 网站被黑有什么影响?为什么网站被黑了?如何防止网站被黑?
  6. OSI七层协议模型、TCP/IP四层模型和五层协议体系结构之间的关系
  7. Oracle grant all privileges to user
  8. 三分钟基础:CPU 到底是怎么认识代码的?
  9. 如何查看自己亚马逊的的库存容量?
  10. 程序人生 - 座位险有必要买吗?