AC日记——约瑟夫问题 codevs 1282

1282 约瑟夫问题

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 大师 Master

题解

查看运行结果

题目描述 Description

有编号从1到N的N个小朋友在玩一种出圈的游戏。开始时N个小朋友围成一圈,编号为I+1的小朋友站在编号为I小朋友左边。编号为1的小朋友站在编号为N的小朋友左边。首先编号为1的小朋友开始报数,接着站在左边的小朋友顺序报数,直到数到某个数字M时就出圈。直到只剩下1个小朋友,则游戏完毕。

现在给定N,M,求N个小朋友的出圈顺序。

输入描述 Input Description

唯一的一行包含两个整数N,M。(1<=N,M<=30000)

输出描述 Output Description

唯一的一行包含N个整数,每两个整数中间用空格隔开,第I个整数表示第I个出圈的小朋友的编号。

样例输入 Sample Input

5 3

样例输出 Sample Output

3 1 5 2 4

数据范围及提示 Data Size & Hint

思路:

  坑爹到炸的线段树;;;

  其实用模拟就能过,但是我依然写的线段树

  刚开始想复杂了,将近150行代码还全部wa

  ac的思路很简单

  就是模拟当先场上还有几个人

  线段树上每个节点的值为1

  表示这个人还在场上

  然后维护还在场上的人的个数

  然后每次输出这次out的是场上第几人

  删除的时候只需把他的值改为0

来,上代码:

#include <cstdio>

using namespace std;

struct node {
    int l,r,dis,mid;

    void mid_()
    {
        mid=(l+r)>>1;
    }
};
struct node tree[30000*4+1];

int n,m;

inline void tree_up(int now)
{
    tree[now].dis=tree[now<<1].dis+tree[now<<1|1].dis;
}

void tree_build(int now,int l,int r)
{
    tree[now].l=l,tree[now].r=r;
    if(l==r)
    {
        tree[now].dis=1;
        return ;
    }
    tree[now].mid_();
    tree_build(now<<1,l,tree[now].mid);
    tree_build(now<<1|1,tree[now].mid+1,r);
    tree_up(now);
    return ;
}

int tree_out(int now,int ci)
{
    if(tree[now].l==tree[now].r)
    {
        tree[now].dis=0;
        return tree[now].l;
    }
    if(tree[now<<1].dis<ci) ci=tree_out(now<<1|1,ci-tree[now<<1].dis);
    else ci=tree_out(now<<1,ci);
    tree_up(now);
    return ci;
}

int main()
{
    scanf("%d%d",&n,&m);
    tree_build(1,1,n);
    int now=0;
    do
    {
        now=(now-1+m)%n;
        printf("%d ",tree_out(1,now+1));
    } while(--n);
    return 0;
}
时间: 2024-08-26 08:27:10

AC日记——约瑟夫问题 codevs 1282的相关文章

AC日记——货车运输 codevs

3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物. 输入描述 Input Description 第一行有两个用一个空格隔开的整数 n,m,表示 A

AC日记——丑数 codevs 1246

1246 丑数 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它).这是个对于一个输入的S的丑数集合.注意:我们不认为1 是一个丑数.你的工作是对于输入的集合S去寻找集合中的第N个丑数.longint(signe

AC日记——元素查找 codevs 1230

1230 元素查找 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过. 输入描述 Input Description 第一行两个整数 n 和m. 第二行n个正整数(1<=n<= 100000) 第三行m个整数(1<=m<=100000) 输出描述 Output Description 一共m行,若出现则输出

AC日记——平衡树练习 codevs 4244

4244 平衡树练习 思路: 有节操的人不用set也不用map: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 5000005 int n,m,ch[maxn][2],key[maxn],root; inline void in(int &now) { int if_

AC日记——Aragorn&#39;s Story HDU 3966

Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10510    Accepted Submission(s): 2766 Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lor

[Codevs] 1282 约瑟夫问题

1282 约瑟夫问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 有编号从1到N的N个小朋友在玩一种出圈的游戏.开始时N个小朋友围成一圈,编号为I+1的小朋友站在编号为I小朋友左边.编号为1的小朋友站在编号为N的小朋友左边.首先编号为1的小朋友开始报数,接着站在左边的小朋友顺序报数,直到数到某个数字M时就出圈.直到只剩下1个小朋友,则游戏完毕. 现在给定N,M,求N个小朋友的出圈顺序. 输入描述 Input Descri

AC日记——楼房 codevs 2995

2995 楼房 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 地平线(x轴)上有n个矩(lou)形(fang),用三个整数h[i],l[i],r[i]来表示第i个矩形:矩形左下角为(l[i],0),右上角为(r[i],h[i]).地平线高度为0.在轮廓线长度最小的前提下,从左到右输出轮廓线. 输入描述 Input Description 第一行一个整数n,表示矩形个数 以下n行,每行3个整数h[i],l[i

AC日记——绿色通道 codevs 3342

3342 绿色通道 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description <思远高考绿色通道>(Green Passage, GP)是唐山一中常用的练习册之一,其题量之大深受lsz等许多oiers的痛恨,其中又以数学绿色通道为最.2007年某月某日,soon-if (数学课代表),又一次宣布收这本作业,而lsz还一点也没有写…… 高二数学<绿色通道>总共有n道题目要写(其实是抄),编号1..n,抄每道

AC日记——接龙游戏 codevs 1051

1051 接龙游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙). 你的任务是:对于输入的单词,找出最长的龙. 输入描述 Input Description 第一行为N(1<=N<=105).以下N行每行一个单词(由小写组成),已经按长度排序.(每个单词长度<50) 输出描述 Output De