POJ (线段树) Who Gets the Most Candies?
这道题综合性挺强的,又牵扯到数论,又有线段树。
线段树维护的信息就是区间中有多少个人没跳出去,然后计算出下一个人是剩下的人中第几个。
我在这调程序调了好久,就是那个模来模去的弄得我头晕。
不过题确实是好题,给赞。
#include <cstdio>
#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
using namespace std; const int maxn = + ;
int n, k;
int sum[maxn << ]; void build(int o, int L, int R)
{
if(L == R) { sum[o] = ; return; }
int M = (L + R) / ;
build(o*, L, M);
build(o*+, M+, R);
sum[o] = sum[o*] + sum[o*+];
} int update(int o, int L, int R, int p)
{
if(L == R) { sum[o] = ; return L; }
int M = (L + R) / ;
int ans;
if(sum[o*] >= p) ans = update(o*, L, M, p);
else ans = update(o*+, M+, R, p-sum[o*]);
sum[o] = sum[o*] + sum[o*+];
return ans;
} const int maxp = ;
int prime[maxp], pcnt = ;
bool vis[maxp]; void prime_table()
{
int m = sqrt(maxp);
for(int i = ; i <= m; i++) if(!vis[i])
for(int j = i * i; j < maxp; j += i) vis[j] = true;
for(int i = ; i < maxp; i++) if(!vis[i]) prime[pcnt++] = i;
} int F(int n)
{
int ans = ;
for(int i = ; i < pcnt && n > ; i++) if(n % prime[i] == )
{
int c = ;
while(n % prime[i] == ) { n /= prime[i]; c++; }
ans *= c + ;
}
if(n > ) ans <<= ;
return ans;
} int next[maxn];
char stu[maxn][]; int main()
{
//freopen("in.txt", "r", stdin); prime_table(); while(scanf("%d%d", &n, &k) == )
{
build(, , n - );
int _max = , id;
for(int i = ; i < n; i++) { scanf("%s%d", stu[i], &next[i]); } int pos = k - ;
for(int i = ; i <= n; i++)
{
int t = update(, , n - , pos + );
int f = F(i);
if(f > _max)
{
_max = f;
id = t;
}
if(i == n) break;
int MOD = n - i;
if(next[t] < ) next[t]++; //负数的情况还要有一点小改动,在这坑了好久
pos = (((pos + next[t] - ) % MOD) + MOD) % MOD;
}
printf("%s %d\n", stu[id], _max);
} return ;
}
代码君
POJ (线段树) Who Gets the Most Candies?的更多相关文章
- POJ 2886Who Gets the Most Candies?(线段树)
POJ 2886 题目大意是说有n个人围成一圈,游戏的起点是k,每个人持有一个数字(非编号)num,每次当前的人退出圈,下一个人是他左边的第num个(也就是说下一个退出的是k+num, k可以为负数, ...
- (中等) 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?
http://poj.org/problem?id=2886 一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左 ...
- POJ 2886.Who Gets the Most Candies? -线段树(单点更新、类约瑟夫问题)
线段树可真有意思呢续集2... 区间成段的替换和增减,以及区间求和等,其中夹杂着一些神奇的操作,数据离散化,简单hash,区间异或,还需要带着脑子来写题. 有的题目对数据的操作并不是直接按照题面意思进 ...
- POJ 2886 Who Gets the Most Candies? (线段树)
[题目链接] http://poj.org/problem?id=2886 [题目大意] 一些人站成一个圈,每个人手上都有一个数字, 指定从一个人开始淘汰,每次一个人淘汰时,将手心里写着的数字x展示 ...
- 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的数字为正 则往右转, ...
- Who Gets the Most Candies? POJ - 2886 (线段树)
按顺时针给出n个小孩,n个小孩每个人都有一个纸,然后每个人都有一个val,这个val等于自己的因子数,如果这个val是正的,那就顺时针的第val个孩子出去,如果是负的话,就逆时针的第val个孩子出去, ...
随机推荐
- 15 个最佳的 jQuery 表格插件
现如今,网站开发设计的需求会要求自动适应所有移动设备,即响应式网站: 在开发网站时必须考虑对平板设备融合 fluid(流)和自适应性特点. 大多数网站设计要靠margins, guides, rows ...
- 由浅入深了解Thrift之服务模型和序列化机制
一.Thrift介绍 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎.其允许你定义一个简单的定义文件中的数据类型和服务接口.以作为输入文件,编 ...
- iOS第三方语音-讯飞语音
官方网站:http://www.xfyun.cn/ 注册还要绑定微信,坑啊,识别率感觉没得微信语音好,但是微信语音审核一直不过,研究下这个 1.下载sdk,主要就下面几个文件,我主要用的是语音识别
- iOS多线程的初步研究(九)-- dispatch源
dispatch源(dispatch source)和RunLoop源概念上有些类似的地方,而且使用起来更简单.要很好地理解dispatch源,其实把它看成一种特别的生产消费模式.dispatch源好 ...
- VMware 使用
1.客户操作系统被禁用: BIOS中开启VT(Virtual Technology)
- QTP 参数化
PS:方法内容是转的别人的,我们项目中只用到了方法三,主要用于将测试数据与业务分离,增强测试数据的可维护性. 方法一.DataTable方法 这是QTP提供的一种方法,也是最容易实现参数化的一种方式. ...
- Spark基础与Java Api介绍
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3832405.html 一.Spark简介 1.什么是Spark 发源于AMPLab实验室的分布式内存计 ...
- lintcode:完美平方
题目 给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n.你需要让平方数的个数最少. 样例 给出 n = 12, 返回 3 因为 12 = 4 + 4 + ...
- IOS中表视图(UITableView)使用详解
IOS中UITableView使用总结 一.初始化方法 - (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)styl ...
- Java笔记——面向接口编程(DAO模式)
1.DAO模式 DAO(Data Access Object)模式就是写一个类,把访问数据库的代码封装起来.DAO在数据库与业务逻辑(Service)之间. l 实体域,即操作的对象,例如 ...