POJ2886Who Gets the Most Candies?(线段树之约瑟夫)
约瑟夫问题的升级版,每次出去的是前一个出去的人位置+手上的数字(正往前,负往后)。第i个出去的人拿的糖是i的约数的个数。求拿糖最多的人和他的糖果数。
这里用到了反素数的知识,在这直接打表
AC代码:
#include<stdio.h>
#include<string.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 const int N = ;
int v[N],sum[N<<],n,k;
char name[N][];
int rprim[]= {,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,};///反素数
int nprim[]= {,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,};///反素数的约数个数
void build(int l,int r,int rt)
{
sum[rt]=r-l+;///sum储存这个区间有多少的数
if(l<r)
{
int m=(l+r)>>;
build(lson);
build(rson);
}
}
int update(int l,int r,int rt,int k)
{
sum[rt]--;///这个区间减少一个数
if(l==r)
return l;///返回这个减少的数的原始下标
int m=(l+r)>>;
if(k<=sum[rt<<])///要找的第k个数小于等于左半区间的个数
return update(lson,k);///就递归左子树
else
return update(rson,k-sum[rt<<]);///否则就在右子树,且k-左子树的个数
}
int main( )
{
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(name,,sizeof(name));
for(int i= ; i<=n ;i++)
scanf("%s%d",name[i],&v[i]);
build(,n,);
int tn=n,now,p=;
while(rprim[p]<=n)///找出n里最大的反素数
p++;
for(int i= ; i<rprim[p-] ; i++)///反素数前的都出队
{
now=update(,n,,k);///当前出队的序号
tn--;///剩下的人数
if(v[now]>)///向前数
k=(k-+v[now])%tn;///先减去本身这个位置 然后往前v个 再取模
else
k=((k+v[now])%tn+tn)%tn;///直接往后 然后要取模再取模保证正数
if(k==)///如果刚好是tn 取模会变成0
k=tn;
}
now=update(,n,,k);///得到第最大的反素数个出队的人的序号
printf("%s %d\n",name[now],nprim[p-]);
}
return ;
}
不懂反素数的可以点击此链接:反素数
POJ2886Who Gets the Most Candies?(线段树之约瑟夫)的更多相关文章
- POJ 2886 Who Gets the Most Candies?(线段树·约瑟夫环)
题意 n个人顺时针围成一圈玩约瑟夫游戏 每一个人手上有一个数val[i] 開始第k个人出队 若val[k] < 0 下一个出队的为在剩余的人中向右数 -val[k]个人 val[k ...
- POJ 2886.Who Gets the Most Candies? -线段树(单点更新、类约瑟夫问题)
线段树可真有意思呢续集2... 区间成段的替换和增减,以及区间求和等,其中夹杂着一些神奇的操作,数据离散化,简单hash,区间异或,还需要带着脑子来写题. 有的题目对数据的操作并不是直接按照题面意思进 ...
- POJ2886 Who Gets the Most Candies? 线段树 反素数
题意:有一群小朋友围成一个环,编号1,2,3…N.每个人手上握着一个非0的数字,首先第K个人出列,然后看他手上的数字,假设为m,则从下一个开始第m个人出列,一直如此.并设i为小于等于N的最大反素数,问 ...
- POJ 2886 Who Gets the Most Candies? 线段树。。还有方向感
这道题不仅仅是在考察线段树,还他妹的在考察一个人的方向感.... 和线段树有关的那几个函数写了一遍就对了,连改都没改,一直在转圈的问题的出错.... 题意:从第K个同学开始,若K的数字为正 则往右转, ...
- POJ-2886 Who Gets the Most Candies?---线段树+约瑟夫环
题目链接: https://cn.vjudge.net/problem/POJ-2886 题目大意: N个人围成一圈第一个人跳出圈后会告诉你下一个谁跳出来跳出来的人(如果他手上拿的数为正数,从他左边数 ...
- 【POJ2886】Who Gets the Most Candies?-线段树+反素数
Time Limit: 5000MS Memory Limit: 131072K Case Time Limit: 2000MS Description N children are sitting ...
- POJ 2886 Who Gets the Most Candies? 线段树
题目: http://poj.org/problem?id=2886 左右转的果断晕,题目不难,关键是准确的转啊转.因为题目要求输出约数个数最多的数,所以预处理[1,500000]的约数的个数就行了. ...
- 1521. War Games 2(线段树解约瑟夫)
1521 根据区间和 来确定第k个数在哪 #include <iostream> #include<cstdio> #include<cstring> #inclu ...
- lightoj 1179(线段树)
传送门:Josephus Problem 题意:经典约瑟夫问题,有n个人,每次数到第k个人出列,求剩下的最后一人. 分析:用线段树模拟约瑟夫问题,记录区间的减少情况,然后根据每次数到的人在区间排第几位 ...
随机推荐
- BST树、B-树、B+树、B*树
BST树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: ...
- MSSQL grant权限
--创建登录名 create login test_user with password='123456a.'; --创建用户 create user test_user for login test ...
- 在JAVA中,String,Stringbuffer,StringBuilder 的区别
首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String 不是线程安全的,这意味着在不同线程共享一个String ...
- java 类中 static 的使用
在类中 static 主要修饰变量,方法及代码块.大致的执行和使用,据个人理解如下: 1.修饰变量: 在修饰变量时,如 ,表示该变量是静态变量,也可称为类变量.当当前变量是静态变量时,该变量被该类的所 ...
- 吐槽下linq to sql的分页功能
在调试程序的时候发现一个非常奇怪的问题: 用使用linq分页,分页到第二页的时候,第二页里面有第一页里出现的数据,开始还以为是. linq语句写的有问题,调试半天,无解.后来发现是因为没有排序的缘故. ...
- linux 监控内存介绍
一:系统监控:1.对cpu的监测:查看进程占用内存情况 top pid user PRI NI size RSS share stat 进程号 进程所属用户 优先级 优先级 进程所占空间 使用物理内存 ...
- Spring_02 注入类型值、利用引用注入类型值、spring表达式、与类相关的注解、与依赖注入相关的注解、注解扫描
注意:注入基本类型值在本质上就是依赖注入,而且是利用的set方式进行的依赖注入 1 注入基本类型的值 <property name="基本类型的成员变量名" value=&q ...
- Elasticsearch - glossary
From http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/glossary.html glossary of ...
- Linux-shell获取天气
用Linux中的shell获取天气,本来觉的比较难,原来,真简单,个位数的代码就搞定. 获取对应城市天气 所有天气信息都从中国天气网获取.每一个城市多会对应一个id(比如,北京为101010100,因 ...
- Struts2返回JSON数据的具体应用范例
早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具体应用了,但苦于一直忙于工作难以抽身,渐渐的也淡忘了此事.直到前两天有同事在工作中遇到这个问题,来找 ...