程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 約瑟夫問題(線段樹)

約瑟夫問題(線段樹)

編輯:C++入門知識

// File Name: wiki1282.cpp   
// Author: bo_jwolf   
// Created Time: 2013年08月17日 星期六 10時24分52秒   
  
#include<vector>   
#include<list>   
#include<map>   
#include<set>   
#include<deque>   
#include<stack>   
#include<bitset>   
#include<algorithm>   
#include<functional>   
#include<numeric>   
#include<utility>   
#include<sstream>   
#include<iostream>   
#include<iomanip>   
#include<cstdio>   
#include<cmath>   
#include<cstdlib>   
#include<cstring>   
#include<ctime>   
  
using namespace std;  
#define maxn 30005   
#define lson l , m , rt << 1    
#define rson m + 1 , r , rt << 1 | 1    
int sum[ maxn << 2 ] ;  
void PushUp( int rt )  
{  
    sum[ rt ] = sum[ rt << 1 ] + sum[ rt << 1 | 1 ] ;  
}  
  
void build( int l , int r , int rt )  
{  
    sum[ rt ] = r - l + 1 ;  
    if( l == r )  
        return ;  
    int m = ( l + r ) >>  1 ;  
    build( lson ) ;  
    build( rson ) ;  
}  
  
int query( int p , int l , int r , int rt )  
{  
    if( l == r )  
    {  
        sum[ rt ] = 0 ;  
        return l ;  
    }  
    int m = ( l + r ) >> 1 ;  
    int ans  ;  
    if( sum[ rt << 1 ] >= p )  
        ans =  query( p , lson ) ;  
    else  
        ans = query( ( p - sum[ rt << 1 ] ) , rson ) ;  
    PushUp( rt ) ;  
    return ans ;  
}  
  
int main()  
{  
    int n , k ;  
    cin >> n >> k ;  
    build( 1 , n , 1 ) ;  
    int temp = k ;  
    for( int i = 1 ; i <= n ; ++i )  
    {  
        if( i != n )  
            cout << query( temp , 1 , n , 1 ) << " ";  
        else  
            cout << query( temp , 1 , n , 1 ) ;  
        if( i != n )  
            temp = ( temp + k - 1 ) % ( n - i ) ;  
        if( temp == 0 )  
            temp = n - i ;  
    }  
return 0;  
}  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved