POJ-2886 Who Gets the Most Candies?---线段树+约瑟夫环

时间:2021-10-04 09:05:17

题目链接:

https://cn.vjudge.net/problem/POJ-2886

题目大意:

N个人围成一圈第一个人跳出圈后会告诉你下一个谁跳出来跳出来的人(如果他手上拿的数为正数,从他左边数A个,反之,从他右边数A个) 跳出来的人所得到的糖果数量和他跳出的顺序有关 所得的糖果数为 (假设他是第k个跳出的) 则他得到的糖数为k能被多少个数整除

解题思路:

首先将因子个数打表:因子个数打表模板

然后先求出1-n中因子个数最大的为x,约瑟夫环进行x次

用线段树求出每次约瑟夫环后的具体下标。因为随性和约瑟夫环的进行,人在一个一个减少,需要求出约瑟夫环中的第i个在原数组中的下标

 #include<iostream>
#include<cstdio>
#define MID(l, r) (l + (r - l) / 2)
#define lson(o) (o * 2)
#define rson(o) (o * 2 + 1)
using namespace std;
typedef long long ll;
const int INF = 1e9 +;
const int maxn = 2e6 + ;
int h, w, n;
struct node
{
int l, r, sum;
}tree[maxn];
int ans[maxn];
void build(int o, int l, int r)
{
tree[o].l = l, tree[o].r = r;
if(l == r)
{
tree[o].sum = ;
return;
}
int m = MID(l, r);
int lc = lson(o), rc = rson(o);
build(lc, l, m);
build(rc, m + , r);
tree[o].sum = tree[lc].sum + tree[rc].sum;
}
int id;
void query(int o, int a)//查询第a个数下标,同时删除这个数
{
if(tree[o].l == tree[o].r)
{
id = tree[o].l;
tree[o].sum = ;
return;
}
int lc = lson(o), rc = rson(o);
if(a <= tree[lc].sum)query(lc, a);
else query(rc, a - tree[lc].sum);
tree[o].sum = tree[lc].sum + tree[rc].sum;
}
int divisor_num[maxn];
void init(int n)
{
for(int i = ; i <= n; i++)
{
divisor_num[i]++;
for(int j = i * ; j <= n; j += i)
divisor_num[j]++;
}
}
int solve(int n)
{
int max = , maxid;
for(int i = ; i <= n; i++)
if(divisor_num[i] > max)
{
max = divisor_num[i];
maxid = i;
}
return maxid;
}
char name[][];
int a[maxn];
int main()
{
int n, m;
init();
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = ; i <= n; i++)
scanf("%s%d", name[i], &a[i]);
build(, , n);
int ansid = solve(n), mod = n;
int t = ansid;
while()
{
query(, m);
if(--t == )break;
mod--;
if(a[id] > )
{
m = m - + a[id];
m = ((m - ) % mod + mod) % mod + ;
}
else
{
m = m + a[id];
m = ((m - ) % mod + mod) % mod + ;
}
}
printf("%s %d\n", name[id], divisor_num[ansid]);
}
return ;
}

