POJ 2886 Who Gets the Most Candies?
思路:
对于 k 位置的 孩子,他的 数字是 +num 那么因为他自己本身是要被踢走的,所以相对位置 为k= k+num-1
如果数字是 -num,那么按正着数就没影响,k=k-num。线段树存储当前区间共有多少个人,每一次找到第k (前面有k-1个)个孩子,经过的区间都要 -1,然后记录被踢走的孩子编号
对于第几个出去是最优可以预处理,网上看到了反素数,反素数 是 如果一个数 x 所有 y<x的 y的因子都小于x则称x为反素数,很明显就是小于n的最大的反素数就是我们要的答案。反素数可以预处理打表。
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include <iostream>
#define N 500050
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define debug(x) printf(#x"= %d\n",x);
using namespace std;
struct node
{
char s[];
int va;
}s[N];
int cprim[] = {,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
int fac[] = {,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
int sum[N*];
void build(int l,int r,int i)
{
sum[i]=r-l+;
if(l!=r)
{
int mid=(l+r)>>;
build(l,mid,L(i));
build(mid+,r,R(i));
}
}
int update(int l,int r,int p,int i)
{
sum[i]--;
if(l==r)
return l;
int mid=(l+r)>>;
if(p<=sum[L(i)])
return update(l,mid,p,L(i));
else return update(mid+,r,p-sum[L(i)],R(i));
}
int main() {
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=;i<=n;++i)
scanf(" %s %d",s[i].s,&s[i].va);
build(,n,);
s[].va=;
int now=;
while(cprim[now]<=n)now++;
now--;
int pre=;
for(int i=;i<=cprim[now];++i)
{
if(s[pre].va>)
{
k=(k+s[pre].va-)%sum[];
if(k<=)k+=sum[];
}else
{
k=(k+s[pre].va)%sum[];
if(k<=)k+=sum[];
}
// debug(k);
pre=update(,n,k,);
}
printf("%s %d\n",s[pre].s,fac[now]);
}
return ;
}
POJ 2886 Who Gets the Most Candies?的更多相关文章
- 线段树(单点更新) POJ 2886 Who Gets the Most Candies?
题目传送门 #include <cstdio> #include <cstring> #define lson l, m, rt << 1 #define rson ...
- poj 2886 Who Gets the Most Candies?(线段树和反素数)
题目:http://poj.org/problem?id=2886 题意:N个孩子顺时针坐成一个圆圈且从1到N编号,每个孩子手中有一张标有非零整数的卡片. 第K个孩子先出圈,如果他手中卡片上的数字A大 ...
- POJ 2886 Who Gets the Most Candies? 线段树
题目: http://poj.org/problem?id=2886 左右转的果断晕,题目不难,关键是准确的转啊转.因为题目要求输出约数个数最多的数,所以预处理[1,500000]的约数的个数就行了. ...
- POJ 2886 Who Gets the Most Candies? (线段树)
[题目链接] http://poj.org/problem?id=2886 [题目大意] 一些人站成一个圈,每个人手上都有一个数字, 指定从一个人开始淘汰,每次一个人淘汰时,将手心里写着的数字x展示 ...
- (中等) POJ 2886 Who Gets the Most Candies? , 反素数+线段树。
Description N children are sitting in a circle to play a game. The children are numbered from 1 to N ...
- POJ 2886.Who Gets the Most Candies? -线段树(单点更新、类约瑟夫问题)
线段树可真有意思呢续集2... 区间成段的替换和增减,以及区间求和等,其中夹杂着一些神奇的操作,数据离散化,简单hash,区间异或,还需要带着脑子来写题. 有的题目对数据的操作并不是直接按照题面意思进 ...
- 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?(反素数+线段树)
点我看题目 题意 :n个小盆友从1到n编号按顺时针编号,然后从第k个开始出圈,他出去之后如果他手里的牌是x,如果x是正数,那下一个出圈的左手第x个,如果x是负数,那出圈的是右手第-x个,游戏中第p个离 ...
- POJ 2886 Who Gets the Most Candies? 线段树。。还有方向感
这道题不仅仅是在考察线段树,还他妹的在考察一个人的方向感.... 和线段树有关的那几个函数写了一遍就对了,连改都没改,一直在转圈的问题的出错.... 题意:从第K个同学开始,若K的数字为正 则往右转, ...
随机推荐
- uiZjs入门
具体基础的用法,可先看下这个文件做下了解,地址:http://files.cnblogs.com/dachuang/uizjs.rar 请先看完上面的文件,不然下面的可能看不懂,当然你要是之前了解过的 ...
- paoracle中的包头(Package)与包体(Package body)
http://www.th7.cn/db/Oracle/201406/56949.shtml 简单的实例 create or replace package body integrationEgoTo ...
- CentOS 7 下的软件安装建议
https://seisman.info/how-to-install-softwares-under-centos-7.html https://seisman.info/linux-environ ...
- Java编程思想笔记
打好java基础 后续会增加相应基础笔试题 目录如下 1 对象导论2 一切都是对象3 操作符4 控制执行流程5 初始化与清理6 访问控制权限7 复用类8 多态9 接口10 内部类11 持有对象12 通 ...
- 关于Split方法
String a="1000,"; String[] b=a.split(","); System.out.println(b); 关于以上代码,b中只有一个元 ...
- 【spring-quartz】 定时调度,时间设置
. CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 ...
- iOS开发 自定义窗口 以及 点击scrollView置顶
static UIWindow *topWindow_; static UIScrollView *scrollView_; /** * 显示顶部窗口 */ + (void)show { dispat ...
- No resource found that matches the given name 'Theme.AppCompat.Light'
eclipse在新建andorid工程的时候出现找不到AppCompat.Light主题的问题,这是因为缺少支持低版本的v7包所致, 这个不是jar包,在sdk的extras->andorid- ...
- 经验解决Fragment被Replace后仍旧可见的问题
经验解决Fragment被Replace后仍旧可见的问题 网上问的问题,大多会提到替换了Fragment而发现之前被替换的仍旧显示在那里.我个人使用android 2.3 +support 开发包,在 ...
- java 集合(Map2)
Map 接口的迭代方法: import java.util.*; public class ex12 { public static void main(String[] args) { Map< ...