zoukankan      html  css  js  c++  java
  • POJ 2886.Who Gets the Most Candies? -线段树(单点更新、类约瑟夫问题)

    线段树可真有意思呢续集2。。。

    区间成段的替换和增减,以及区间求和等,其中夹杂着一些神奇的操作,数据离散化,简单hash,区间异或,还需要带着脑子来写题。

    有的题目对数据的操作并不是直接按照题面意思进行操作,而是换一个角度,通过对其他数据的操作得到结果,感觉真的是。。。啊啊啊啊啊啊,我的脑子离家出走了,他在哪啊(ಥ_ಥ)ru

    写到后面的题目就感觉满满的都是套路,只要想到怎样处理数据以及如果通过线段树维护数据就可以,但是就是这个是关键(废话。。。),嘤嘤嘤,一拳一个嘤嘤怪,好好写题解。。。

    POJ2886.Who Gets the Most Candies?

    这个题可以偷懒一下,先找出n个数中第几个数的小孩能得到最多的糖果,for循环跑一遍找出来最大的h,很多人是用反素数写的因数个数,然而,并没有懂,直接跑一遍for就可以的吧。。。

    然后只需要对线段树进行h次操作就可以了。因为每次操作的pos不确定,所以需要实时更新pos,取模的mod也是实时变化的,但是tree[1]中存了这个值,所以直接每次操作完重新给mod赋值tree[1]就可以。因为分向左还是向右,所以操作要注意。我就是这里出了问题。关于约瑟夫问题,具体的不介绍,自行百度吧。

    这个题和插队的问题差不多,都需要带着脑子写,这些应该都是经典的线段树的题目吧。

    好菜啊,为什么我这么菜。。。

    代码:

     1 //F
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<cstdlib>
     8 #include<queue>
     9 #include<stack>
    10 using namespace std;
    11 typedef long long ll;
    12 const int inf=0x3f3f3f3f;
    13 const double eps=1e-5;
    14 const int maxn=5*1e5+10;
    15 #define lson l,m,rt<<1
    16 #define rson m+1,r,rt<<1|1
    17 struct node{
    18     char na[10];
    19     int num;
    20 }a[maxn];
    21 int tree[maxn<<2],ans[maxn];
    22 int n,time;
    23 void init()
    24 {
    25     memset(ans,0,sizeof(ans));
    26     int cnt=(int)sqrt(n*1.0);
    27     for(int i=1;i<=cnt;i++)
    28     {
    29         for(int j=i+1;j*i<=n;j++)
    30             ans[j*i]+=2;
    31         ans[i*i]++;
    32     }
    33     int maxx=ans[1];
    34     time=1;
    35     for(int i=2;i<=n;i++)
    36     {
    37         if(ans[i]>maxx)
    38         {
    39             maxx=ans[i];
    40             time=i;
    41         }
    42     }
    43 }
    44 void build(int l,int r,int rt)
    45 {
    46     tree[rt]=r-l+1;
    47     if(l==r){
    48         return ;
    49     }
    50 
    51     int m=(l+r)>>1;
    52     build(lson);
    53     build(rson);
    54 }
    55 int update(int pos,int l,int r,int rt)
    56 {
    57     tree[rt]--;
    58     if(l==r){
    59         return l;
    60     }
    61 
    62     int m=(l+r)>>1;
    63     if(pos<=tree[rt<<1]) return update(pos,lson);
    64     else return update(pos-tree[rt<<1],rson);
    65 }
    66 int main()
    67 {
    68     int k,mod;
    69     while(~scanf("%d%d",&n,&k))
    70     {
    71         init();
    72         for(int i=1;i<=n;i++)
    73             scanf("%s%d",&a[i].na,&a[i].num);
    74         build(1,n,1);
    75         int pos=0;a[pos].num=0;
    76         mod=tree[1];
    77         int h=time;
    78         while(h--)
    79         {
    80             if(a[pos].num>0)
    81                 k=((k-1+a[pos].num-1)%mod+mod)%mod+1;
    82             else
    83                 k=((k-1+a[pos].num)%mod+mod)%mod+1;
    84             pos =update(k,1,n,1);
    85             mod=tree[1];
    86         }
    87         printf("%s %d
    ",a[pos].na,ans[time]);
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    vue中使用better-scroll实现滑动效果
    better-scroll一个好用的页面滑动工具
    display:table和display:table-cell结合使用
    大小图片
    axios的使用
    vue中两种路由跳转拼接参数
    Android 核心分析 之七Service深入分析
    Android 核心分析 之六 IPC框架分析 Binder,Service,Service manager
    Android 核心分析 之五基本空间划分
    Android核心分析之四手机的软件形态
  • 原文地址:https://www.cnblogs.com/ZERO-/p/9325692.html
Copyright © 2011-2022 走看看