int seq = 1;
for(int i = 0 ; i < n ; i++)
{
seq = (seq + m - 1) % sum[1];//seq 只是相对位置
if(seq == 0) seq = sum[1];
cout<<"seq = "<<seq<<"; ";
pos = update(seq,1);
cout<<pos<<" ";
}
seq表示的只是约瑟夫环中的相对位置,然后调用update函数去寻找环中的绝对位置。
int update(int p,int rt)
{
sum[rt] --;
if(tree[rt][0] == tree[rt][1])
{
sum[rt] = 0;
return tree[rt][0];//从绝对位置剔除
}
if(p <= sum[rt<<1]) return update(p,rt<<1);
else return update(p-sum[rt<<1],rt<<1|1);
PushUp(rt);
}
注意当seq = 0的时候seq = sum[1]
#include<iostream>
using namespace std;
int s,t;
struct data{
long long sum;
}tree[300010]; int seq=1;int pos;
void build(int l,int r,int root)
{
if (l==r)
{ int x;
tree[root].sum=1;
return;
}
int mid=(l+r)/2;
build(l,mid,root*2);
build(mid+1,r,root*2+1);
tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
}
int add(int l,int r,int root)
{ int sum=0;
if (l==r)
{
}
int mid=(l+r)/2;
if (s<=mid)
add(l,mid,root*2);
else
add(mid+1,r,root*2+1);
tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
}
void zd(int l,int r,int root)
{
if (l==r)
{ pos=l;
tree[root].sum=0;
return;
}
int mid=(l+r)/2;
if (seq<=tree[root*2].sum)
{
zd(l,mid,root*2);
}
else
{ seq-=tree[root*2].sum;
zd(mid+1,r,root*2+1);
seq+=tree[root*2].sum;
}
tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;
}
int main()
{ int n,m;
cin>>n>>m;
build(1,n,1);
for (int i=1;i<=n;++i)
{ seq=(seq+m-1)%tree[1].sum;
if (!seq)
seq=tree[1].sum;
zd(1,n,1);
cout<<pos<<" ";
}
}