POJ-2886 Who Gets the Most Candies?---线段树+约瑟夫环的更多相关文章

  1. POJ 2886&period;Who Gets the Most Candies&quest; -线段树&lpar;单点更新、类约瑟夫问题&rpar;

    线段树可真有意思呢续集2... 区间成段的替换和增减,以及区间求和等,其中夹杂着一些神奇的操作,数据离散化,简单hash,区间异或,还需要带着脑子来写题. 有的题目对数据的操作并不是直接按照题面意思进 ...

  2. POJ 2886 Who Gets the Most Candies&quest;&lpar;线段树&amp&semi;&num;183&semi;约瑟夫环&rpar;

    题意  n个人顺时针围成一圈玩约瑟夫游戏  每一个人手上有一个数val[i]   開始第k个人出队  若val[k] < 0 下一个出队的为在剩余的人中向右数 -val[k]个人   val[k ...

  3. POJ 2886 Who Gets the Most Candies&quest; 线段树。。还有方向感

    这道题不仅仅是在考察线段树,还他妹的在考察一个人的方向感.... 和线段树有关的那几个函数写了一遍就对了,连改都没改,一直在转圈的问题的出错.... 题意:从第K个同学开始,若K的数字为正 则往右转, ...

  4. POJ 2886 Who Gets the Most Candies&quest; 线段树

    题目: http://poj.org/problem?id=2886 左右转的果断晕,题目不难,关键是准确的转啊转.因为题目要求输出约数个数最多的数,所以预处理[1,500000]的约数的个数就行了. ...

  5. poj 2886 &quot&semi;Who Gets The Most Candies&quest;&quot&semi;(树状数组)

    传送门 参考资料: [1]:http://www.hankcs.com/program/algorithm/poj-2886-who-gets-the-most-candies.html 题意: 抢糖 ...

  6. 线段树&lpar;单点更新&rpar; POJ 2886 Who Gets the Most Candies&quest;

    题目传送门 #include <cstdio> #include <cstring> #define lson l, m, rt << 1 #define rson ...

  7. POJ 2828 Buy Tickets(排队问题,线段树应用)

    POJ 2828 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意:  排队买票时候插队.  给出一些数对,分别代表某个人的想要插入的位 ...

  8. POJ 2886 Who Gets the Most Candies&quest; (线段树)

    [题目链接] http://poj.org/problem?id=2886 [题目大意] 一些人站成一个圈,每个人手上都有一个数字, 指定从一个人开始淘汰,每次一个人淘汰时,将手心里写着的数字x展示 ...

  9. &lpar;中等&rpar; POJ 2886 Who Gets the Most Candies&quest; &comma; 反素数&plus;线段树。

    Description N children are sitting in a circle to play a game. The children are numbered from 1 to N ...

随机推荐

  1. C&plus;&plus; 的二进制语法与语义

    /* 转载请注明出处:http://www.cnblogs.com/Martinium/p/binary_literal.html */ 二进制的语法 C/C++ 默认数字使用十进制,八进制使用前缀 ...

  2. &lbrack;转&rsqb;解决GET请求时中文乱码的问题

    原文地址:http://www.cnblogs.com/liukemng/p/4178882.html 之前项目中的web.xml中的编码设置: <filter> <filter-n ...

  3. Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文主要介绍一个支持图片自动预取.支持多种缓存算法的图片缓存的使用及功能.图片较大需要SD卡保存情况推荐使用ImageSDCardCache. 与Android LruCache相比主要特性:(1). ...

  4. mysql备份脚本

    [root@AY130828161048465847Z ~]# vi mysqlbak.sh #!/bin/bash USERNAME=rootPASSWORD=mysqlDBNAME=test DA ...

  5. Composer 常用命令总结(三)

    init(初始化) 该命令用于创建 composer.json 文件,并进行基础信息配置: $ composer init 可以配置Package name.Description.Author.Mi ...

  6. js禁止选中&lpar;网页复制&rpar;

    document.onselectstart=new Function("event.returnValue=false");//禁止选中(无法复制) document.oncon ...

  7. Linux命令yum和rpm

    yum命令使用 可以简化软件安装命令 yum可以做软件的 1自动安装,安装软件的时候会自动安装需要的依赖 yum install 软件名如安装epel源yum install epel-release ...

  8. js 操作select和option常用代码整理

    1.获取选中select的value和text,html代码如下: <select id="mySelect"> <option value="1&qu ...

  9. 转:C&num;访问修饰符

    http://www.cnblogs.com/netlyf/archive/2009/12/13/1623103.html

  10. 蒙特卡罗树搜索(MCTS)【转】

    简介 最近AlphaGo Zero又火了一把,paper和各种分析文章都有了,有人看到了说不就是普通的Reinforcement learning吗,有人还没理解估值网络.快速下子网络的作用就放弃了. ...