传送门:Josephus Problem

题意:经典约瑟夫问题,有n个人,每次数到第k个人出列,求剩下的最后一人。

分析:用线段树模拟约瑟夫问题,记录区间的减少情况,然后根据每次数到的人在区间排第几位,线段树log(n)找到并更新,总复杂度为O(nlog(n))。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 100010
#define mod 1000000007
#define LL long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int n,k;
int sum[N<<],vis[N];
void Pushup(int rt)
{
int ls=rt<<,rs=ls|;
sum[rt]=sum[ls]+sum[rs];
}
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=;return;
}
int m=(l+r)>>;
build(lson);
build(rson);
Pushup(rt);
}
void update(int num,int l,int r,int rt)
{
if(l==r)
{
vis[l]=;
sum[rt]=;
return;
}
int m=(l+r)>>;
if(num<=sum[rt<<])update(num,lson);
else update(num-sum[rt<<],rson);
Pushup(rt);
}
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
memset(vis,,sizeof(vis));
build(,n,);
int num=;
for(int i=n;i>;i--)
{
num=(num+k-)%i;
if(num==)num=i;
update(num,,n,);
}
for(int i=;i<=n;i++)
if(!vis[i])
{
printf("Case %d: %d\n",cas++,i);break;
}
}
}

最新文章

  1. 【转】Mysql联合查询union和union all的使用介绍
  2. Object-C中代码如何分离接口和实现
  3. bzoj2946: [Poi2000]公共串
  4. Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作
  5. HP SAN Switch光纖交換機命令行畫zone
  6. OpenCV 3.1 StereoBM 获取正确视差Dispariy
  7. WIN8 下Cisco VPN连接 出现vpn 422 failed to enable virtual adapter错误
  8. 自动发牌(C#版)
  9. Android多媒体--MediaCodec的实例化方法
  10. PHP程序猿必须学习的第二课——站点安全问题预防
  11. 使用Netsil监控Kubernetes上的微服务
  12. es6+require混合开发,兼容es6 module,import,export之 加载css及公用date-main
  13. Android项目目录结构
  14. Git常用命令(二)------ 远程库操作
  15. Android的Binder的起源-android学习之旅(100)
  16. 读取FTP 图片文件,并显示,非下载
  17. 微信小程序——报错汇总
  18. Redis简介与Memcached的比较
  19. node.js express 4.x 安装指南 (找了很久呀,痛苦之路)
  20. Python Flask 多环境配置

热门文章

  1. MySQL主键添加/删除
  2. Windows下sass的安装
  3. Jquery中的$().each,$.each的区别
  4. C# - MemoryStream
  5. UIViewController加载过程
  6. Research notes for Scientific Writing
  7. svn 标示提示
  8. 使用POI来实现对Excel的读写操作
  9. asp.net2.0安全性(3)--验证与授权--转载来自车老师
  10. HTML+CSS+JS - 5秒钟之后跳转页面