POJ-2886 Who Gets the Most Candies?(线段树+模拟)
题目大意:n个小孩按顺时针站成一圈,每次会有一个小孩出队(第一个出队的小孩已知),在他出队时会指定下一个出队的小孩,直到所有的小孩全部出队游戏结束。第p个出队的小孩会得到f(p)个糖果,f(p)为p的正约数个数。问获得最多糖果的小孩是谁?并求出他获得的糖果数。如果有多解,只输出最先出队的那个小孩。
题目分析:先将1~n之内的具有最多约数个数并且最小的那个数打出来,然后模拟相应的次数操作即可。模拟时利用到线段树,用线段树维护区间中有多少个小孩还没有出队,每次出队一个小孩就将他在树中删除,最后利用线段树查询下一个应该出队的小孩。
代码如下:
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long const int N=500000; int f[N+5];
int tab[N+5];
int tr[N*4+5];
char p[N+5][12];
int next[N+5]; void init()
{
memset(tab,0,sizeof(tab));
for(LL i=1;i<=N;++i){
if(i*i<=N) ++tab[i*i];
for(LL j=i+1;i*j<=(LL)N;++j)
tab[i*j]+=2;
}
f[1]=1;
for(int i=2;i<=N;++i){
if(tab[i]>tab[f[i-1]])
f[i]=i;
else
f[i]=f[i-1];
}
} void makeTree(int rt,int l,int r)
{
if(l==r)
tr[rt]=1;
else{
int mid=l+(r-l)/2;
makeTree(rt<<1,l,mid);
makeTree(rt<<1|1,mid+1,r);
tr[rt]=tr[rt<<1]+tr[rt<<1|1];
}
} void update(int rt,int l,int r,int x)
{
if(l==r)
--tr[rt];
else{
int mid=l+(r-l)/2;
if(x<=mid) update(rt<<1,l,mid,x);
else update(rt<<1|1,mid+1,r,x);
tr[rt]=tr[rt<<1]+tr[rt<<1|1];
}
} int query1(int rt,int l,int r,int L,int R)
{
if(L>R) return 0;
if(L<=l&&r<=R)
return tr[rt];
else{
int res=0;
int mid=l+(r-l)/2;
if(L<=mid) res+=query1(rt<<1,l,mid,L,R);
if(R>mid) res+=query1(rt<<1|1,mid+1,r,L,R);
return res;
}
} int query2(int rt,int l,int r,int cnt)
{
if(l==r) return l;
int mid=l+(r-l)/2;
if(tr[rt<<1]>=cnt)
return query2(rt<<1,l,mid,cnt);
else
return query2(rt<<1|1,mid+1,r,cnt-tr[rt<<1]);
} int main()
{
init();
int n,k;
while(~scanf("%d%d",&n,&k))
{
for(int i=0;i<n;++i)
scanf("%s%d",p[i],&next[i]);
memset(tr,0,sizeof(tr));
makeTree(1,0,n-1);
int now=k-1;
for(int i=1;i<f[n];++i){
int l=query1(1,0,n-1,0,now-1);
int r=query1(1,0,n-1,now+1,n-1);
int nn;
if(next[now]>0)
nn=(l-1+next[now]+l+r)%(l+r);
else{
next[now]=-next[now];
next[now]%=(l+r);
nn=(l-next[now]+l+r)%(l+r);
}
update(1,0,n-1,now);
now=query2(1,0,n-1,nn+1);
}
printf("%s %d\n",p[now],tab[f[n]]);
}
return 0;
}
POJ-2886 Who Gets the Most Candies?(线段树+模拟)的更多相关文章
- 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? 线段树。。还有方向感
这道题不仅仅是在考察线段树,还他妹的在考察一个人的方向感.... 和线段树有关的那几个函数写了一遍就对了,连改都没改,一直在转圈的问题的出错.... 题意:从第K个同学开始,若K的数字为正 则往右转, ...
- POJ 2886 Who Gets the Most Candies? 线段树
题目: http://poj.org/problem?id=2886 左右转的果断晕,题目不难,关键是准确的转啊转.因为题目要求输出约数个数最多的数,所以预处理[1,500000]的约数的个数就行了. ...
- poj 2886 "Who Gets The Most Candies?"(树状数组)
传送门 参考资料: [1]:http://www.hankcs.com/program/algorithm/poj-2886-who-gets-the-most-candies.html 题意: 抢糖 ...
- 线段树(单点更新) POJ 2886 Who Gets the Most Candies?
题目传送门 #include <cstdio> #include <cstring> #define lson l, m, rt << 1 #define rson ...
- POJ 2828 Buy Tickets(排队问题,线段树应用)
POJ 2828 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意: 排队买票时候插队. 给出一些数对,分别代表某个人的想要插入的位 ...
- hdu_5818_Joint Stacks(线段树模拟)
题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...
- 【CF280D】 k-Maximum Subsequence Sum ,线段树模拟费用流
昨天考试被教育了一波.为了学习一下\(T3\)的科技,我就找到了这个远古时期的\(cf\)题(虽然最后\(T3\)还是不会写吧\(QAQ\)) 顾名思义,这个题目其实可以建成一个费用流的模型.我们用流 ...
- 2019牛客暑期多校训练营(第八场)E:Explorer(LCT裸题 也可用线段树模拟并查集维护连通性)
题意:给定N,M,然后给出M组信息(u,v,l,r),表示u到v有[l,r]范围的通行证有效.问有多少种通行证可以使得1和N连通. 思路:和bzoj魔法森林有点像,LCT维护最小生成树. 开始和队友 ...
随机推荐
- C++全局变量在多个源代码文件中的使用
在比较大的项目中,如果需要使用全局变量,那么就需要注意一些全局变量声明.使用不当引起的问题了. 本篇文章主要内容有两个:普通全局变量.静态全局变量.全局常量. 1.普通全局变量:假设我们需要在多个不同 ...
- C# MP3文件属性读取
using (TempFile tempFile = new TempFile()) { using (FileStream fs = new FileStream(tempFile.FileName ...
- 生成1~n的全排列
输入正整数n,输出n的全排列. 样例输入1: 3 样例输出1: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 分析: 按字典序从小到大的顺序输出所有的排列. (字典序:两个序 ...
- hdu4597 区间dp
//Accepted 1784 KB 78 ms //区间dp //dp[l1][r1][l2][r2] 表示a数列从l1到r1,b数列从l2到r2能得到的最大分值 // #include <c ...
- 详解模块定义(.def)文件
一个完整的Windows应用程序(C++程序)通常由五种类型的文件组成:源程序文件,头文件,资源描述文件,项目文件,模块定义文件.本文主要讲解模块定义文件. 模块定义 (.def)文件为链接器提供有关 ...
- CentOS中vsftp安装与配置
http://blog.chinaunix.net/uid-7271021-id-3086186.html 553 Could not create file 解决办法 [root@localhost ...
- 刷固件Layer1到手机FLASH(硬刷)
开头: 注意:本文章并不是做GSM 嗅探必须的,平时我们刷机叫软刷是刷到内存里面的,断电就消失了,这个是硬刷,刷到flash里面的,断电不消失,开机就运行的. 本文章经过作者实测可行,这只是单个应用程 ...
- linux常用命令:1文件处理命令
文件处理命令 1.命令格式 命令格式:命令 [-选项] [参数] 例:ls -la /etc 说明:1)个别命令使用不遵循此格式 2)档有多个选项时,可以写在一起 3)简化选项与完整选项 2.目录 ...
- asp登陆例子,asp,mssql,登陆
login.aspx文件 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="log ...
- MVC - Code First Migration Command line
当开发MVC应用程序, 使用.NET Entity Framework的Code First model试, 若是需要将model层对象的改动更新进数据库, 需要使用Package Manager C ...