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个孩子出去, ...
随机推荐
- [转]日期格式化(yyyy-MM-dd)中,为什么 M 多大写?
最近犯了个可傻逼的错误,格式化年月日的时候不小心将yyyy-MM-dd写成YYYY-MM-dd,导致格式化结果中年不正确. 看看知乎上的说法 问题: http://www.zhihu.com/ques ...
- 用wget实现cookie欺骗
用wget实现cookie欺骗 . 分析登录界面的html代码 页面在 http://bbs.linuxeden.com/ <form. id="loginform" met ...
- 全自动化的 Android 编译管线
[编者按]Nicolas Frankel 是 hybris 的高级顾问, 在Java / J2EE 领域拥有超过10年的管理经验,本文阐述了他在使用自动化工序去构建 Android 应用程序遇到的一些 ...
- Delphi中有序型
有序类型包括:.integer(整型).character(字符型).boolean(布尔型).enumerated(枚举型).subrange(子界型)有序类型定义了一组被排序的值.每个相异值都有唯 ...
- 学生信息管理 --- c语言实现
第一次写比较大的程序,昨晚看了 大话数据结构 有感-----同样求 1+2+3+4+...+100,我则是简单的从1+2+3+4+...+100. 而不是 (1+100) / 2 * 100;(高 ...
- linux 安装python,pip,
Linux下python升级步骤 http://www.cnblogs.com/lanxuezaipiao/archive/2012/10/21/2732864.html 在 https://www. ...
- Linux多线程之同步
引言 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待条件变量的条件成立而挂起(此时不再占用cpu):另一个线程使条件成立(给出条件成立信号).为了防止竞争,条件变 ...
- ios开发解决遍历删除数组对象报错
// 删除对应数据 // for (OrderModel *order in self.OrderList) { // // ...
- Java-在线聊天系统-非线程
一.概述 1.目标:建立基于tcp协议的聊天系统 2.思路:用java socket编程 二.代码 1.ChatServer.java import java.io.DataInputStream; ...
- 关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
对于模态非模态对话框默认是不响应菜单的UPDATE_COMMAND_UI消息的,需要增加对WM_INITMENUPOPUP消息的处理以后,才可以响应UPDATE_COMMAND_UI. void CX ...