POJ_2886 Who Gets the Most Candies? 【二分+树状数组】
一、题目
二、分析
这个题目吧,开始没读懂,做的时候也没懂,WA的时候懂了。假设是第p个出圈的人有一个对应的因子个数$F(p)$,那么,题目求的就是这个$F(p)$最大的对应的人。
1.首先要对所有$F(p)$值进行预处理打表。因为多次询问。
2.每次都会有一个人出圈,那么为了能够每次方便的查到(新圈)第K个人的下标,需要对出圈的人进行处理,这里可以用树状数组,表示第pos个位置前还有多少个人在,如果不在,就对树状数组进行维护。需要注意的是树状数组需要初始化,即开始的时候每个人都是在自己的位置上的。
3.确定K,确定K的时候,思路比较绕,画个图就明白了。总结一下,就是对于当前位置pos,对应的是当前圈的第K个人,那么下一时刻,他就出圈了。
如果是他手里的数字是正,那么相当于从旧圈的第K-1个人开始考虑。
如果手里的数字是负,因为新圈里,第K个人的位置被前一个圈的 K + 1个人顶替了,所以不用管。
然后取余就可以了,注意细节就行。
4.第K个人确定了,那么就需要找了,利用BIT的求和直接二分找就可以了。这里要注意找的是$F(p)$最大值对应的人。(最开始就是没注意这个WA了好多次)
三、AC代码
#include <cstdio>
#include <iostream>
#include <cstring> using namespace std; const int MAXN = 5e5 + ; struct Node
{
char s[];
int num;
}Data[MAXN]; int BIT[MAXN];
int Prime[MAXN] = {};
int N, K, Ans, ID; void getPrime()
{
for(int i = ; i < MAXN; i++)
{
for(int j = i; j < MAXN; j += i)
{
Prime[j]++;
}
}
} void add(int x, int v)
{
while(x <= MAXN)
{
BIT[x] += v;
x += x & -x;
}
} int sum(int x)
{
int ans = ;
while(x)
{
ans += BIT[x];
x -= x & -x;
}
return ans;
} int getPos(int t)
{
int left = , right = N, mid;
while(left + < right)
{
mid = (left + right) >> ;
if(sum(mid) < t)
left = mid;
else
right = mid;
}
return right;
} void solve()
{
int pos, temp;
for(int i = N - ; i > ; i--)
{
pos = getPos(K);
add(pos, -);
temp = Prime[N - i];
if(Ans < temp)
{
Ans = temp;
ID = pos;
}
if(Data[pos].num > )
{
K--;
}
K += Data[pos].num;
K = (K%i + i) % i;
if(K == )
K = i;
}
K = getPos(K);
temp = Prime[N];
if(Ans < temp)
{
Ans = temp;
ID = K;
} } int main()
{
//freopen("input.txt", "r", stdin);
getPrime();
while(scanf("%d %d", &N, &K) != EOF)
{
memset(BIT, , sizeof(BIT));
for(int i = ; i <= N; i++)
{
add(i, );
scanf("%s %d", Data[i].s, &Data[i].num);
}
Ans = ;
solve();
printf("%s %d\n", Data[ID].s, Ans);
}
return ;
}
POJ_2886 Who Gets the Most Candies? 【二分+树状数组】的更多相关文章
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)
https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- zoj-3963 Heap Partition(贪心+二分+树状数组)
题目链接: Heap Partition Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge A sequence ...
- 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组
题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- [ZJOI2006]书架(二分+树状数组)
这题90%以上的人做法为裸的平衡树,实际上根本没必要还常数大,最好的方法是二分+树状数组.具体做法是,开3倍内存,初始把中间n位赋值为1.对于每个操作:1&2.删除该位,将其丢在头/尾(开三倍 ...
随机推荐
- SecureCRT 下MySQL中文乱码问题终极解决方案-乾颐堂
一.查看Linux主机系统字符集 命令: echo $LANG [root@pythontab.com ~]# echo $LANG [root@pythontab.com ~]# en_US.UTF ...
- mysql 字符串操作
-- 字符串的长度 SELECT LENGTH('abc'),LENGTH('我的家'); SELECT CHAR_LENGTH('abc'),CHAR_LENGTH('我的家'); -- 合并字符串 ...
- HDU 6097 Mindis (计算几何)
题意:给一个圆C和圆心O,P.Q是圆上或圆内到圆心距离相等的两个点,在圆上取一点D,求|PD| + |QD|的最小值 析:首先这个题是可以用三分过的,不过也太,.... 官方题解: 很不幸不总是中垂线 ...
- js流程图:aworkflow.js
auto-workflow 用于快速构建各种关系图的库 github地址:https://github.com/auto-workflow/AWorkflow 快速开始 npm install awo ...
- mybaits foreach
<select id="selectQuickConsultDoctorList" resultMap="BaseResultMap" parameter ...
- BZOJ 2038 小z的袜子(莫队)
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- imagelist用法
1.添加一个Imagelist控件,并双击控件图标如下图 2.点击新增按钮
- XE5安卓手机要求
1 ARMv7 的 CPU v6 的肯定不支持.2 黑屏是因为你的手机 CPU 不支持 NEON 特性.或者是 T2 CPU.3 系统版本 2.3.3 到 2.3.9 或者 4.0 以上.4. SD ...
- mvc权限验证--AuthorizeAttribute
在做后台管理时用户登录后就需要验证哪些权限了,没有登录的就直接退出到登录页面. 系统有自带的权限[Authorize],可用于几个地方: 1.将属性[Authorize]置于相关的action上方,验 ...
- centos7 守护进程
ASP.NET Core应用程序发布linux在shell中运行是正常的.可一但shell关闭网站也就关闭了,所以要配置守护进程, 用的是Supervisor,本文主要记录配置的过程和过程遇到的问题 ...