2017.11.6 T1 2037

题目描述
大数学家高斯小时候偶然间发现一种有趣的自然数集合 Blash ,对应以 a 为基的集合 Ba 定义如下:
(1)a 是集合 Ba 的基,且 a 是 Ba 的第一个元素。
(2)如果 x 在集合 Ba 中,则 2x+1 和 3x+1 也都在集合 Ba 中。
(3)没有其他元素在集合 Ba 中了。
现在小高斯想知道如果将集合 Ba 中元素按照升序排列,第 n 个元素会是多少?

输入格式
输入包含很多行,每行输入包括两个数字,集合的基 a 以及所求元素序号 n 。

输出格式
对应每个输入,输出集合 Ba 的第 n 个元素值。

样例数据
输入

1 100
28 5437

输出

418
900585

备注
【数据规模与约定】
对于 30% 的数据:1≤n≤1000;1≤a≤20;数据组数不超过5。
对于 70% 的数据:1≤n≤10000;1≤a≤30;数据组数不超过5。
对于 100% 的数据:1≤n≤1000000;1≤a≤50;数据组数不超过10。

分析:刚开始天真的用了优先对列,复杂度O(NlogNNlogN)感觉10610^6级别能过的样子,中途样例第一组数据还老是算出来375(如果你也是,说明你忘了“集合”这个东西有特异性,没有重复元素),最后发现是10组数据orz。然后就只能想其他方法,最后还是队列,只是用单调队列,因为对于从小到大每个x的2∗x+12*x+1和3∗x+13*x+1分别也是从小到大的,所以就开两个队列分别存这两种,每次比较队首哪个更小就用它算2∗x+12*x+1和3∗x+13*x+1,又放到两个队尾,再注意判重,最后就实现了O(N<script type="math/tex" id="MathJax-Element-49">N</script>)查询了。
是不是想到了NOIP2016Day2T2蚯蚓呀?

