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 ...
随机推荐
- C++ 关于 CMFCPropertyGridCtrl 的使用方法 之一 (原创)
题外话: 最近在写一个重要的程序,想做的更灵活一些,于是想采用属于对话框的形式,如图所示 但查了好几本大部门的C++及MFC的书,还有很多的网上的资料,这方面的介绍实在是少之又少.不过,好在VS201 ...
- Android辅助开发工具说明
1.aapt(Android Asset Packaging Tool):用于建立zip包(zip.jar.apk),也可用于将资源编译到二进制的assets:2.adb(Android Debug ...
- Vue 中select option默认选中的处理方法
在做泰康项目的时候有个需求就是要给select默认选中的样式我的处理方法有两个 1.直接将默认值给 selectedOption <select v-model="selectedO ...
- 使用AJAX实现文件上传时Illegal invocation错误
在参数里面加 processData:false, 就行了
- 使用Java实现对一个数组的增删改查以及初始化
import java.util.*; import java.lang.*; public class Array { private int[] data;// 数组 private int si ...
- 解题6(OutputNMin)
题目描述 输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int * pInputArray, unsign ...
- J_link重刷固件
第一步:上电短接ERS 第二步:上电短接TST (擦除原来的固件) 完成上面两步后,再连接电脑,电脑将出现正常的串口连接 第三步:(烧固件) 在SAM-BA xxx固件烧写选好芯片类型,连接 ...
- Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)
需求:将java类名.方法.方法参数当做参数传递,执行方法.可以用java的动态加载实现 反射的过程如下: 第一步:通过反射找到类并创建实例(classname为要实例化的类名,由pack ...
- shell重定向命令执行顺序
重定向内容介绍 一条shell命令的执行包含三个文件描述符:标准输入(键盘等) stdin 0,标准正确输出(屏幕等) stdout 1,标准错误输出(屏幕等)stderr 2 通过重定向可以指定 ...
- Android 7.0解决抓取不到https请求的问题
问题:Android7.0系统,使用fiddler不能抓取https请求 解决方法: 1.在源码res目录下新建xml目录,增加network_security_config.xml文件 (工程名/ ...