博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「模拟8.23」one递推,约瑟夫
阅读量:5337 次
发布时间:2019-06-15

本文共 1287 字,大约阅读时间需要 4 分钟。

这样大概就是板子问题了

考场的树状数组+二分的60分暴力???

 

1 #include
2 #define int long long 3 #define MAXN 11000001 4 int c[MAXN]; 5 int lowbit(int x){
return x&(-x);}int n; 6 void add(int x,int k) 7 { 8 for(int i=x;i<=n;i+=lowbit(i)) 9 {10 c[i]+=k;11 }12 }13 int query(int x)14 {15 int ans=0;16 for(int i=x;i>=1;i-=lowbit(i))ans+=c[i];17 return ans;18 }19 int second_divied(int l,int r,int x,int last_rs)20 {21 22 while(l+1
>1;25 if(query(mid)-last_rs
=cir)52 {53 pos=second_divied(pos+1,n,cir,last_rs);54 add(pos,-1); 55 pos=find(pos); 56 }57 else if(now_rs-last_rs
View Code

 

 

 

对于约瑟夫问题

我们可以知道最后的人一定是升到最后的,他在新的队伍里的编号是零(因为只有一个人,从零开始编号)

然后我们从后往前递推,考虑最后胜利者在上一层的编号直到最后编号

我们假设当前层为4,编号为3

那么在上一层时因为干掉了一个人,那么就从干掉的人的后一个开始编号

所以上一层是在位置6

这样我们得到f[i]表示在第i次操作后胜利者所处的编号

然后就简单了

 

#include
#define MAXN 10000001using namespace std;int T;int n;int ans=0;signed main(){ scanf("%d",&T); while(T--) { scanf("%d",&n); ans=0; for(int i=n-1;i>=1;--i) { ans=(ans+i)%(n-i+1); } printf("%d\n",ans+1); }}

 

转载于:https://www.cnblogs.com/Wwb123/p/11399763.html

你可能感兴趣的文章
微软职位内部推荐-Sr. SE - Office incubation
查看>>
C#类与结构体究竟谁快——各种函数调用模式速度评测
查看>>
我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
查看>>
poj 题目分类
查看>>
windows 安装yaml支持和pytest支持等
查看>>
读书笔记:季羡林关于如何做研究学问的心得
查看>>
面向对象的优点
查看>>
套接口和I/O通信
查看>>
阿里巴巴面试之利用两个int值实现读写锁
查看>>
浅谈性能测试
查看>>
Winform 菜单和工具栏控件
查看>>
CDH版本大数据集群下搭建的Hue详细启动步骤(图文详解)
查看>>
巧用Win+R
查看>>
浅析原生js模仿addclass和removeclass
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
深入理解jQuery框架-框架结构
查看>>
YUI3自动加载树实现
查看>>
python知识思维导图
查看>>
当心JavaScript奇葩的逗号表达式
查看>>