Who Gets the Most Candies? POJ - 2886 (线段树)
按顺时针给出n个小孩,n个小孩每个人都有一个纸,然后每个人都有一个val,这个val等于自己的因子数,如果这个val是正的,那就顺时针的第val个孩子出去,如果是负的话,就逆时针的第val个孩子出去,所以可以用线段树维护一个区间内的孩子数,然后找到下一个孩子是这些人里的第k个人,用线段树找到剩下的第k个人的位置,然后把这个地方更新成0,这样模拟过程.
反素数:反素数就是从区间1 - i 内的数的因子数都比 i 的因子数少的数,这题中因为同样的val值时选择出队早的人,其实就是1-n内的最大反素数m,就说明是第m个人的因子数是最大的,然后我只需要模拟前m次就可以了
#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define first fi
#define second se
#define lowbit(x) (x & (-x)) typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = ;
const int maxm = ;
using namespace std; int n, m, tol, T;
struct Node {
char name[];
int k;
};
Node node[maxn];
int sum[maxn << ];
int RPrime[]= {
,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,, }; int fact[]= {
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,
}; void pushup(int root) {
sum[root] = sum[root << ] + sum[root << | ];
} void build(int left, int right, int root) {
if(left == right) {
sum[root] = ;
return ;
}
int mid = (left +right) >> ;
build(left, mid, root << );
build(mid+, right, root << | );
pushup(root);
} int update(int left, int right, int k, int root) {
if(left == right) {
sum[root]--;
return left;
}
int mid = (left + right) >> ;
int ans;
if(sum[root << ] >= k) ans = update(left, mid, k, root << );
else ans = update(mid+, right, k-sum[root << ], root << | );
pushup(root);
return ans;
} int main() {
int k;
while(~scanf("%d%d", &n, &k)) {
for(int i=; i<=n; i++)
scanf("%s%d", node[i].name, &node[i].k);
build(, n, );
int ansnum;
for(int i=; RPrime[i]<=n; i++) {
m = RPrime[i];
ansnum = fact[i];
}
tol = n;
int pos;
for(int i=; i<=m; i++) {
tol--;
pos = update(, n, k, );
if(tol == ) break;
if(node[pos].k > )
k = ((k + node[pos].k - ) % tol + tol) %tol + ;
else
k = ((k + node[pos].k - ) % tol + tol) % tol + ; }
printf("%s %d\n", node[pos].name, ansnum);
}
return ;
}
/*
7 3
a 3
b 2
c -5
d 4
e 8
f 2
g -6
*/
Who Gets the Most Candies? POJ - 2886 (线段树)的更多相关文章
- poj 2886 线段树+反素数
Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12744 Acc ...
- poj 2886 (线段树+反素数打表) Who Gets the Most Candies?
http://poj.org/problem?id=2886 一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左 ...
- POJ 2886 线段树单点更新
转载自:http://blog.csdn.net/sdj222555/article/details/6878651 反素数拓展参照:http://blog.csdn.net/ACdreamers/a ...
- poj 2886 线段树的更新+反素数
Who Gets the Most Candies? Time Limit: 5000 MS Memory Limit: 0 KB 64-bit integer IO format: %I64d , ...
- (中等) 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 ...
- Who Gets the Most Candies? POJ - 2886(线段树单点更新+区间查询+反素数)
预备知识:反素数解析 思路:有了反素数的解法之后就是线段树的事了. 我们可以用线段树来维护哪些人被淘汰,哪些人没被淘汰,被淘汰的人的位置,没被淘汰的人的位置. 我们可以把所有人表示为一个[1,n]的区 ...
- 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 ...
- POJ 2828 线段树(想法)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 15422 Accepted: 7684 Desc ...
随机推荐
- jquery on绑定事件
描述:给一个或多个元素(当前的或未来的)的一个或多个事件绑定一个事件处理函数.(1.7版本开始支持,是 bind().live() 和 delegate() 方法的新的替代品) 语法:.on( eve ...
- Latex常用
插入罗马数字 \newcommand{\RNum}[1]{\uppercase\expandafter{\romannumeral #1\relax}} 然后在正文里面就可以用\RNum{}来添加罗马 ...
- taro实战1
npm install -g @tarojs/cli //或 yarn global add @tarojs/cli
- 名称空间2.0path
Django 1点几跟2点几的区别 2.0path 是什么路径就是什么路径.第一个参数不再是正则表达式. 转换器 path的分组 <int:year> 匹配正整数 <str:year ...
- 使用synchronized 实现ReentrantLock(美团面试题目)
刚看到这个题目的时候无从下手,因为觉得synchronized和lock在加锁的方式上有很大不同,比如,看看正常情况下synchronized时如何加锁的. 方式一: public synchroni ...
- echo显示颜色
如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ [;;34m hello aaron \[0m”
- QTP自动化测试-笔记 注释、大小写
1 rem 注释内容 2 ' 注释内容 3 快捷键注释-选择代码行-ctrl+M 4 ctrl+shift+同- 取消注释 大小写 qtp:对小写敏感:如果 变量.sheet页是用小写字母命名,则使用 ...
- 错误模块名称: KERNELBASE.dll
部署win服务时,经常会出现类似下面的错误,错误模块名称: KERNELBASE.dll. 日志名称: Application 来源: Application ...
- git和svn的區別
https://blog.csdn.net/bmicnj/article/details/78413058
- C 语言----- 指针
指针是一个值为内存地址的变量, 指针的核心是它是一个变量, 只不过它是用来存放内存地址的, 所以在了解指针之前,先说一下什么是变量.变量就是在内存中开辟的一个空间.如int year, 就是在内存中开 ...