zoukankan      html  css  js  c++  java
  • poj 2886Who Gets the Most Candies?

    题目连接:http://poj.org/problem?id=2886

    这道题是模拟约瑟夫环,其具体实现和poj2826差不多的。

    我的代码如下:

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<memory.h>
    int seg_tree[500010<<2];
    void build_tree(int l,int r,int id);
    void push_tree_up(int id);
    void update_tree(int value,int l,int r,int id);
    int f[500010];
    void get_f();
    int num[500010],h;
    char str[500010][10];
    int cur_n,cur_i,next_i,ans,ans1;
    int main()
    {
        int n,k,i,j,cur,temp;
        //freopen("d:\\2.txt","r",stdin);
        //freopen("d:\\3.txt","w",stdout);
        memset(f,0,sizeof(f));
        get_f();
        while(scanf("%d%d%*c",&n,&k)!=EOF)
        {
            for(i=1;i<=n;i++)
                scanf("%s%d",str[i],num+i);
            cur_n=n;
            cur_i=n;
            next_i=k;
            build_tree(1,n,1);
            ans=0;
            ans1=1;
            h=1;
            for(i=1;i<=n;i++)
            {
            //  printf("cur_i=%d next_i=%d",cur_i,next_i);
                      if(next_i>=0)
                          cur_i--;
                      cur=(cur_i+next_i%cur_n+cur_n)%cur_n;
                  //   printf(" cur=%d\n",cur);
                update_tree(cur+1,1,n,1);
                cur_i=cur;
                h++;
    
    
            }
            printf("%s %d\n",str[ans1],ans);
    
        }
    
    }
    void build_tree(int l,int r,int id)
    {
        if(l==r)
        {
            seg_tree[id]=1;
            return ;
        }
        int mid=(l+r)>>1;
        build_tree(l,mid,id<<1);
        build_tree(mid+1,r,id<<1|1);
        push_tree_up(id);
    }
    void push_tree_up(int id)
    {
        seg_tree[id]=seg_tree[id<<1]+seg_tree[id<<1|1];
    }
    void update_tree(int value,int l,int r,int id)
    {
        if(l==r)
        {
            seg_tree[id]--;
        // printf("tree[id]=%d",seg_tree[id]);
        //    printf("l=%d\n",l);
                next_i=num[l];
            cur_n--;
            if(ans<f[h])
            {
    
            ans=f[h];
            ans1=l;
            }
            return ;
        }
        int mid=l+r>>1;
        if(value<=seg_tree[id<<1])
        {
            update_tree(value,l,mid,id<<1);
        }
        else
        {
            update_tree(value-seg_tree[id<<1],mid+1,r,id<<1|1);
        }
        push_tree_up(id);
    }
    void get_f()
    {
    
        int i,j;
        for(i=1;i<=500000;i++)
        for(j=1;i*j<=500000;j++)
        {
            f[i*j]++;
        }
    }
  • 相关阅读:
    vue-自定义指令
    vue-自定义过滤器--时间
    vue-jsonp
    vue-post
    vue-get-参数
    vue-get
    vue-百度下拉列表
    C#网页授权获取微信Openid
    C#微信环境分享页面给微信好友、朋友圈
    IIS服务器同时使用多个https证书如何操作443端口
  • 原文地址:https://www.cnblogs.com/woaiyy/p/2536715.html
Copyright © 2011-2022 走看看