lightoj 1097 - Lucky Number(线段树)
Lucky numbers are defined by a variation of the well-known sieve of Eratosthenes. Beginning with the natural numbers strike out all even ones, leaving the odd numbers 1, 3, 5, 7, 9, 11, 13, ...The second number is 3, next strike out every third number, leaving 1, 3, 7, 9, 13, ... The third number is 7, next strike out every seventh number and continue this process infinite number of times. The numbers surviving are called lucky numbers. The first few lucky numbers are:
1, 3, 7, 9, 13, 15, 21, 25, 31, 33, ...
In this problem your task is to find the nth lucky number where n is given in input.
Input
Input starts with an integer T (≤ 10000), denoting the number of test cases.
Each case contains an integer n (1 ≤ n ≤ 105).
Output
For each case, print the case number and the nth lucky number.
题意:先给出一个由奇数组成的数列, 1 3 5 7 9 ….. ,现在告诉你, 第i次操作从序列中取出第i个数, 然后每隔a[i]去掉一个数, 问你最后幸存下来的第n个数是多少。
利用线段数暴力操作一遍就行了,由于样例很友善都给出了第100000个数是1429431所以建一个大小为1429431的树就可以了,但是节点大小不要设为
(1429431) << 2这样会ME的。1429431小与2^21所以总结点数小于2^22,大概是1429431的3倍左右就可以了。
至于怎么操作数,要用到前缀和的思想,区间的和表示这区间总公能放多少的点,删掉一个就想这个点的值改为0。具体递归为
if T[p].num < pos (pos - T[p].num , (p<<1)|1) else (pos , p<<1)
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- using namespace std;
- const int M = 1429431;
- struct TnT {
- int l , r , sum;
- }T[M * 3];
- void build(int l , int r , int p) {
- int mid = (l + r) >> 1;
- T[p].l = l , T[p].r = r;
- if(T[p].l == T[p].r) {
- T[p].sum = 1;
- if(T[p].l % 2 == 0)
- T[p].sum = 0;
- return ;
- }
- build(l , mid , p << 1);
- build(mid + 1 , r , (p << 1) | 1);
- T[p].sum = T[p << 1].sum + T[(p << 1) | 1].sum;
- }
- void updata(int pos , int p) {
- if(T[p].l == T[p].r) {
- T[p].sum = 0;
- return ;
- }
- if(T[p << 1].sum < pos) {
- updata(pos - T[p << 1].sum , (p << 1) | 1);
- }
- else {
- updata(pos , p << 1);
- }
- T[p].sum = T[p << 1].sum + T[(p << 1) | 1].sum;
- }
- int query(int pos , int p) {
- if(T[p].l == T[p].r) {
- return T[p].l;
- }
- if(T[p << 1].sum < pos) {
- return query(pos - T[p << 1].sum , (p << 1) | 1);
- }
- else {
- return query(pos , p << 1);
- }
- }
- void init() {
- build(1 , M , 1);
- int gg;
- for(int i = 2 ; i <= T[1].sum ; i++) {
- gg = query(i , 1);
- for(int j = gg ; j <= T[1].sum ; j += (gg - 1)) {
- updata(j , 1);
- }
- }
- }
- int main()
- {
- int t;
- init();
- scanf("%d" , &t);
- int ans = 0;
- while(t--) {
- ans++;
- int n;
- scanf("%d" , &n);
- printf("Case %d: %d\n" , ans , query(n , 1));
- }
- return 0;
- }
lightoj 1097 - Lucky Number(线段树)的更多相关文章
- LightOJ 1097 - Lucky Number 线段树
http://www.lightoj.com/volume_showproblem.php?problem=1097 题意:一个自然数序列,先去掉所有偶数项,在此基础上的序列的第二项为3,则删去所有3 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- HDU-1394 Minimum Inversion Number 线段树+逆序对
仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...
- K-th Number 线段树(归并树)+二分查找
K-th Number 题意:给定一个包含n个不同数的数列a1, a2, ..., an 和m个三元组表示的查询.对于每个查询(i, j, k), 输出ai, ai+1, ... ,aj的升序排列中第 ...
- hdu1394Minimum Inversion Number(线段树,求最小逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- hdu1394(Minimum Inversion Number)线段树
明知道是线段树,却写不出来,搞了半天,戳,没办法,最后还是得去看题解(有待于提高啊啊),想做道题还是难啊. 还是先贴题吧 HDU-1394 Minimum Inversion Number Time ...
- HDU 1394 Minimum Inversion Number(线段树 或 树状数组)
题目大意:给出从 0 到 n-1 的整数序列,A0,A1,A2...An-1.可将该序列的前m( 0 <= m < n )个数移到后面去,组成其他的序列,例如当 m=2 时,得到序列 A2 ...
- K-th Number 线段树的区间第K大
http://poj.org/problem?id=2104 由于这题的时间限制不紧,所以用线段树水一水. 每个节点保存的是一个数组. 就是对应区间排好序的数组. 建树的时间复杂度需要nlogn 然后 ...
- hdu - 1394 Minimum Inversion Number(线段树水题)
http://acm.hdu.edu.cn/showproblem.php?pid=1394 很基础的线段树. 先查询在更新,如果后面的数比前面的数小肯定会查询到前面已经更新过的值,这时候返回的sum ...
随机推荐
- EasyUI combobox下拉列表实现搜索过滤(模糊匹配)
项目中的某个下拉列表长达200多个项,这么巨大的数量一个一个找眼镜都得看花,于是就得整了个搜索功能.看网上别人帖子有只能前缀匹配的方案,但只能前缀匹配的话用起来也不是很方便.于是就记录一下模糊匹配的方 ...
- 认识 tomcat 被占用问题
(1) Server 中的 port 该端口为tomcat使用jvm的端口,必须保证唯一性,否则tomcat启动不成功: (2) Connector 中的 port 该端口为tomcat中所有web应 ...
- python_0基础学习_day02
第二节 一,while while也称为无限循环.死循环 while 条件: 缩进 循环体 应用领域:音乐播放:单曲循环,列表循环,随机播放(也是有规律的) 登陆界面:…… 数学计算:1~100的和, ...
- 利用MAVEN打包可运行jar包,包括依赖的第三方包
转载自:http://bglmmz.iteye.com/blog/2058914 背景: 另一篇文章说了如何利用IDEA来打包,现在来说说如何利用MAVEN打包 目标:应用本身打成一个jar包,依赖的 ...
- Windows to Linux API 映射
- SpringBoot配置web访问H2
[**前情提要**]最近开始搭建博客,在本地调试的时候使用的数据库是h2,但是调试的时候需要查看数据库,本文也由此而来. --- 下面是我用到的方法: 1. 使用IDEA的Database连接工具,具 ...
- 给你的SpringBoot做埋点监控--JVM应用度量框架Micrometer
JVM应用度量框架Micrometer实战 前提 spring-actuator做度量统计收集,使用Prometheus(普罗米修斯)进行数据收集,Grafana(增强ui)进行数据展示,用于监控生成 ...
- 汇总VSCode中比较好用的插件
使用vscode编辑器两年的时间,总结出前端一些比较方便的插件 1. Auto Close Tag 自动添加HTML / XML关闭标签 2. Auto Complete Tag 自动完成标签 3 A ...
- Java 内存模型和 JVM 内存结构真不是一回事
这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...
- MVC + EFCore 完整教程19-- 最简方法读取json配置:自定义configuration读取配置文件
问题引出 ASP.NET Core 默认将 Web.config移除了,将配置文件统一放在了 xxx.json 格式的文件中. 有Web.config时,我们需要读到配置文件时,一般是这样的: var ...