C++ HOJ 约瑟夫问题 之 神牛代码

#include <cstdio>
#include <vector>
#include <algorithm>  

using namespace std;  

const int MAXN = 1 << 17;  

struct SegTree {
    int n, m;
    int a[MAXN + MAXN];  

    static int L(int i) { return i << 1; }
    static int R(int i) { return L(i) ^ 1; }  

    void init(int m) {
        this->m = m;
        n = 1;
        while (n < m) {
            n <<= 1;
        }
        fill(a + n, a + n + m, 1);
        fill(a + n + m, a + n + n, 0);
        for (int i = n - 1; i > 0; --i) {
            a[i] = a[L(i)] + a[R(i)];
        }
    }  

    void reset(int i) {
        i += n;
        while (i > 0) {
            --a[i];
            i >>= 1;
        }
    }  

    int find(int p, int pl, int pr, int l, int r, int& k) {
        if (pl == l && pr == r) {
            if (a[p] <= k) {
                k -= a[p];
                return -1;
            } else if (pr - pl == 1) {
                return pl;
            }
        }
        int pm = (pl + pr) / 2;
        if (r <= pm) {
            return find(L(p), pl, pm, l, r, k);
        } else if (pm <= l) {
            return find(R(p), pm, pr, l, r, k);
        } else {
            int ret = find(L(p), pl, pm, l, pm, k);
            if (ret == -1) {
                ret = find(R(p), pm, pr, pm, r, k);
            }
            return ret;
        }
    }  

    int find(int i, int k) {
        k %= a[1];
        i = find(1, 0, n, i, m, k);
        if (i == -1) {
            i = find(1, 0, n, 0, m, k);
        }
        return i;
    }
} st;  

int main() {
    int n, q, x, a, b, m;
    vector<pair<int, int> > v;  

    while (scanf("%d%d%d%d%d%d", &n, &q, &x, &a, &b, &m) != EOF) {
      //  fprintf(stderr, "%d %d %d %d %d %d\n", n, q, x, a, b, m);
        v.resize(q);
        for (int i = 0; i < q; ++i) {
            scanf("%d", &v[i].first);
            v[i].second = i;
        }
        sort(v.begin(), v.end());  

        st.init(n);
        for (int i = 0, j = 0, k = 0; i < q; ++i) {
            while (j < v[i].first) {
                ++j;
                k = st.find(k, x);
                st.reset(k);
                x = (1LL * x * a + b) % m;
            }
            v[i].first = k;
            swap(v[i].first, v[i].second);
        }
        sort(v.begin(), v.end());  

        for (int i = 0; i < q; ++i) {
            if (i > 0) {
                putchar(' ');
            }
            printf("%d", v[i].second + 1);
        }
        puts("");
    }  

    return 0;
}  

【约瑟夫改进问题】

1.HDOJ 1443 约瑟夫环的最新应用

http://blog.csdn.net/hackbuteer1/article/details/6657938

2.课程设计---约瑟夫环

http://blog.csdn.net/u012377333/article/details/46343303

3.POJ1012——再解一遍艰难的约瑟夫

http://bbs.csdn.net/topics/380056863

4.xt 1149 线段树版的约瑟夫

http://blog.csdn.net/cscj2010/article/details/7586016

5.全排列算法及实现

http://blog.csdn.net/hackbuteer1/article/details/6657435

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 09:28:15

C++ HOJ 约瑟夫问题 之 神牛代码的相关文章

约瑟夫环问题 java代码实现(高效率)

问题来历编辑 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从.一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是

约瑟夫环 --- 面向对象 --- java代码

约瑟夫环 的 面向对象 解法 罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏. 如有疑问请参考:http://blog.fishc.com

线性表—顺序表

引言(重点): 1.线性表的概述 2.线性表的抽象数据类型描述 3.线性表的实现方式 4.线性表的具体实现 5.每种具体实现的分析 1.什么是线性表?线性表(Linear List):由同类型元素构成有序序列的线性结构. 特征:1.表中元素个数称为线性表的长度2.线性表没有元素时,称为空表3.表起始位置称表头,表结束位置称为表尾4.在一个元素的前面的元素叫前驱元素,在一个元素后面的元素叫后继元素. 2.线性表的抽象数据类型描述 List MakeEmpty():初始化一个空线性表L;Elemen

15.4.19 第四届华中区程序设计邀请赛暨武汉大学第十三届校赛 网络预选赛

Problem 1564 - A - Circle Time Limit: 4000MS   Memory Limit: 65536KB   Total Submit: 349  Accepted: 73  Special Judge: No Description Here is a circle sequence S of length n, and you can choose a position and remove the number on it. After that,you w

HIT_1917_Peaceful Commission(2-SAT)

Peaceful Commission Source : POI 2001 Time limit : 10 sec Memory limit : 32 M The Public Peace Commission should be legislated in Parliament of The Democratic Republic of Byteland according to The Very Important Law. Unfortunately one of the obstacle

错误和问题解决的成本

问题描写叙述 错误 数据收集 根本原因 版本号   组件:数据修复           在一个实际成本组织中,(平均,先进先出,后进先出) 一个或更 多的下面情况可能发生: 1.导航到物料成本历史表单上的数量信息,与现有量表单的数量不匹配的记录 2. 一些物料前期已计成本的数量与前面的事务处理历史表单的数量不匹配 3. 全部的库存值报表与事务处理值报表不匹配 4. 存货层次成本更新表单的总数量与现有量数量表单不匹配(只在先进先出/后进先出) 5.这些症状的不论什么一个意味着 MMT-CQL不匹配

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

10行python代码实现约瑟夫问题

什么是约瑟夫问题? 约瑟夫问题是一个有趣的数学游戏,游戏规则如下: 1.N个人围成一个圈,编号从1开始,依次到N. 2.编号为M的游戏参与者开始报数,报数从1开始,后面的人报数接龙,直到K为止,报数为K的人将出局. 3.出局者的下一个玩家接着从1开始报数,如此循环,直到剩下一个玩家时游戏结束,这个玩家就是游戏获胜者. 那么问题来了,哪个编号是游戏获胜者呢? 下面通过简单的几行python代码来解决这个问题: #!/usr/bin/env python # Joseph Problem def j

约瑟夫问题的JAVA实现(借鉴别人的代码+自己分析理解)

http://www.blogjava.net/rorely/archive/2010/01/15/309732.html 原博客地址 import java.util.Scanner; /** *使用数组实现约瑟夫环问题 *由m个人围成一个首尾相连的圈报数. *从第一个人开始,从1开始报数,报到n的人出圈, *剩下的人继续从1开始报数,直到所有的人都出圈为止. *对于给定的m和n,求出所有人的出圈顺序. */ public class RingYuesefu{ public static vo