代码
70%:被我扔掉的优先队列在哭泣……

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
#include<queue>
#include<set>
using namespace std;int getint()
{int sum=0,f=1;char ch;for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());if(ch=='-'){f=-1;ch=getchar();}for(;isdigit(ch);ch=getchar())sum=(sum<<3)+(sum<<1)+ch-48;return sum*f;
}int a,n,cnt;
long long las;int main()
{freopen("blash.in","r",stdin);freopen("blash.out","w",stdout);while(scanf("%d%d",&a,&n)!=EOF){priority_queue<long long> que;que.push(-(2*a+1)),que.push(-(3*a+1));cnt=1,las=a;long long b;while(cnt<n-1){cnt++;b=-que.top();//判重que.pop();while(b==las){b=-que.top();que.pop();}que.push(-(2*b+1)),que.push(-(3*b+1));//手动小根堆las=b;//记录队首,判重}b=-que.top();//出第n个的时候也要记得判重while(b==las){b=-que.top();que.pop();}cout<<b<<'\n';}return 0;
}

100%:单调队列在嘲讽优先队列

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
#include<queue>
#include<set>
using namespace std;int getint()
{int sum=0,f=1;char ch;for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());if(ch=='-'){f=-1;ch=getchar();}for(;isdigit(ch);ch=getchar())sum=(sum<<3)+(sum<<1)+ch-48;return sum*f;
}const int maxn=1000010;
int a,n,head1,head2,tail1,tail2,cnt;
long long x,las,q1[maxn*3],q2[maxn*3];int main()
{freopen("blash.in","r",stdin);freopen("blash.out","w",stdout);while(scanf("%d%d",&a,&n)!=EOF){head1=0,head2=0,tail1=1,tail2=1,cnt=2,las=a;q1[tail1]=2*a+1;q2[tail2]=3*a+1;while(tail1<n||tail2<n)//这个只是因为不知道while写成什么才这样的(其实写成while(true)就可以里){x=min(q1[head1+1],q2[head2+1]);while(x==las)//把重复的队首一直删直到不重复{if(x==q1[head1+1])head1++;elsehead2++;x=min(q1[head1+1],q2[head2+1]);}if(cnt==n)//单调队列嘛,队首是第n个说明他就是第n小的{cout<<x<<'\n';break;}cnt++;if(q1[tail1]!=2*x+1)//其实前面判过队首了就不需要判这个了,直接加就可以q1[++tail1]=2*x+1;if(q2[tail2]!=3*x+1)q2[++tail2]=3*x+1;las=x;}}return 0;
}

本题结。

[NOIP2017模拟]Blash数集相关推荐

  1. 【NOIP模拟】 (11.6) T1 Blash数集

    Blash数集 题目描述:        Blash集合对应以 a 为基数的集合 Ba 定义如下:        (1) a 是集合 Ba 的基数,且 a 是 Ba 的第一个元素.        (2 ...

  2. JZOJ 5234. 【NOIP2017模拟8.7A组】外星人的路径

    Description 有一个外星人控制了你的大脑.一开始你处于原点(0,0).外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左). 平面上有N 个关键点,每当外星 ...

  3. NOIP2017模拟赛总结(2017.10.30-2017.11.1)

    第三篇博客,放上2017.10.30-2017.11.1的题. 2017.10.30 Problem A 题目大意: 有一排nnn棵果树和一个容量为sss的果篮,从前往后摘果,如果当前果树的果子数量不 ...

  4. 图解Blash数集题解

    题目描述 大数学家高斯小时候偶然间发现一种有趣的自然数集合 Blash ,对应以 a 为基的集合 Ba 定义如下: (1)a 是集合 Ba 的基,且 a 是 Ba 的第一个元素. (2)如果 x 在集 ...

  5. [NOIP2017模拟]跳高

    题目背景 SOURCE:NOIP2015-HN-CJZX 题目描述 r64 喜欢跳高.但是他的技术并不好,所以他想好好练习一下. 练习场上有一个个高度不一定一样的平台,如图所示.最底下的是地板,高度为 ...

  6. JZOJ.5234【NOIP2017模拟8.7】外星人的路径

    Description 有一个外星人控制了你的大脑.一开始你处于原点(0,0).外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左). 平面上有N 个关键点,每当外星 ...

  7. JZOJ 5344. 【NOIP2017模拟9.3A组】摘果子

    Description Input Output Sample Input 7 9 39 6 13 2 22 6 7 4 -19 5 28 6 -17 1 2 1 3 2 4 1 5 4 6 2 7 ...

  8. JZOJ 5264. 【NOIP2017模拟8.12A组】化学

    Description Input Output Sample Input 3 10 1 2 10 Sample Output 5 Data Constraint Hint Solution 看到数据 ...

  9. JZOJ 5263. 【NOIP2017模拟8.12A组】分手是祝愿

    Description Input Output Sample Input 2 2 15 19 3 30 40 20 Sample Output 285 2600 Data Constraint So ...

  10. JZOJ 5244. 【NOIP2017模拟8.8A组】Daydreamin ' (daydream)

    Description worldwideD最近有午睡的习惯~某日中午,他做了一个梦:梦见有一个怪人,她去一个岛上住N+1天(编号为0到N).这是在大洋中的岛,每天要么是晴天,要么刮台风.她到达岛的第 ...

最新文章

  1. KVM — 内存虚拟化
  2. 局部特征(2)——Harris角点
  3. TDD开发模式实现代码功能逻辑(自己总结,持续更新)
  4. 01算法 java_蓝桥杯:基础练习 01字串【JAVA算法实现】
  5. Base64 + 变为 空格 问题分析
  6. Python使用折线图、柱状图、热力图比较不同班级相同学号学生的成绩
  7. 测试移动信号频率的软件,移动设备的FM测试
  8. 塑胶产品内滑块设计要点,以及注意哪些事项?
  9. linux 时间戳几字节,字节转换跟时间戳转换
  10. IndentationError: unindent does not match any outer indentation level 错误解决
  11. delphi经典大写数字转换函数
  12. 2014年全国高等学校名单
  13. java设计模式 之适配器模式
  14. (3)登录界面——登录
  15. 【渝粤教育】国家开放大学2018年秋季 1013t金融统计分析 参考试题
  16. C++ std::set<>是什么 怎么用 遍历
  17. 躲避雪糕刺客?通过爬虫爬取雪糕价格
  18. Xv6 I/O 与文件描述符
  19. 物联网平台常见问题与答案汇总
  20. 阻容感原件选择标规范

热门文章

  1. c语言bcd错误数字还原,Windows10开机出现恢复界面且提示错误0xc0000034怎么办
  2. 自动白平衡技术(AWB)
  3. el-upload限制文件大小(图片尺寸)
  4. 计算机毕业设计Java校园约拍系统(源码+系统+mysql数据库+Lw文档)
  5. 实现在线预览 pdf 以及添加水印
  6. 从数据分析看王祖贤的电影人生
  7. HDU1814 求2-sat字典序最小的解
  8. Netty in Action 中文版 --最贴近原著的翻译
  9. Spring 定时器时间设置规则
  10. 201919102004张雪婷(第四次作业)