poj 2886 (线段树+反素数打表) Who Gets the Most Candies?
http://poj.org/problem?id=2886
一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左边(顺时针)开始第m个孩子出去,如果是负的
那么从他的右边(也就是逆时针)开始第m个孩子出去~~~一直到所有的孩子出去,另外,第p个出去的孩子可以得到的糖果数量是p的约数个数,问能得到最多糖果的孩子的名字和得到的糖果数目
关于公约数最多的问题,可以利用到反素数,可以首先先打表反素数和对应的约数个数,找出约数最多的次数p,p肯定是不大于n的,然后就是模拟孩子出去的情况,只要模拟p次就行
然后用线段树模拟,与上一题插队差不多,记录下每个区间的人数,每次的顺序k表示第k个有人的区间更新为空
code
#include<cstdio>
using namespace std;
struct point {
int l,r;
int mark;//记录每个区间人数
};
point tree[*];
char jjc[][];
int a[],pos;
int prime[]={ //反素数
,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,, };
int numb[]={ //对应的约数个数
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,
};
void build (int i,int left,int right)
{
tree[i].l=left,tree[i].r=right;
tree[i].mark=tree[i].r-tree[i].l+;
if (left==right) { return ;}
int mid=(left+right)/;
build(i*,left,mid);
build(i*+,mid+,right);
}
void update(int i,int ans)
{
if (tree[i].l==tree[i].r)
{
pos=tree[i].l;
tree[i].mark--;
return ;
}
if (ans<=tree[i*].mark)
update(i*,ans);
else
update(i*+,ans-tree[i*].mark);
tree[i].mark=tree[i*].mark+tree[i*+].mark;
}
int main()
{
int n,k,i,w,m;
while (scanf("%d %d",&n,&k)==)
{
for (i=;i<=n;i++)
scanf("%s %d",&jjc[i],&a[i]);
build(,,n);
w=;
for(i=;prime[i]<=n;i++)w=i;
pos=;m=prime[w];
a[]=;
while (m--)
{
int num=tree[].mark;
if (a[pos]>)
k=((k+a[pos]-)%num+num)%num+;
else
k=((k+a[pos]-)%num+num)%num+;
update(,k);
}
printf("%s %d\n",jjc[pos],numb[w]);
}
return ;
}
poj 2886 (线段树+反素数打表) Who Gets the Most Candies?的更多相关文章
- poj 2886 线段树+反素数
Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12744 Acc ...
- poj 2886 线段树的更新+反素数
Who Gets the Most Candies? Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , ...
- POJ2886 Who Gets the Most Candies? 线段树 反素数
题意:有一群小朋友围成一个环,编号1,2,3…N.每个人手上握着一个非0的数字,首先第K个人出列,然后看他手上的数字,假设为m,则从下一个开始第m个人出列,一直如此.并设i为小于等于N的最大反素数,问 ...
- POJ 2886 线段树单点更新
转载自:http://blog.csdn.net/sdj222555/article/details/6878651 反素数拓展参照:http://blog.csdn.net/ACdreamers/a ...
- 【POJ2886】Who Gets the Most Candies?-线段树+反素数
Time Limit: 5000MS Memory Limit: 131072K Case Time Limit: 2000MS Description N children are sitting ...
- Who Gets the Most Candies?(线段树 + 反素数 )
Who Gets the Most Candies? Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%I64d &am ...
- POJ 2828 线段树(想法)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 15422 Accepted: 7684 Desc ...
- poj 3468(线段树)
http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...
- POJ——3264线段树
题目: 输入两个数(m,n),m表示牛的头数,n表示查询的个数.查询时输入两个数(x,y),表示查询范围的起始值和终止值,查询结果是,这个区间内牛重量的最大值减去牛重量的最小值,数量级为1000,00 ...
随机推荐
- 给RabbitMQ发送消息时,设置请求头Header。
消费者的请求头 生产者设置请求头 由于消费者那里,@Payload是接受的消息体,使用了@Header注解,需要请求头,生产者这边就要设置请求头,然后rabbitTemplate再调用convertA ...
- NFS 网络文件系统制作
1. 构建根文件系统主要是建立相关的文件目录,以及各目录下相关的配置文件.管理工具等. 2. 首先创建文件目录. mkdir rootfs cd rootfs mkdir bin dev etc li ...
- zookeeper 集群配置采坑 Connection refused WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@584] - Cannot open channel to 3 at election address slave2/192.168.127.133:3888
坑一: Cannot open channel to at election address slave1/ java.net.ConnectException: Connection refused ...
- Spring read-only="true" 只读事务的
概念:从这一点设置的时间点开始(时间点a)到这个事务结束的过程中,其他事务所提交的数据,该事务将看不见!(查询中不会出现别人在时间点a之后提交的数据) 应用场合: 如果你一次执行单条查询语句,则没有必 ...
- SpringMVC HttpMessageConverter
如StringHttpMessageConverter,read方法就是根据编码类型将HttpInputMessage中的数据变为字符串.write方法就是根据编码类型将字符串数据写入HttpOutp ...
- VBox添加虚拟磁盘挂载
1. 关闭虚拟机,然后在设置里面选择添加虚拟硬盘 2.lsblk检查存在10G sdb虚拟磁盘 fdisk -l 检查 /dev/sdb 尚没有分区 3.磁盘分区 4.检查分区状况lsblk 5.格式 ...
- Android学习路-Android Studio的工程目录
说明:下图为一个app的工程目录,如果在res下随便建立文件夹(比如test等名字)是不会显示在工程内的
- centos 7 搭建openvpn-2.4.6
参考:https://blog.csdn.net/weixin_42250094/article/details/80384863 http://www.startupcto.com/server-t ...
- Python compile() 函数
Python compile() 函数 Python 内置函数 描述 compile() 函数将一个字符串编译为字节代码. 语法 以下是 compile() 方法的语法: compile(sourc ...
- 贪吃蛇Global Java实现(二)
package cn.tcc.snake.util; public class Global {public static final int CELL_SIZE=20;public static f ...