POJ 2886 Who Gets the Most Candies?(树状数组+二分)
2024-09-06 17:01:38
注意题目中给的顺序是顺时针的,所以在数组中应该是倒着存的。左就是顺时针,右就是逆时针。各种调试之后,终于A了,很多种情况考虑情况。
#include <cstring>
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
char name[][];
int o[];
int p[];
int s[];
int n;
int lowbit(int t)
{
return t&(-t);
}
void insert(int t,int d)
{
while(t <= n)
{
p[t] += d;
t += lowbit(t);
}
}
int getsum(int t)
{
int sum = ;
while(t > )
{
sum += p[t];
t -= lowbit(t);
}
return sum;
}
int find(int x)
{
int str,mid,end,temp;
str = ;end = n;
while(str < end)
{
mid = (str+end)/;
temp = getsum(mid);
if(temp < x)
str = mid + ;
else
end = mid;
}
return str;
}
int main()
{
int i,k,j,maxz,sum,sl,sr,key;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(i = n; i >= ; i --)
{
scanf("%s%d",name[i],&s[i]);
}
for(i = ;i <= n;i ++)
{
p[i] = ;
o[i] = ;
}
for(i = ;i <= n;i ++)
{
for(j = i;j <= n;j += i)
{
o[j] ++;
}
}
maxz = ;
key = ;
for(i = ;i <= n;i ++)
{
if(maxz < o[i])
{
maxz = o[i];
key = i;
}
}
for(i = ; i <= n; i ++)
{
insert(i,);
}
k = n - k + ;
insert(k,-);
sum = n-;
for(i = ;i <= key;i ++)
{
sl = getsum(k);
sr = sum - sl;
if(s[k] > )
{
s[k] = s[k]%sum;
if(s[k] == ) s[k] = sum;
if(sl >= s[k])
k = find(sl-s[k]+);
else
k = find(sum-(s[k]-sl)+);
}
else
{
s[k] = -s[k];
s[k] = (s[k])%sum;
if(s[k] == ) s[k] = sum;
if(sr >= s[k])
k = find(sl+s[k]);
else
k = find(s[k]-sr);
}
insert(k,-);
sum --;
}
printf("%s %d\n",name[k],o[key]+);
}
return ;
}
最新文章
- collection of vim vim tutorial for beginner
- 在Mongoose中使用嵌套的populate处理数据
- A/B 测试之前必须要了解的 10 件事
- Github Bash
- markdown下编辑latex数学公式
- IDEA14 Ultimate Edition注册码
- tap,touch,touchstart,事件与click事件的区别
- java自动化测试-http请求结合抓包工具实际应用
- 设置radio选中
- FINS/TCP_OMRON(1)
- ubuntu18.04静态ip设置
- Hadoop学习笔记01_Hadoop搭建
- thinkphp 随笔
- oracle 锁表查看与解锁
- MATLAB 的函数句柄
- opencv图片转幻灯片视频
- C# 通过Exchange server 发送邮件
- Castle ActiveRecord学习(八)事务
- C#枚举(enum)、常量(const)和readonly
- java代码用户界面网格布局GridLayout.划分为格子区域